Merge lp:~nataliabidart/magicicada-gui/bind-more-signals into lp:magicicada-gui
- bind-more-signals
- Merge into trunk
Proposed by
Natalia Bidart
Status: | Merged | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Approved by: | Facundo Batista | ||||||||||||||||
Approved revision: | 24 | ||||||||||||||||
Merged at revision: | 20 | ||||||||||||||||
Proposed branch: | lp:~nataliabidart/magicicada-gui/bind-more-signals | ||||||||||||||||
Merge into: | lp:magicicada-gui | ||||||||||||||||
Diff against target: |
820 lines (+525/-96) 3 files modified
data/media/active.svg (+203/-0) magicicada/__init__.py (+56/-50) magicicada/tests/test_magicicada.py (+266/-46) |
||||||||||||||||
To merge this branch: | bzr merge lp:~nataliabidart/magicicada-gui/bind-more-signals | ||||||||||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Facundo Batista | Approve | ||
Review via email: mp+25813@code.launchpad.net |
Commit message
Description of the change
Binding callbacks for started/stopped, connected/
To post a comment you must log in.
- 24. By Natalia Bidart
-
Tweaks.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added file 'data/media/active-016.png' | |||
2 | 0 | Binary files data/media/active-016.png 1970-01-01 00:00:00 +0000 and data/media/active-016.png 2010-05-22 03:21:24 +0000 differ | 0 | Binary files data/media/active-016.png 1970-01-01 00:00:00 +0000 and data/media/active-016.png 2010-05-22 03:21:24 +0000 differ |
3 | === added file 'data/media/active.svg' | |||
4 | --- data/media/active.svg 1970-01-01 00:00:00 +0000 | |||
5 | +++ data/media/active.svg 2010-05-22 03:21:24 +0000 | |||
6 | @@ -0,0 +1,203 @@ | |||
7 | 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
8 | 2 | <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||
9 | 3 | |||
10 | 4 | <svg | ||
11 | 5 | xmlns:dc="http://purl.org/dc/elements/1.1/" | ||
12 | 6 | xmlns:cc="http://creativecommons.org/ns#" | ||
13 | 7 | xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||
14 | 8 | xmlns:svg="http://www.w3.org/2000/svg" | ||
15 | 9 | xmlns="http://www.w3.org/2000/svg" | ||
16 | 10 | xmlns:xlink="http://www.w3.org/1999/xlink" | ||
17 | 11 | xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
18 | 12 | xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
19 | 13 | width="425.71429" | ||
20 | 14 | height="461.42856" | ||
21 | 15 | id="svg2" | ||
22 | 16 | sodipodi:version="0.32" | ||
23 | 17 | inkscape:version="0.47 r22583" | ||
24 | 18 | version="1.0" | ||
25 | 19 | sodipodi:docname="active.svg" | ||
26 | 20 | inkscape:output_extension="org.inkscape.output.svg.inkscape"> | ||
27 | 21 | <defs | ||
28 | 22 | id="defs4"> | ||
29 | 23 | <linearGradient | ||
30 | 24 | id="linearGradient3250"> | ||
31 | 25 | <stop | ||
32 | 26 | style="stop-color:#b8b8b8;stop-opacity:0;" | ||
33 | 27 | offset="0" | ||
34 | 28 | id="stop3252" /> | ||
35 | 29 | <stop | ||
36 | 30 | id="stop3258" | ||
37 | 31 | offset="0.40588239" | ||
38 | 32 | style="stop-color:#b8b8b8;stop-opacity:1;" /> | ||
39 | 33 | <stop | ||
40 | 34 | style="stop-color:#b8b8b8;stop-opacity:0;" | ||
41 | 35 | offset="1" | ||
42 | 36 | id="stop3254" /> | ||
43 | 37 | </linearGradient> | ||
44 | 38 | <linearGradient | ||
45 | 39 | id="linearGradient3224"> | ||
46 | 40 | <stop | ||
47 | 41 | style="stop-color:#ffffff;stop-opacity:1;" | ||
48 | 42 | offset="0" | ||
49 | 43 | id="stop3226" /> | ||
50 | 44 | <stop | ||
51 | 45 | style="stop-color:#c8c8c8;stop-opacity:1;" | ||
52 | 46 | offset="1" | ||
53 | 47 | id="stop3228" /> | ||
54 | 48 | </linearGradient> | ||
55 | 49 | <linearGradient | ||
56 | 50 | id="linearGradient3214"> | ||
57 | 51 | <stop | ||
58 | 52 | style="stop-color:#3b3b3b;stop-opacity:1;" | ||
59 | 53 | offset="0" | ||
60 | 54 | id="stop3216" /> | ||
61 | 55 | <stop | ||
62 | 56 | style="stop-color:#afafaf;stop-opacity:1;" | ||
63 | 57 | offset="1" | ||
64 | 58 | id="stop3218" /> | ||
65 | 59 | </linearGradient> | ||
66 | 60 | <linearGradient | ||
67 | 61 | id="linearGradient3176"> | ||
68 | 62 | <stop | ||
69 | 63 | style="stop-color:#c1ffb6;stop-opacity:1;" | ||
70 | 64 | offset="0" | ||
71 | 65 | id="stop3178" /> | ||
72 | 66 | <stop | ||
73 | 67 | id="stop3184" | ||
74 | 68 | offset="0.40630153" | ||
75 | 69 | style="stop-color:#00e632;stop-opacity:1;" /> | ||
76 | 70 | <stop | ||
77 | 71 | style="stop-color:#1c3a4f;stop-opacity:1" | ||
78 | 72 | offset="1" | ||
79 | 73 | id="stop3180" /> | ||
80 | 74 | </linearGradient> | ||
81 | 75 | <inkscape:perspective | ||
82 | 76 | sodipodi:type="inkscape:persp3d" | ||
83 | 77 | inkscape:vp_x="0 : 526.18109 : 1" | ||
84 | 78 | inkscape:vp_y="0 : 1000 : 0" | ||
85 | 79 | inkscape:vp_z="744.09448 : 526.18109 : 1" | ||
86 | 80 | inkscape:persp3d-origin="372.04724 : 350.78739 : 1" | ||
87 | 81 | id="perspective10" /> | ||
88 | 82 | <inkscape:perspective | ||
89 | 83 | id="perspective2390" | ||
90 | 84 | inkscape:persp3d-origin="372.04724 : 350.78739 : 1" | ||
91 | 85 | inkscape:vp_z="744.09448 : 526.18109 : 1" | ||
92 | 86 | inkscape:vp_y="0 : 1000 : 0" | ||
93 | 87 | inkscape:vp_x="0 : 526.18109 : 1" | ||
94 | 88 | sodipodi:type="inkscape:persp3d" /> | ||
95 | 89 | <radialGradient | ||
96 | 90 | inkscape:collect="always" | ||
97 | 91 | xlink:href="#linearGradient3176" | ||
98 | 92 | id="radialGradient3182" | ||
99 | 93 | cx="346.42856" | ||
100 | 94 | cy="338.07645" | ||
101 | 95 | fx="346.42856" | ||
102 | 96 | fy="338.07645" | ||
103 | 97 | r="165.71428" | ||
104 | 98 | gradientUnits="userSpaceOnUse" | ||
105 | 99 | gradientTransform="matrix(-1.2831103,0.3438084,-0.3438084,-1.2831103,907.16815,652.76078)" /> | ||
106 | 100 | <radialGradient | ||
107 | 101 | inkscape:collect="always" | ||
108 | 102 | xlink:href="#linearGradient3214" | ||
109 | 103 | id="radialGradient3220" | ||
110 | 104 | cx="317.60519" | ||
111 | 105 | cy="539.41315" | ||
112 | 106 | fx="317.60519" | ||
113 | 107 | fy="539.41315" | ||
114 | 108 | r="165.53342" | ||
115 | 109 | gradientTransform="matrix(1,0,0,0.2054734,0,428.57808)" | ||
116 | 110 | gradientUnits="userSpaceOnUse" /> | ||
117 | 111 | <radialGradient | ||
118 | 112 | inkscape:collect="always" | ||
119 | 113 | xlink:href="#linearGradient3224" | ||
120 | 114 | id="radialGradient3230" | ||
121 | 115 | cx="317.60394" | ||
122 | 116 | cy="220.94547" | ||
123 | 117 | fx="317.60394" | ||
124 | 118 | fy="220.94547" | ||
125 | 119 | r="164.06058" | ||
126 | 120 | gradientTransform="matrix(1.0076229,0,0,0.1968921,-2.4553843,177.59098)" | ||
127 | 121 | gradientUnits="userSpaceOnUse" /> | ||
128 | 122 | <linearGradient | ||
129 | 123 | inkscape:collect="always" | ||
130 | 124 | xlink:href="#linearGradient3250" | ||
131 | 125 | id="linearGradient3256" | ||
132 | 126 | x1="318.47412" | ||
133 | 127 | y1="651.00037" | ||
134 | 128 | x2="309.90268" | ||
135 | 129 | y2="413.85742" | ||
136 | 130 | gradientUnits="userSpaceOnUse" | ||
137 | 131 | spreadMethod="pad" /> | ||
138 | 132 | <radialGradient | ||
139 | 133 | inkscape:collect="always" | ||
140 | 134 | xlink:href="#linearGradient3214" | ||
141 | 135 | id="radialGradient3274" | ||
142 | 136 | gradientUnits="userSpaceOnUse" | ||
143 | 137 | gradientTransform="matrix(1,0,0,0.2054734,11.428571,428.57808)" | ||
144 | 138 | cx="317.60519" | ||
145 | 139 | cy="539.41315" | ||
146 | 140 | fx="317.60519" | ||
147 | 141 | fy="539.41315" | ||
148 | 142 | r="165.53342" /> | ||
149 | 143 | <radialGradient | ||
150 | 144 | inkscape:collect="always" | ||
151 | 145 | xlink:href="#linearGradient3224" | ||
152 | 146 | id="radialGradient3276" | ||
153 | 147 | gradientUnits="userSpaceOnUse" | ||
154 | 148 | gradientTransform="matrix(1.0076229,0,0,0.1922742,8.9731871,177.85367)" | ||
155 | 149 | cx="317.60394" | ||
156 | 150 | cy="220.94547" | ||
157 | 151 | fx="317.60394" | ||
158 | 152 | fy="220.94547" | ||
159 | 153 | r="164.06058" /> | ||
160 | 154 | </defs> | ||
161 | 155 | <sodipodi:namedview | ||
162 | 156 | id="base" | ||
163 | 157 | pagecolor="#ffffff" | ||
164 | 158 | bordercolor="#666666" | ||
165 | 159 | borderopacity="1.0" | ||
166 | 160 | gridtolerance="10000" | ||
167 | 161 | guidetolerance="10" | ||
168 | 162 | objecttolerance="10" | ||
169 | 163 | inkscape:pageopacity="0.0" | ||
170 | 164 | inkscape:pageshadow="2" | ||
171 | 165 | inkscape:zoom="0.70710678" | ||
172 | 166 | inkscape:cx="577.43933" | ||
173 | 167 | inkscape:cy="433.43027" | ||
174 | 168 | inkscape:document-units="px" | ||
175 | 169 | inkscape:current-layer="layer1" | ||
176 | 170 | showgrid="false" | ||
177 | 171 | inkscape:window-width="1250" | ||
178 | 172 | inkscape:window-height="775" | ||
179 | 173 | inkscape:window-x="0" | ||
180 | 174 | inkscape:window-y="0" | ||
181 | 175 | inkscape:window-maximized="1" /> | ||
182 | 176 | <metadata | ||
183 | 177 | id="metadata7"> | ||
184 | 178 | <rdf:RDF> | ||
185 | 179 | <cc:Work | ||
186 | 180 | rdf:about=""> | ||
187 | 181 | <dc:format>image/svg+xml</dc:format> | ||
188 | 182 | <dc:type | ||
189 | 183 | rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||
190 | 184 | </cc:Work> | ||
191 | 185 | </rdf:RDF> | ||
192 | 186 | </metadata> | ||
193 | 187 | <g | ||
194 | 188 | inkscape:label="Layer 1" | ||
195 | 189 | inkscape:groupmode="layer" | ||
196 | 190 | id="layer1" | ||
197 | 191 | transform="translate(-105.61697,-158.14316)"> | ||
198 | 192 | <path | ||
199 | 193 | sodipodi:type="arc" | ||
200 | 194 | style="opacity:1;fill:url(#radialGradient3182);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
201 | 195 | id="path2396" | ||
202 | 196 | sodipodi:cx="323.57144" | ||
203 | 197 | sodipodi:cy="389.50504" | ||
204 | 198 | sodipodi:rx="165.71428" | ||
205 | 199 | sodipodi:ry="165.71428" | ||
206 | 200 | d="m 489.28572,389.50504 c 0,91.52146 -74.19281,165.71427 -165.71428,165.71427 -91.52147,0 -165.71428,-74.19281 -165.71428,-165.71427 0,-91.52147 74.19281,-165.71428 165.71428,-165.71428 91.52147,0 165.71428,74.19281 165.71428,165.71428 z" | ||
207 | 201 | transform="translate(5.643371,-11.272676)" /> | ||
208 | 202 | </g> | ||
209 | 203 | </svg> | ||
210 | 0 | 204 | ||
211 | === modified file 'magicicada/__init__.py' | |||
212 | --- magicicada/__init__.py 2010-05-17 16:10:28 +0000 | |||
213 | +++ magicicada/__init__.py 2010-05-22 03:21:24 +0000 | |||
214 | @@ -28,8 +28,8 @@ | |||
215 | 28 | from twisted.internet import gtk2reactor # for gtk-2.0 | 28 | from twisted.internet import gtk2reactor # for gtk-2.0 |
216 | 29 | gtk2reactor.install() | 29 | gtk2reactor.install() |
217 | 30 | 30 | ||
218 | 31 | from magicicada import syncdaemon | ||
219 | 31 | from magicicada.helpers import get_data_file, get_builder, NO_OP | 32 | from magicicada.helpers import get_data_file, get_builder, NO_OP |
220 | 32 | from magicicada.syncdaemon import SyncDaemon | ||
221 | 33 | 33 | ||
222 | 34 | CONTENT_QUEUE = 'content' | 34 | CONTENT_QUEUE = 'content' |
223 | 35 | META_QUEUE = 'meta' | 35 | META_QUEUE = 'meta' |
224 | @@ -42,7 +42,8 @@ | |||
225 | 42 | 'online': _('Service reached Nirvana.'), | 42 | 'online': _('Service reached Nirvana.'), |
226 | 43 | } | 43 | } |
227 | 44 | 44 | ||
229 | 45 | def __init__(self, launchpad_available=False, on_destroy=NO_OP): | 45 | def __init__(self, launchpad_available=False, on_destroy=NO_OP, |
230 | 46 | syncdaemon_class=syncdaemon.SyncDaemon): | ||
231 | 46 | """Init.""" | 47 | """Init.""" |
232 | 47 | self.builder = get_builder('gui.glade') | 48 | self.builder = get_builder('gui.glade') |
233 | 48 | self.builder.connect_signals(self) | 49 | self.builder.connect_signals(self) |
234 | @@ -59,8 +60,8 @@ | |||
235 | 59 | 60 | ||
236 | 60 | animation_filename = get_data_file('media', 'loader-ball.gif') | 61 | animation_filename = get_data_file('media', 'loader-ball.gif') |
237 | 61 | self.loading_animation = gtk.gdk.PixbufAnimation(animation_filename) | 62 | self.loading_animation = gtk.gdk.PixbufAnimation(animation_filename) |
240 | 62 | 63 | active_filename = get_data_file('media', 'active-016.png') | |
241 | 63 | self.started = self.connected = self.online = False | 64 | self.active_indicator = gtk.gdk.pixbuf_new_from_file(active_filename) |
242 | 64 | 65 | ||
243 | 65 | widgets = ( | 66 | widgets = ( |
244 | 66 | 'start', 'stop', 'connect', 'disconnect', # toolbar buttons | 67 | 'start', 'stop', 'connect', 'disconnect', # toolbar buttons |
245 | @@ -81,16 +82,26 @@ | |||
246 | 81 | 82 | ||
247 | 82 | self.main_window.show() | 83 | self.main_window.show() |
248 | 83 | 84 | ||
250 | 84 | self.sd = SyncDaemon() | 85 | self.sd = syncdaemon_class() |
251 | 86 | self.sd.on_started_callback = self.on_started | ||
252 | 87 | self.sd.on_stopped_callback = self.on_stopped | ||
253 | 88 | self.sd.on_connected_callback = self.on_connected | ||
254 | 89 | self.sd.on_disconnected_callback = self.on_disconnected | ||
255 | 90 | self.sd.on_online_callback = self.on_online | ||
256 | 91 | self.sd.on_offline_callback = self.on_offline | ||
257 | 92 | self.sd.status_changed_callback = self.on_status_changed | ||
258 | 85 | self.sd.content_queue_changed_callback = self.on_content_queue_changed | 93 | self.sd.content_queue_changed_callback = self.on_content_queue_changed |
259 | 86 | self.sd.meta_queue_changed_callback = self.on_meta_queue_changed | 94 | self.sd.meta_queue_changed_callback = self.on_meta_queue_changed |
260 | 87 | 95 | ||
261 | 96 | self.widget_enabled = lambda w: \ | ||
262 | 97 | w.get_property('visible') and w.is_sensitive() | ||
263 | 98 | |||
264 | 88 | # GTK callbacks | 99 | # GTK callbacks |
265 | 89 | 100 | ||
266 | 90 | def on_main_window_destroy(self, widget, data=None): | 101 | def on_main_window_destroy(self, widget, data=None): |
267 | 91 | """Called when the MagicicadaWindow is closed.""" | 102 | """Called when the MagicicadaWindow is closed.""" |
268 | 92 | # Clean up code for saving application state should be added here. | 103 | # Clean up code for saving application state should be added here. |
270 | 93 | if self.started: | 104 | if self.widget_enabled(self.stop): |
271 | 94 | self.on_stop_clicked(self.stop) | 105 | self.on_stop_clicked(self.stop) |
272 | 95 | self.sd.shutdown() | 106 | self.sd.shutdown() |
273 | 96 | self.on_destroy() | 107 | self.on_destroy() |
274 | @@ -106,46 +117,39 @@ | |||
275 | 106 | 117 | ||
276 | 107 | def on_start_clicked(self, widget, data=None): | 118 | def on_start_clicked(self, widget, data=None): |
277 | 108 | """Start syncdaemon.""" | 119 | """Start syncdaemon.""" |
280 | 109 | self.started = True | 120 | self.sd.start() |
279 | 110 | self.connect.set_sensitive(True) | ||
281 | 111 | self.start.hide() | 121 | self.start.hide() |
282 | 122 | self.stop.set_sensitive(False) | ||
283 | 112 | self.stop.show() | 123 | self.stop.show() |
286 | 113 | 124 | self.start_loading(self.is_started) | |
285 | 114 | self.doing_something(self.is_started) | ||
287 | 115 | 125 | ||
288 | 116 | def on_stop_clicked(self, widget, data=None): | 126 | def on_stop_clicked(self, widget, data=None): |
289 | 117 | """Stop syncdaemon.""" | 127 | """Stop syncdaemon.""" |
293 | 118 | assert self.started | 128 | if self.widget_enabled(self.disconnect): |
291 | 119 | |||
292 | 120 | if self.connected: | ||
294 | 121 | self.on_disconnect_clicked(self.disconnect) | 129 | self.on_disconnect_clicked(self.disconnect) |
295 | 122 | self.connect.set_sensitive(False) | 130 | self.connect.set_sensitive(False) |
296 | 123 | 131 | ||
297 | 124 | self.started = False | ||
298 | 125 | self.start.show() | 132 | self.start.show() |
299 | 133 | self.start.set_sensitive(False) | ||
300 | 126 | self.stop.hide() | 134 | self.stop.hide() |
301 | 127 | 135 | ||
303 | 128 | self.on_stopped() | 136 | self.sd.quit() |
304 | 129 | 137 | ||
305 | 130 | def on_connect_clicked(self, widget, data=None): | 138 | def on_connect_clicked(self, widget, data=None): |
306 | 131 | """Connect syncdaemon.""" | 139 | """Connect syncdaemon.""" |
309 | 132 | assert self.started | 140 | self.sd.connect() |
308 | 133 | self.connected = True | ||
310 | 134 | self.connect.hide() | 141 | self.connect.hide() |
311 | 142 | self.disconnect.set_sensitive(False) | ||
312 | 135 | self.disconnect.show() | 143 | self.disconnect.show() |
316 | 136 | 144 | self.start_loading(self.is_connected) | |
314 | 137 | self.on_started() | ||
315 | 138 | self.doing_something(self.is_connected) | ||
317 | 139 | 145 | ||
318 | 140 | def on_disconnect_clicked(self, widget, data=None): | 146 | def on_disconnect_clicked(self, widget, data=None): |
319 | 141 | """Disconnect syncdaemon.""" | 147 | """Disconnect syncdaemon.""" |
320 | 142 | assert self.started | ||
321 | 143 | assert self.connected | ||
322 | 144 | self.connected = False | ||
323 | 145 | self.connect.show() | 148 | self.connect.show() |
324 | 149 | self.connect.set_sensitive(False) | ||
325 | 146 | self.disconnect.hide() | 150 | self.disconnect.hide() |
326 | 147 | 151 | ||
328 | 148 | self.on_disconnected() | 152 | self.sd.disconnect() |
329 | 149 | 153 | ||
330 | 150 | def on_status_icon_activate(self, widget, data=None): | 154 | def on_status_icon_activate(self, widget, data=None): |
331 | 151 | """Systray icon was clicked.""" | 155 | """Systray icon was clicked.""" |
332 | @@ -158,43 +162,45 @@ | |||
333 | 158 | 162 | ||
334 | 159 | def on_started(self, *args, **kwargs): | 163 | def on_started(self, *args, **kwargs): |
335 | 160 | """Callback'ed when syncadaemon is started.""" | 164 | """Callback'ed when syncadaemon is started.""" |
338 | 161 | self.stop_doing_something(self.is_started) | 165 | self.stop.set_sensitive(True) |
339 | 162 | self.status_label.set_text(self.STATUS['started']) | 166 | self.activate_indicator(self.is_started) |
340 | 167 | self.connect.set_sensitive(True) | ||
341 | 163 | 168 | ||
342 | 164 | def on_stopped(self, *args, **kwargs): | 169 | def on_stopped(self, *args, **kwargs): |
343 | 165 | """Callback'ed when syncadaemon is stopped.""" | 170 | """Callback'ed when syncadaemon is stopped.""" |
350 | 166 | 171 | self.start.set_sensitive(True) | |
351 | 167 | self.stop_doing_something(self.is_started, sensitive=False) | 172 | |
352 | 168 | 173 | self.activate_indicator(self.is_started, sensitive=False) | |
353 | 169 | self.is_started.set_sensitive(False) | 174 | self.activate_indicator(self.is_connected, sensitive=False) |
354 | 170 | self.is_connected.set_sensitive(False) | 175 | self.activate_indicator(self.is_online, sensitive=False) |
349 | 171 | self.is_online.set_sensitive(False) | ||
355 | 172 | 176 | ||
356 | 173 | def on_connected(self, *args, **kwargs): | 177 | def on_connected(self, *args, **kwargs): |
357 | 174 | """Callback'ed when syncadaemon is connected.""" | 178 | """Callback'ed when syncadaemon is connected.""" |
361 | 175 | self.is_connected.set_sensitive(True) | 179 | self.disconnect.set_sensitive(True) |
362 | 176 | self.doing_something(self.is_online) | 180 | self.activate_indicator(self.is_connected) |
363 | 177 | self.status_label.set_text(self.STATUS['connected']) | 181 | self.start_loading(self.is_online) |
364 | 182 | self.start_loading(self.is_online) | ||
365 | 178 | 183 | ||
366 | 179 | def on_disconnected(self, *args, **kwargs): | 184 | def on_disconnected(self, *args, **kwargs): |
367 | 180 | """Callback'ed when syncadaemon is disconnected.""" | 185 | """Callback'ed when syncadaemon is disconnected.""" |
373 | 181 | 186 | self.connect.set_sensitive(True) | |
374 | 182 | self.stop_doing_something(self.is_connected, sensitive=False) | 187 | |
375 | 183 | 188 | self.activate_indicator(self.is_connected, sensitive=False) | |
376 | 184 | self.is_connected.set_sensitive(False) | 189 | self.activate_indicator(self.is_online, sensitive=False) |
372 | 185 | self.is_online.set_sensitive(False) | ||
377 | 186 | 190 | ||
378 | 187 | def on_online(self, *args, **kwargs): | 191 | def on_online(self, *args, **kwargs): |
379 | 188 | """Callback'ed when syncadaemon is online.""" | 192 | """Callback'ed when syncadaemon is online.""" |
382 | 189 | self.is_onlined.set_sensitive(True) | 193 | self.is_online.set_sensitive(True) |
383 | 190 | self.status_label.set_text(self.STATUS['online']) | 194 | self.activate_indicator(self.is_online) |
384 | 191 | 195 | ||
385 | 192 | def on_offline(self, *args, **kwargs): | 196 | def on_offline(self, *args, **kwargs): |
386 | 193 | """Callback'ed when syncadaemon is offline.""" | 197 | """Callback'ed when syncadaemon is offline.""" |
391 | 194 | 198 | self.activate_indicator(self.is_online, sensitive=False) | |
392 | 195 | self.stop_doing_something(self.is_online, sensitive=False) | 199 | |
393 | 196 | 200 | def on_status_changed(self, name, description, is_error, is_connected, | |
394 | 197 | self.is_online.set_sensitive(False) | 201 | is_online, queues, connection): |
395 | 202 | """Callback'ed when the SD status changed.""" | ||
396 | 203 | self.status_label.set_text(description) | ||
397 | 198 | 204 | ||
398 | 199 | def _on_queue_changed(self, queue_name, items, *args, **kwargs): | 205 | def _on_queue_changed(self, queue_name, items, *args, **kwargs): |
399 | 200 | """Callback'ed when a queue changed.""" | 206 | """Callback'ed when a queue changed.""" |
400 | @@ -218,12 +224,12 @@ | |||
401 | 218 | 224 | ||
402 | 219 | # custom | 225 | # custom |
403 | 220 | 226 | ||
405 | 221 | def doing_something(self, what): | 227 | def start_loading(self, what): |
406 | 222 | """Set a loader animation on 'what'.""" | 228 | """Set a loader animation on 'what'.""" |
407 | 223 | what.set_sensitive(True) | 229 | what.set_sensitive(True) |
408 | 224 | what.set_from_animation(self.loading_animation) | 230 | what.set_from_animation(self.loading_animation) |
409 | 225 | 231 | ||
413 | 226 | def stop_doing_something(self, what, sensitive=True): | 232 | def activate_indicator(self, what, sensitive=True): |
414 | 227 | """Set a loader animation on 'what'.""" | 233 | """Set ready pixbuf on 'what' and make it 'sensitive'.""" |
412 | 228 | what.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_BUTTON) | ||
415 | 229 | what.set_sensitive(sensitive) | 234 | what.set_sensitive(sensitive) |
416 | 235 | what.set_from_pixbuf(self.active_indicator) | ||
417 | 230 | 236 | ||
418 | === modified file 'magicicada/tests/test_magicicada.py' | |||
419 | --- magicicada/tests/test_magicicada.py 2010-05-17 16:10:28 +0000 | |||
420 | +++ magicicada/tests/test_magicicada.py 2010-05-22 03:21:24 +0000 | |||
421 | @@ -26,9 +26,8 @@ | |||
422 | 26 | 26 | ||
423 | 27 | from twisted.trial.unittest import TestCase | 27 | from twisted.trial.unittest import TestCase |
424 | 28 | 28 | ||
426 | 29 | from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE | 29 | from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon |
427 | 30 | from magicicada.helpers import get_builder, NO_OP | 30 | from magicicada.helpers import get_builder, NO_OP |
428 | 31 | from magicicada.syncdaemon import SyncDaemon, QueueData | ||
429 | 32 | 31 | ||
430 | 33 | DEFAULT_TIMEOUT = 200 | 32 | DEFAULT_TIMEOUT = 200 |
431 | 34 | 33 | ||
432 | @@ -47,8 +46,20 @@ | |||
433 | 47 | """A faked syncdaemon.""" | 46 | """A faked syncdaemon.""" |
434 | 48 | 47 | ||
435 | 49 | def __init__(self): | 48 | def __init__(self): |
436 | 49 | self.on_started_callback = NO_OP | ||
437 | 50 | self.on_stopped_callback = NO_OP | ||
438 | 51 | self.on_connected_callback = NO_OP | ||
439 | 52 | self.on_disconnected_callback = NO_OP | ||
440 | 53 | self.on_online_callback = NO_OP | ||
441 | 54 | self.on_offline_callback = NO_OP | ||
442 | 55 | self.status_changed_callback = NO_OP | ||
443 | 50 | self.content_queue_changed_callback = NO_OP | 56 | self.content_queue_changed_callback = NO_OP |
444 | 51 | self.meta_queue_changed_callback = NO_OP | 57 | self.meta_queue_changed_callback = NO_OP |
445 | 58 | self.shutdown = NO_OP | ||
446 | 59 | self.start = NO_OP | ||
447 | 60 | self.quit = NO_OP | ||
448 | 61 | self.connect = NO_OP | ||
449 | 62 | self.disconnect = NO_OP | ||
450 | 52 | 63 | ||
451 | 53 | 64 | ||
452 | 54 | class MagicicadaUITestCase(TestCase): | 65 | class MagicicadaUITestCase(TestCase): |
453 | @@ -57,31 +68,50 @@ | |||
454 | 57 | def setUp(self): | 68 | def setUp(self): |
455 | 58 | """Init.""" | 69 | """Init.""" |
456 | 59 | self.builder = get_builder('gui.glade') | 70 | self.builder = get_builder('gui.glade') |
458 | 60 | self.ui = MagicicadaUI() | 71 | self.ui = MagicicadaUI(syncdaemon_class=FakedSyncdaemon) |
459 | 61 | self._called = False | 72 | self._called = False |
460 | 73 | self.set_called = lambda *_: setattr(self, '_called', True) | ||
461 | 62 | 74 | ||
462 | 63 | def tearDown(self): | 75 | def tearDown(self): |
464 | 64 | """Clenaup.""" | 76 | """Cleanup.""" |
465 | 65 | self.ui.on_main_window_destroy(self.ui.main_window) | 77 | self.ui.on_main_window_destroy(self.ui.main_window) |
466 | 66 | self._called = False | 78 | self._called = False |
467 | 67 | self.builder = None | 79 | self.builder = None |
468 | 68 | 80 | ||
469 | 81 | def assert_indicator_disabled(self, indicator): | ||
470 | 82 | """Test that 'indicator' is not sensitive.""" | ||
471 | 83 | self.assertFalse(indicator.is_sensitive(), 'indicator is not sensitive') | ||
472 | 84 | |||
473 | 85 | def assert_indicator_ready(self, indicator): | ||
474 | 86 | """Test that 'indicator' is sensitive and green.""" | ||
475 | 87 | self.assertTrue(indicator.is_sensitive(), 'indicator is sensitive') | ||
476 | 88 | expected = indicator.get_pixbuf() # a test on its own | ||
477 | 89 | self.assertEqual(self.ui.active_indicator, expected, | ||
478 | 90 | 'indicator is the correct pixbuf') | ||
479 | 91 | |||
480 | 92 | def assert_indicator_loading(self, indicator): | ||
481 | 93 | """Test that 'indicator' is sensitive and loading.""" | ||
482 | 94 | self.assertTrue(indicator.is_sensitive(), 'indicator is sensitive') | ||
483 | 95 | expected = indicator.get_animation() # a test on its own | ||
484 | 96 | self.assertEqual(self.ui.loading_animation, expected, | ||
485 | 97 | 'indicator is the correct animation') | ||
486 | 98 | |||
487 | 99 | |||
488 | 100 | class MagicicadaUIBasicTestCase(MagicicadaUITestCase): | ||
489 | 101 | """UI test cases for basic state.""" | ||
490 | 102 | |||
491 | 69 | def test_init_creates_sd_instance(self): | 103 | def test_init_creates_sd_instance(self): |
492 | 70 | """SyncDaemon instance is created at creation time.""" | 104 | """SyncDaemon instance is created at creation time.""" |
494 | 71 | self.assertTrue(isinstance(self.ui.sd, SyncDaemon)) | 105 | self.assertTrue(self.ui.sd is not None) |
495 | 106 | self.assertTrue(isinstance(self.ui.sd, FakedSyncdaemon)) | ||
496 | 72 | 107 | ||
497 | 73 | def test_destroy_shutdowns_sd_instance(self): | 108 | def test_destroy_shutdowns_sd_instance(self): |
498 | 74 | """SyncDaemon instance is shutdown at destroy time.""" | 109 | """SyncDaemon instance is shutdown at destroy time.""" |
501 | 75 | self.patch(self.ui.sd, 'shutdown', | 110 | self.patch(self.ui.sd, 'shutdown', self.set_called) |
500 | 76 | lambda *_: setattr(self, '_called', True)) | ||
502 | 77 | self.ui.on_main_window_destroy(self.ui.main_window) | 111 | self.ui.on_main_window_destroy(self.ui.main_window) |
503 | 78 | self.assertTrue(self._called, | 112 | self.assertTrue(self._called, |
504 | 79 | 'syncdaemon.shutdown must be called at destroy time.') | 113 | 'syncdaemon.shutdown must be called at destroy time.') |
505 | 80 | 114 | ||
506 | 81 | |||
507 | 82 | class MagicicadaUIStartupTestCase(MagicicadaUITestCase): | ||
508 | 83 | """UI test cases for startup state.""" | ||
509 | 84 | |||
510 | 85 | def test_main_window_is_visible(self): | 115 | def test_main_window_is_visible(self): |
511 | 86 | """UI can be created.""" | 116 | """UI can be created.""" |
512 | 87 | self.assertTrue(self.ui.main_window.get_property('visible')) | 117 | self.assertTrue(self.ui.main_window.get_property('visible')) |
513 | @@ -99,52 +129,110 @@ | |||
514 | 99 | self.assertFalse(self.ui.stop.get_property('visible')) | 129 | self.assertFalse(self.ui.stop.get_property('visible')) |
515 | 100 | self.assertFalse(self.ui.disconnect.get_property('visible')) | 130 | self.assertFalse(self.ui.disconnect.get_property('visible')) |
516 | 101 | 131 | ||
517 | 102 | def test_not_started_not_connected_not_online(self): | ||
518 | 103 | """Test default values for flags.""" | ||
519 | 104 | self.assertFalse(self.ui.started) | ||
520 | 105 | self.assertFalse(self.ui.connected) | ||
521 | 106 | self.assertFalse(self.ui.online) | ||
522 | 107 | |||
523 | 108 | def test_indicators_are_non_sensitive(self): | 132 | def test_indicators_are_non_sensitive(self): |
524 | 109 | """Test default sensitivity for indicators.""" | 133 | """Test default sensitivity for indicators.""" |
525 | 110 | #import pdb; pdb.set_trace() | ||
526 | 111 | self.assertFalse(self.ui.is_started.is_sensitive()) | 134 | self.assertFalse(self.ui.is_started.is_sensitive()) |
527 | 112 | self.assertFalse(self.ui.is_connected.is_sensitive()) | 135 | self.assertFalse(self.ui.is_connected.is_sensitive()) |
528 | 113 | self.assertFalse(self.ui.is_online.is_sensitive()) | 136 | self.assertFalse(self.ui.is_online.is_sensitive()) |
529 | 114 | 137 | ||
530 | 138 | def test_update_is_correct(self): | ||
531 | 139 | """Update updates.""" | ||
532 | 140 | # XXX: TODO | ||
533 | 141 | |||
534 | 115 | 142 | ||
535 | 116 | class MagicicadaUIClickedTestCase(MagicicadaUITestCase): | 143 | class MagicicadaUIClickedTestCase(MagicicadaUITestCase): |
536 | 117 | """UI test cases.""" | 144 | """UI test cases.""" |
537 | 118 | 145 | ||
540 | 119 | def test_started_if_start_clicked(self): | 146 | def test_on_start_clicked(self): |
541 | 120 | """Test started if Start was clicked.""" | 147 | """Test on_start_clicked.""" |
542 | 121 | self.ui.on_start_clicked(self.ui.start) | 148 | self.ui.on_start_clicked(self.ui.start) |
543 | 122 | self.assertTrue(self.ui.started) | ||
544 | 123 | self.assertFalse(self.ui.connected) | ||
545 | 124 | self.assertFalse(self.ui.online) | ||
546 | 125 | 149 | ||
547 | 126 | def test_can_connect_can_stop_if_start_clicked(self): | ||
548 | 127 | """Test Connect and Stop are enabled if Start was clicked.""" | ||
549 | 128 | self.ui.on_start_clicked(self.ui.start) | ||
550 | 129 | self.assertFalse(self.ui.start.get_property('visible')) | 150 | self.assertFalse(self.ui.start.get_property('visible')) |
551 | 130 | self.assertTrue(self.ui.stop.get_property('visible')) | 151 | self.assertTrue(self.ui.stop.get_property('visible')) |
567 | 131 | self.assertTrue(self.ui.connect.is_sensitive()) | 152 | self.assertFalse(self.ui.stop.is_sensitive()) |
568 | 132 | 153 | ||
569 | 133 | def test_connected_if_connect_clicked(self): | 154 | self.assert_indicator_loading(self.ui.is_started) |
570 | 134 | """Test connected if Connect was clicked.""" | 155 | self.assert_indicator_disabled(self.ui.is_connected) |
571 | 135 | self.ui.on_start_clicked(self.ui.start) # need to be started | 156 | self.assert_indicator_disabled(self.ui.is_online) |
572 | 136 | self.ui.on_connect_clicked(self.ui.connect) | 157 | |
573 | 137 | 158 | def test_on_start_clicked_starts_syncdaemon(self): | |
574 | 138 | self.assertTrue(self.ui.started) | 159 | """Test on_start_clicked.""" |
575 | 139 | self.assertTrue(self.ui.connected) | 160 | self.patch(self.ui.sd, 'start', self.set_called) |
576 | 140 | self.assertFalse(self.ui.online) | 161 | self.ui.on_start_clicked(self.ui.start) |
577 | 141 | 162 | self.assertTrue(self._called, 'syncdaemon.start was called.') | |
578 | 142 | def test_can_disconnect_if_connect_clicked(self): | 163 | |
579 | 143 | """Test Disconnect is enabled if Connect was clicked.""" | 164 | def test_on_connect_clicked(self): |
580 | 144 | self.ui.on_start_clicked(self.ui.start) # need to be started | 165 | """Test on_connect_clicked.""" |
581 | 145 | self.ui.on_connect_clicked(self.ui.connect) | 166 | self.ui.on_start_clicked(self.ui.start) # need to be started |
582 | 167 | self.ui.on_started() | ||
583 | 168 | self.ui.on_connect_clicked(self.ui.connect) | ||
584 | 169 | |||
585 | 146 | self.assertFalse(self.ui.connect.get_property('visible')) | 170 | self.assertFalse(self.ui.connect.get_property('visible')) |
586 | 147 | self.assertTrue(self.ui.disconnect.get_property('visible')) | 171 | self.assertTrue(self.ui.disconnect.get_property('visible')) |
587 | 172 | self.assertFalse(self.ui.disconnect.is_sensitive()) | ||
588 | 173 | |||
589 | 174 | self.assert_indicator_ready(self.ui.is_started) | ||
590 | 175 | self.assert_indicator_loading(self.ui.is_connected) | ||
591 | 176 | self.assert_indicator_disabled(self.ui.is_online) | ||
592 | 177 | |||
593 | 178 | def test_on_connect_clicked_connects_syncdaemon(self): | ||
594 | 179 | """Test on_connect_clicked.""" | ||
595 | 180 | self.patch(self.ui.sd, 'connect', self.set_called) | ||
596 | 181 | self.ui.on_connect_clicked(self.ui.connect) | ||
597 | 182 | self.assertTrue(self._called, 'syncdaemon.connect was called.') | ||
598 | 183 | |||
599 | 184 | def test_on_stop_clicked(self): | ||
600 | 185 | """Test on_stop_clicked.""" | ||
601 | 186 | self.ui.on_start_clicked(self.ui.start) | ||
602 | 187 | self.ui.on_started() | ||
603 | 188 | assert not self.ui.widget_enabled(self.ui.disconnect) | ||
604 | 189 | self.patch(self.ui, 'on_disconnect_clicked', self.set_called) | ||
605 | 190 | self.ui.on_stop_clicked(self.ui.stop) | ||
606 | 191 | |||
607 | 192 | self.assertFalse(self._called, 'on_disconnect_clicked was not called.') | ||
608 | 193 | |||
609 | 194 | self.assertTrue(self.ui.start.get_property('visible')) | ||
610 | 195 | self.assertFalse(self.ui.start.is_sensitive()) | ||
611 | 196 | self.assertFalse(self.ui.stop.get_property('visible')) | ||
612 | 197 | |||
613 | 198 | self.assertTrue(self.ui.connect.get_property('visible')) | ||
614 | 199 | self.assertFalse(self.ui.connect.is_sensitive()) | ||
615 | 200 | self.assertFalse(self.ui.disconnect.get_property('visible')) | ||
616 | 201 | |||
617 | 202 | def test_on_stop_clicked_if_connected(self): | ||
618 | 203 | """Test on_stop_clicked.""" | ||
619 | 204 | self.ui.on_start_clicked(self.ui.start) | ||
620 | 205 | self.ui.on_started() | ||
621 | 206 | self.ui.on_connect_clicked(self.ui.connect) | ||
622 | 207 | self.ui.on_connected() | ||
623 | 208 | self.patch(self.ui, 'on_disconnect_clicked', self.set_called) | ||
624 | 209 | self.ui.on_stop_clicked(self.ui.stop) | ||
625 | 210 | |||
626 | 211 | self.assertTrue(self._called, 'on_disconnect_clicked was called.') | ||
627 | 212 | |||
628 | 213 | def test_on_stop_clicked_stops_syncdaemon(self): | ||
629 | 214 | """Test on_stop_clicked.""" | ||
630 | 215 | self.patch(self.ui.sd, 'quit', self.set_called) | ||
631 | 216 | self.ui.on_stop_clicked(self.ui.stop) | ||
632 | 217 | self.assertTrue(self._called, 'syncdaemon.quit was called.') | ||
633 | 218 | |||
634 | 219 | def test_on_disconnect_clicked(self): | ||
635 | 220 | """Test on_disconnect_clicked.""" | ||
636 | 221 | self.ui.on_start_clicked(self.ui.start) | ||
637 | 222 | self.ui.on_started() | ||
638 | 223 | self.ui.on_connect_clicked(self.ui.connect) | ||
639 | 224 | self.ui.on_connected() | ||
640 | 225 | self.ui.on_disconnect_clicked(self.ui.disconnect) | ||
641 | 226 | |||
642 | 227 | self.assertTrue(self.ui.connect.get_property('visible')) | ||
643 | 228 | self.assertFalse(self.ui.connect.is_sensitive()) | ||
644 | 229 | self.assertFalse(self.ui.disconnect.get_property('visible')) | ||
645 | 230 | |||
646 | 231 | def test_on_disconnect_clicked_disconnects_syncdaemon(self): | ||
647 | 232 | """Test on_disconnect_clicked.""" | ||
648 | 233 | self.patch(self.ui.sd, 'disconnect', self.set_called) | ||
649 | 234 | self.ui.on_disconnect_clicked(self.ui.disconnect) | ||
650 | 235 | self.assertTrue(self._called, 'syncdaemon.disconnect was called.') | ||
651 | 148 | 236 | ||
652 | 149 | 237 | ||
653 | 150 | class MagicicadaUISystrayIconTestCase(MagicicadaUITestCase): | 238 | class MagicicadaUISystrayIconTestCase(MagicicadaUITestCase): |
654 | @@ -165,7 +253,7 @@ | |||
655 | 165 | 253 | ||
656 | 166 | 254 | ||
657 | 167 | class _MagicicadaUIQueueTestCase(MagicicadaUITestCase): | 255 | class _MagicicadaUIQueueTestCase(MagicicadaUITestCase): |
659 | 168 | """Abstratc UI test cases for a queue views.""" | 256 | """Abstratc UI test cases for queue tree views.""" |
660 | 169 | 257 | ||
661 | 170 | queue = None | 258 | queue = None |
662 | 171 | 259 | ||
663 | @@ -183,8 +271,9 @@ | |||
664 | 183 | """Build some data to pass to queue changed callback.""" | 271 | """Build some data to pass to queue changed callback.""" |
665 | 184 | items = [] | 272 | items = [] |
666 | 185 | for i in xrange(limit): | 273 | for i in xrange(limit): |
669 | 186 | cq = QueueData(operation='operation %i' % i, path='path %i' % i, | 274 | cq = syncdaemon.QueueData(operation='operation %i' % i, |
670 | 187 | node='node %i' % i, share='share %i' % i) | 275 | path='path %i' % i, node='node %i' % i, |
671 | 276 | share='share %i' % i) | ||
672 | 188 | items.append(cq) | 277 | items.append(cq) |
673 | 189 | return items | 278 | return items |
674 | 190 | 279 | ||
675 | @@ -242,12 +331,143 @@ | |||
676 | 242 | 331 | ||
677 | 243 | 332 | ||
678 | 244 | class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase): | 333 | class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase): |
680 | 245 | """UI test cases for content queue views.""" | 334 | """UI test cases for content queue view.""" |
681 | 246 | 335 | ||
682 | 247 | queue = CONTENT_QUEUE | 336 | queue = CONTENT_QUEUE |
683 | 248 | 337 | ||
684 | 249 | 338 | ||
685 | 250 | class MagicicadaUIMetaQueueTestCase(_MagicicadaUIQueueTestCase): | 339 | class MagicicadaUIMetaQueueTestCase(_MagicicadaUIQueueTestCase): |
687 | 251 | """UI test cases for meta queue views.""" | 340 | """UI test cases for meta queue view.""" |
688 | 252 | 341 | ||
689 | 253 | queue = META_QUEUE | 342 | queue = META_QUEUE |
690 | 343 | |||
691 | 344 | |||
692 | 345 | class MagicicadaUIStatusTestCase(MagicicadaUITestCase): | ||
693 | 346 | """UI test cases for the status label.""" | ||
694 | 347 | |||
695 | 348 | def setUp(self): | ||
696 | 349 | """Init.""" | ||
697 | 350 | super(MagicicadaUIStatusTestCase, self).setUp() | ||
698 | 351 | |||
699 | 352 | def test_callback_is_connected(self): | ||
700 | 353 | """Status callback is connected.""" | ||
701 | 354 | self.assertEqual(self.ui.sd.status_changed_callback, | ||
702 | 355 | self.ui.on_status_changed, | ||
703 | 356 | 'status_changed callback must be set') | ||
704 | 357 | |||
705 | 358 | def test_on_status_changed_updates_status_label(self): | ||
706 | 359 | """On status changed the status label is updated.""" | ||
707 | 360 | kwargs = dict(name='test', description='the status for testing', | ||
708 | 361 | is_error=False, is_connected=True, is_online=False, | ||
709 | 362 | queues=None, connection=None) | ||
710 | 363 | self.ui.on_status_changed(**kwargs) | ||
711 | 364 | self.assertEqual(self.ui.status_label.get_text(), kwargs['description']) | ||
712 | 365 | |||
713 | 366 | |||
714 | 367 | class MagicicadaUIConnectionTestCase(MagicicadaUITestCase): | ||
715 | 368 | """UI test cases for.""" | ||
716 | 369 | |||
717 | 370 | def setUp(self): | ||
718 | 371 | """Init.""" | ||
719 | 372 | super(MagicicadaUIConnectionTestCase, self).setUp() | ||
720 | 373 | |||
721 | 374 | def test_all_disabled_at_startup(self): | ||
722 | 375 | """Indicators are all disabled at startup.""" | ||
723 | 376 | self.assert_indicator_disabled(self.ui.is_started) | ||
724 | 377 | self.assert_indicator_disabled(self.ui.is_connected) | ||
725 | 378 | self.assert_indicator_disabled(self.ui.is_online) | ||
726 | 379 | |||
727 | 380 | def test_callback_are_connected(self): | ||
728 | 381 | """Connection callbacks are connected.""" | ||
729 | 382 | for callback in ('on_started', 'on_stopped', | ||
730 | 383 | 'on_connected', 'on_disconnected', | ||
731 | 384 | 'on_online', 'on_offline'): | ||
732 | 385 | sd_cb = getattr(self.ui.sd, '%s_callback' % callback) | ||
733 | 386 | ui_cb = getattr(self.ui, callback) | ||
734 | 387 | self.assertEqual(sd_cb, ui_cb, | ||
735 | 388 | '%s callback must be set' % callback) | ||
736 | 389 | |||
737 | 390 | def test_on_started_is_correct(self): | ||
738 | 391 | """On SD started, the UI enables connect and indicator.""" | ||
739 | 392 | # must have click start first | ||
740 | 393 | self.ui.on_start_clicked(self.ui.start) | ||
741 | 394 | assert not self.ui.stop.is_sensitive() | ||
742 | 395 | assert not self.ui.connect.is_sensitive() | ||
743 | 396 | |||
744 | 397 | self.ui.on_started() | ||
745 | 398 | |||
746 | 399 | self.assertTrue(self.ui.stop.is_sensitive()) | ||
747 | 400 | self.assertTrue(self.ui.connect.is_sensitive()) | ||
748 | 401 | self.assert_indicator_ready(self.ui.is_started) | ||
749 | 402 | self.assert_indicator_disabled(self.ui.is_connected) | ||
750 | 403 | self.assert_indicator_disabled(self.ui.is_online) | ||
751 | 404 | |||
752 | 405 | def test_on_connected_is_correct(self): | ||
753 | 406 | """On SD connected, the UI enables indicator.""" | ||
754 | 407 | self.ui.on_start_clicked(self.ui.start) | ||
755 | 408 | self.ui.on_started() | ||
756 | 409 | self.ui.on_connect_clicked(self.ui.start) | ||
757 | 410 | assert not self.ui.disconnect.is_sensitive() | ||
758 | 411 | |||
759 | 412 | self.ui.on_connected() | ||
760 | 413 | |||
761 | 414 | self.assertTrue(self.ui.disconnect.is_sensitive()) | ||
762 | 415 | self.assert_indicator_ready(self.ui.is_started) | ||
763 | 416 | self.assert_indicator_ready(self.ui.is_connected) | ||
764 | 417 | self.assert_indicator_loading(self.ui.is_online) | ||
765 | 418 | |||
766 | 419 | def test_on_online_is_correct(self): | ||
767 | 420 | """On SD online, the UI enables indicator.""" | ||
768 | 421 | self.ui.on_start_clicked(self.ui.start) | ||
769 | 422 | self.ui.on_started() | ||
770 | 423 | self.ui.on_connect_clicked(self.ui.connect) | ||
771 | 424 | self.ui.on_connected() | ||
772 | 425 | |||
773 | 426 | self.ui.on_online() | ||
774 | 427 | |||
775 | 428 | self.assert_indicator_ready(self.ui.is_started) | ||
776 | 429 | self.assert_indicator_ready(self.ui.is_connected) | ||
777 | 430 | self.assert_indicator_ready(self.ui.is_online) | ||
778 | 431 | |||
779 | 432 | def test_on_stopped_is_correct(self): | ||
780 | 433 | """On SD stopped, the UI disables stop and indicator.""" | ||
781 | 434 | self.ui.on_start_clicked(self.ui.start) | ||
782 | 435 | self.ui.on_started() | ||
783 | 436 | self.ui.on_stop_clicked(self.ui.stop) | ||
784 | 437 | |||
785 | 438 | self.ui.on_stopped() | ||
786 | 439 | |||
787 | 440 | self.assertTrue(self.ui.start.is_sensitive()) | ||
788 | 441 | self.assertTrue(self.ui.start.get_property('visible')) | ||
789 | 442 | self.assert_indicator_disabled(self.ui.is_started) | ||
790 | 443 | self.assert_indicator_disabled(self.ui.is_connected) | ||
791 | 444 | self.assert_indicator_disabled(self.ui.is_online) | ||
792 | 445 | |||
793 | 446 | def test_on_disconnected_is_correct(self): | ||
794 | 447 | """On SD disconnected, the UI disables connect and indicator.""" | ||
795 | 448 | self.ui.on_start_clicked(self.ui.start) | ||
796 | 449 | self.ui.on_started() | ||
797 | 450 | self.ui.on_connect_clicked(self.ui.connect) | ||
798 | 451 | self.ui.on_connected() | ||
799 | 452 | self.ui.on_disconnect_clicked(self.ui.disconnect) | ||
800 | 453 | |||
801 | 454 | self.ui.on_disconnected() | ||
802 | 455 | |||
803 | 456 | self.assertTrue(self.ui.connect.is_sensitive()) | ||
804 | 457 | self.assert_indicator_ready(self.ui.is_started) | ||
805 | 458 | self.assert_indicator_disabled(self.ui.is_connected) | ||
806 | 459 | self.assert_indicator_disabled(self.ui.is_online) | ||
807 | 460 | |||
808 | 461 | def test_on_offline_is_correct(self): | ||
809 | 462 | """On SD offline, the UI disables indicator.""" | ||
810 | 463 | self.ui.on_start_clicked(self.ui.start) | ||
811 | 464 | self.ui.on_started() | ||
812 | 465 | self.ui.on_connect_clicked(self.ui.connect) | ||
813 | 466 | self.ui.on_connected() | ||
814 | 467 | |||
815 | 468 | self.ui.on_offline() | ||
816 | 469 | |||
817 | 470 | self.assert_indicator_ready(self.ui.is_started) | ||
818 | 471 | self.assert_indicator_ready(self.ui.is_connected) | ||
819 | 472 | self.assert_indicator_disabled(self.ui.is_online) | ||
820 | 473 |
Go forward!