Merge lp:~nataliabidart/magicicada-gui/set-initial-state into lp:magicicada-gui

Proposed by Natalia Bidart
Status: Merged
Approved by: Facundo Batista
Approved revision: 26
Merged at revision: 23
Proposed branch: lp:~nataliabidart/magicicada-gui/set-initial-state
Merge into: lp:magicicada-gui
Diff against target: 520 lines (+169/-100)
3 files modified
magicicada/__init__.py (+60/-35)
magicicada/syncdaemon.py (+7/-0)
magicicada/tests/test_magicicada.py (+102/-65)
To merge this branch: bzr merge lp:~nataliabidart/magicicada-gui/set-initial-state
Reviewer Review Type Date Requested Status
chicharreros Pending
Review via email: mp+25834@code.launchpad.net

Description of the change

GUI updates the initial state based on syncdaemon.current_state.
Also fixed some glitches on buttons sensitivity and visibility.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'magicicada/__init__.py'
--- magicicada/__init__.py 2010-05-22 03:19:12 +0000
+++ magicicada/__init__.py 2010-05-23 10:42:26 +0000
@@ -29,7 +29,7 @@
29gtk2reactor.install()29gtk2reactor.install()
3030
31from magicicada import syncdaemon31from magicicada import syncdaemon
32from magicicada.helpers import get_data_file, get_builder, NO_OP32from magicicada.helpers import get_data_file, get_builder, NO_OP, print_debug
3333
34CONTENT_QUEUE = 'content'34CONTENT_QUEUE = 'content'
35META_QUEUE = 'meta'35META_QUEUE = 'meta'
@@ -39,7 +39,6 @@
39 STATUS = {39 STATUS = {
40 'started': _('Service started, click Connect to continue.'),40 'started': _('Service started, click Connect to continue.'),
41 'connected': _('Service connected. Doing internal synchronization...'),41 'connected': _('Service connected. Doing internal synchronization...'),
42 'online': _('Service reached Nirvana.'),
43 }42 }
4443
45 def __init__(self, launchpad_available=False, on_destroy=NO_OP,44 def __init__(self, launchpad_available=False, on_destroy=NO_OP,
@@ -96,6 +95,8 @@
96 self.widget_enabled = lambda w: \95 self.widget_enabled = lambda w: \
97 w.get_property('visible') and w.is_sensitive()96 w.get_property('visible') and w.is_sensitive()
9897
98 self.update()
99
99 # GTK callbacks100 # GTK callbacks
100101
101 def on_main_window_destroy(self, widget, data=None):102 def on_main_window_destroy(self, widget, data=None):
@@ -118,10 +119,8 @@
118 def on_start_clicked(self, widget, data=None):119 def on_start_clicked(self, widget, data=None):
119 """Start syncdaemon."""120 """Start syncdaemon."""
120 self.sd.start()121 self.sd.start()
121 self.start.hide()122 self.start.set_sensitive(False)
122 self.stop.set_sensitive(False)123 self._start_loading(self.is_started)
123 self.stop.show()
124 self.start_loading(self.is_started)
125124
126 def on_stop_clicked(self, widget, data=None):125 def on_stop_clicked(self, widget, data=None):
127 """Stop syncdaemon."""126 """Stop syncdaemon."""
@@ -129,28 +128,21 @@
129 self.on_disconnect_clicked(self.disconnect)128 self.on_disconnect_clicked(self.disconnect)
130 self.connect.set_sensitive(False)129 self.connect.set_sensitive(False)
131130
132 self.start.show()131 self.stop.set_sensitive(False)
133 self.start.set_sensitive(False)
134 self.stop.hide()
135
136 self.sd.quit()132 self.sd.quit()
137133
138 def on_connect_clicked(self, widget, data=None):134 def on_connect_clicked(self, widget, data=None):
139 """Connect syncdaemon."""135 """Connect syncdaemon."""
140 self.sd.connect()136 self.sd.connect()
141 self.connect.hide()137 self.connect.set_sensitive(False)
142 self.disconnect.set_sensitive(False)138 self._start_loading(self.is_connected)
143 self.disconnect.show()
144 self.start_loading(self.is_connected)
145139
146 def on_disconnect_clicked(self, widget, data=None):140 def on_disconnect_clicked(self, widget, data=None):
147 """Disconnect syncdaemon."""141 """Disconnect syncdaemon."""
148 self.connect.show()142 self.disconnect.set_sensitive(False)
149 self.connect.set_sensitive(False)
150 self.disconnect.hide()
151
152 self.sd.disconnect()143 self.sd.disconnect()
153144
145 @print_debug
154 def on_status_icon_activate(self, widget, data=None):146 def on_status_icon_activate(self, widget, data=None):
155 """Systray icon was clicked."""147 """Systray icon was clicked."""
156 if self.main_window.get_property('visible'):148 if self.main_window.get_property('visible'):
@@ -158,48 +150,60 @@
158 else:150 else:
159 self.main_window.show()151 self.main_window.show()
160152
161 # DBus callbacks153 # SyncDaemon callbacks
162154
163 def on_started(self, *args, **kwargs):155 def on_started(self, *args, **kwargs):
164 """Callback'ed when syncadaemon is started."""156 """Callback'ed when syncadaemon is started."""
157 self.start.hide()
158 self.stop.show()
165 self.stop.set_sensitive(True)159 self.stop.set_sensitive(True)
166 self.activate_indicator(self.is_started)160 self._activate_indicator(self.is_started)
167 self.connect.set_sensitive(True)161 self.connect.set_sensitive(True)
168162
169 def on_stopped(self, *args, **kwargs):163 def on_stopped(self, *args, **kwargs):
170 """Callback'ed when syncadaemon is stopped."""164 """Callback'ed when syncadaemon is stopped."""
165 self.stop.hide()
166 self.start.show()
171 self.start.set_sensitive(True)167 self.start.set_sensitive(True)
168 self.connect.set_sensitive(False)
172169
173 self.activate_indicator(self.is_started, sensitive=False)170 self._activate_indicator(self.is_started, sensitive=False)
174 self.activate_indicator(self.is_connected, sensitive=False)171 self._activate_indicator(self.is_connected, sensitive=False)
175 self.activate_indicator(self.is_online, sensitive=False)172 self._activate_indicator(self.is_online, sensitive=False)
176173
177 def on_connected(self, *args, **kwargs):174 def on_connected(self, *args, **kwargs):
178 """Callback'ed when syncadaemon is connected."""175 """Callback'ed when syncadaemon is connected."""
176 self.connect.hide()
177 self.disconnect.show()
179 self.disconnect.set_sensitive(True)178 self.disconnect.set_sensitive(True)
180 self.activate_indicator(self.is_connected)179 self._activate_indicator(self.is_connected)
181 self.start_loading(self.is_online)180 self._start_loading(self.is_online)
182 self.start_loading(self.is_online)181 self._start_loading(self.is_online)
183182
184 def on_disconnected(self, *args, **kwargs):183 def on_disconnected(self, *args, **kwargs):
185 """Callback'ed when syncadaemon is disconnected."""184 """Callback'ed when syncadaemon is disconnected."""
185 self.disconnect.hide()
186 self.connect.show()
186 self.connect.set_sensitive(True)187 self.connect.set_sensitive(True)
187188
188 self.activate_indicator(self.is_connected, sensitive=False)189 self._activate_indicator(self.is_connected, sensitive=False)
189 self.activate_indicator(self.is_online, sensitive=False)190 self._activate_indicator(self.is_online, sensitive=False)
190191
191 def on_online(self, *args, **kwargs):192 def on_online(self, *args, **kwargs):
192 """Callback'ed when syncadaemon is online."""193 """Callback'ed when syncadaemon is online."""
193 self.is_online.set_sensitive(True)194 self.is_online.set_sensitive(True)
194 self.activate_indicator(self.is_online)195 self._activate_indicator(self.is_online)
195196
196 def on_offline(self, *args, **kwargs):197 def on_offline(self, *args, **kwargs):
197 """Callback'ed when syncadaemon is offline."""198 """Callback'ed when syncadaemon is offline."""
198 self.activate_indicator(self.is_online, sensitive=False)199 self._activate_indicator(self.is_online, sensitive=False)
199200
200 def on_status_changed(self, name, description, is_error, is_connected,201 def on_status_changed(self, name=None, description=None,
201 is_online, queues, connection):202 is_error=False, is_connected=True,
203 is_online=True, queues=None, connection=None):
202 """Callback'ed when the SD status changed."""204 """Callback'ed when the SD status changed."""
205 if description is None:
206 description = ''
203 self.status_label.set_text(description)207 self.status_label.set_text(description)
204208
205 def _on_queue_changed(self, queue_name, items, *args, **kwargs):209 def _on_queue_changed(self, queue_name, items, *args, **kwargs):
@@ -211,7 +215,7 @@
211 row = (item.operation, item.path, item.node, item.share)215 row = (item.operation, item.path, item.node, item.share)
212 queue_store.append(row)216 queue_store.append(row)
213217
214 if not queue_view.is_sensitive():218 if not queue_view.is_sensitive() and len(items) > 0:
215 queue_view.set_sensitive(True)219 queue_view.set_sensitive(True)
216220
217 def on_content_queue_changed(self, items, *args, **kwargs):221 def on_content_queue_changed(self, items, *args, **kwargs):
@@ -224,12 +228,33 @@
224228
225 # custom229 # custom
226230
227 def start_loading(self, what):231 def _start_loading(self, what):
228 """Set a loader animation on 'what'."""232 """Set a loader animation on 'what'."""
229 what.set_sensitive(True)233 what.set_sensitive(True)
230 what.set_from_animation(self.loading_animation)234 what.set_from_animation(self.loading_animation)
231235
232 def activate_indicator(self, what, sensitive=True):236 def _activate_indicator(self, what, sensitive=True):
233 """Set ready pixbuf on 'what' and make it 'sensitive'."""237 """Set ready pixbuf on 'what' and make it 'sensitive'."""
234 what.set_sensitive(sensitive)238 what.set_sensitive(sensitive)
235 what.set_from_pixbuf(self.active_indicator)239 what.set_from_pixbuf(self.active_indicator)
240
241 def update(self):
242 """Update UI based on SD current state."""
243 current_state = self.sd.current_state
244
245 self._activate_indicator(self.is_online,
246 sensitive=current_state.is_online)
247
248 if current_state.is_started:
249 self.on_started()
250 if current_state.is_connected:
251 self.on_connected()
252 else:
253 self.on_disconnected()
254 else:
255 self.on_disconnected()
256 self.on_stopped()
257
258 self.on_meta_queue_changed(self.sd.meta_queue)
259 self.on_content_queue_changed(self.sd.content_queue)
260 self.on_status_changed(description=current_state.description)
236261
=== modified file 'magicicada/syncdaemon.py'
--- magicicada/syncdaemon.py 2010-05-22 20:27:11 +0000
+++ magicicada/syncdaemon.py 2010-05-23 10:42:26 +0000
@@ -85,6 +85,13 @@
85 raise AttributeError("Name not in _attrs: %r" % name)85 raise AttributeError("Name not in _attrs: %r" % name)
86 self.__dict__[name] = value86 self.__dict__[name] = value
8787
88 def __str__(self):
89 """String representation."""
90 result = []
91 for attr in self._attrs:
92 result.append("%s=%s" % (attr, getattr(self, attr)))
93 return "<%s>" % ", ".join(result)
94
8895
89class SyncDaemon(object):96class SyncDaemon(object):
90 """Interface to Ubuntu One's SyncDaemon."""97 """Interface to Ubuntu One's SyncDaemon."""
9198
=== modified file 'magicicada/tests/test_magicicada.py'
--- magicicada/tests/test_magicicada.py 2010-05-22 03:19:12 +0000
+++ magicicada/tests/test_magicicada.py 2010-05-23 10:42:26 +0000
@@ -18,28 +18,10 @@
1818
19"""Tests for magicicada."""19"""Tests for magicicada."""
2020
21import gobject
22import gtk
23import unittest
24
25from functools import wraps
26
27from twisted.trial.unittest import TestCase21from twisted.trial.unittest import TestCase
2822
29from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon23from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon
30from magicicada.helpers import get_builder, NO_OP24from magicicada.helpers import NO_OP
31
32DEFAULT_TIMEOUT = 200
33
34def close_window_after(a_test):
35 """Decorator to close the main window after executing f."""
36 @wraps(a_test)
37 def inner(*args, **kwargs):
38 """Inner function."""
39 #gobject.timeout_add(DEFAULT_TIMEOUT, a_test)
40 #self.ui.run()
41
42 return inner
4325
4426
45class FakedSyncdaemon(object):27class FakedSyncdaemon(object):
@@ -61,13 +43,16 @@
61 self.connect = NO_OP43 self.connect = NO_OP
62 self.disconnect = NO_OP44 self.disconnect = NO_OP
6345
46 self.current_state = syncdaemon.State()
47 self.meta_queue = []
48 self.content_queue = []
49
6450
65class MagicicadaUITestCase(TestCase):51class MagicicadaUITestCase(TestCase):
66 """UI test cases for Magicicada UI."""52 """UI test cases for Magicicada UI."""
6753
68 def setUp(self):54 def setUp(self):
69 """Init."""55 """Init."""
70 self.builder = get_builder('gui.glade')
71 self.ui = MagicicadaUI(syncdaemon_class=FakedSyncdaemon)56 self.ui = MagicicadaUI(syncdaemon_class=FakedSyncdaemon)
72 self._called = False57 self._called = False
73 self.set_called = lambda *_: setattr(self, '_called', True)58 self.set_called = lambda *_: setattr(self, '_called', True)
@@ -76,7 +61,6 @@
76 """Cleanup."""61 """Cleanup."""
77 self.ui.on_main_window_destroy(self.ui.main_window)62 self.ui.on_main_window_destroy(self.ui.main_window)
78 self._called = False63 self._called = False
79 self.builder = None
8064
81 def assert_indicator_disabled(self, indicator):65 def assert_indicator_disabled(self, indicator):
82 """Test that 'indicator' is not sensitive."""66 """Test that 'indicator' is not sensitive."""
@@ -136,8 +120,11 @@
136 self.assertFalse(self.ui.is_online.is_sensitive())120 self.assertFalse(self.ui.is_online.is_sensitive())
137121
138 def test_update_is_correct(self):122 def test_update_is_correct(self):
139 """Update updates."""123 """Update is called at startup."""
140 # XXX: TODO124 self.patch(MagicicadaUI, 'update', self.set_called)
125 self.ui = MagicicadaUI(syncdaemon_class=FakedSyncdaemon)
126 self.assertTrue(self._called,
127 'update was called at startup.')
141128
142129
143class MagicicadaUIClickedTestCase(MagicicadaUITestCase):130class MagicicadaUIClickedTestCase(MagicicadaUITestCase):
@@ -147,9 +134,9 @@
147 """Test on_start_clicked."""134 """Test on_start_clicked."""
148 self.ui.on_start_clicked(self.ui.start)135 self.ui.on_start_clicked(self.ui.start)
149136
150 self.assertFalse(self.ui.start.get_property('visible'))137 self.assertTrue(self.ui.start.get_property('visible'))
151 self.assertTrue(self.ui.stop.get_property('visible'))138 self.assertFalse(self.ui.start.is_sensitive())
152 self.assertFalse(self.ui.stop.is_sensitive())139 self.assertFalse(self.ui.stop.get_property('visible'))
153140
154 self.assert_indicator_loading(self.ui.is_started)141 self.assert_indicator_loading(self.ui.is_started)
155 self.assert_indicator_disabled(self.ui.is_connected)142 self.assert_indicator_disabled(self.ui.is_connected)
@@ -167,9 +154,9 @@
167 self.ui.on_started()154 self.ui.on_started()
168 self.ui.on_connect_clicked(self.ui.connect)155 self.ui.on_connect_clicked(self.ui.connect)
169156
170 self.assertFalse(self.ui.connect.get_property('visible'))157 self.assertTrue(self.ui.connect.get_property('visible'))
171 self.assertTrue(self.ui.disconnect.get_property('visible'))158 self.assertFalse(self.ui.connect.is_sensitive())
172 self.assertFalse(self.ui.disconnect.is_sensitive())159 self.assertFalse(self.ui.disconnect.get_property('visible'))
173160
174 self.assert_indicator_ready(self.ui.is_started)161 self.assert_indicator_ready(self.ui.is_started)
175 self.assert_indicator_loading(self.ui.is_connected)162 self.assert_indicator_loading(self.ui.is_connected)
@@ -191,9 +178,9 @@
191178
192 self.assertFalse(self._called, 'on_disconnect_clicked was not called.')179 self.assertFalse(self._called, 'on_disconnect_clicked was not called.')
193180
194 self.assertTrue(self.ui.start.get_property('visible'))181 self.assertFalse(self.ui.start.get_property('visible'))
195 self.assertFalse(self.ui.start.is_sensitive())182 self.assertTrue(self.ui.stop.get_property('visible'))
196 self.assertFalse(self.ui.stop.get_property('visible'))183 self.assertFalse(self.ui.stop.is_sensitive())
197184
198 self.assertTrue(self.ui.connect.get_property('visible'))185 self.assertTrue(self.ui.connect.get_property('visible'))
199 self.assertFalse(self.ui.connect.is_sensitive())186 self.assertFalse(self.ui.connect.is_sensitive())
@@ -224,9 +211,9 @@
224 self.ui.on_connected()211 self.ui.on_connected()
225 self.ui.on_disconnect_clicked(self.ui.disconnect)212 self.ui.on_disconnect_clicked(self.ui.disconnect)
226213
227 self.assertTrue(self.ui.connect.get_property('visible'))214 self.assertFalse(self.ui.connect.get_property('visible'))
228 self.assertFalse(self.ui.connect.is_sensitive())215 self.assertTrue(self.ui.disconnect.get_property('visible'))
229 self.assertFalse(self.ui.disconnect.get_property('visible'))216 self.assertFalse(self.ui.disconnect.is_sensitive())
230217
231 def test_on_disconnect_clicked_disconnects_syncdaemon(self):218 def test_on_disconnect_clicked_disconnects_syncdaemon(self):
232 """Test on_disconnect_clicked."""219 """Test on_disconnect_clicked."""
@@ -268,7 +255,7 @@
268 self.queue_view = getattr(self.ui, '%sq_view' % self.queue)255 self.queue_view = getattr(self.ui, '%sq_view' % self.queue)
269256
270 def build_some_data(self, limit=5):257 def build_some_data(self, limit=5):
271 """Build some data to pass to queue changed callback."""258 """Build some data to pass to queue changed callback and related."""
272 items = []259 items = []
273 for i in xrange(limit):260 for i in xrange(limit):
274 cq = syncdaemon.QueueData(operation='operation %i' % i,261 cq = syncdaemon.QueueData(operation='operation %i' % i,
@@ -277,6 +264,25 @@
277 items.append(cq)264 items.append(cq)
278 return items265 return items
279266
267 def assert_queue_store_correct(self, queue_store, items):
268 """Test that 'queue_store' has 'items' as content."""
269 msg = 'amount of rows for %s must be %s (got %s).'
270 self.assertEqual(len(queue_store), len(items),
271 msg % (queue_store, len(items), len(queue_store)))
272 # assert rows content equal to items content
273 tree_iter = queue_store.get_iter_root()
274 tmp = list(reversed(items))
275 while tree_iter is not None:
276 expected = tmp.pop()
277
278 op, path, node, share = queue_store.get(tree_iter, 0, 1, 2, 3)
279 self.assertEqual(expected.operation, op)
280 self.assertEqual(expected.path, path)
281 self.assertEqual(expected.node, node)
282 self.assertEqual(expected.share, share)
283
284 tree_iter = queue_store.iter_next(tree_iter)
285
280 def test_callback_is_connected(self):286 def test_callback_is_connected(self):
281 """Queue changed callback is connected."""287 """Queue changed callback is connected."""
282 self.assertEqual(self.sd_changed, self.ui_changed,288 self.assertEqual(self.sd_changed, self.ui_changed,
@@ -293,22 +299,7 @@
293 """On queue changed the view is updated."""299 """On queue changed the view is updated."""
294 items = self.build_some_data()300 items = self.build_some_data()
295 self.sd_changed(items)301 self.sd_changed(items)
296302 self.assert_queue_store_correct(self.queue_store, items)
297 self.assertEqual(len(self.queue_store), len(items))
298
299 # assert rows content equal to items content
300 tree_iter = self.queue_store.get_iter_root()
301 tmp = list(reversed(items))
302 while tree_iter is not None:
303 expected = tmp.pop()
304
305 op, path, node, share = self.queue_store.get(tree_iter, 0, 1, 2, 3)
306 self.assertEqual(expected.operation, op)
307 self.assertEqual(expected.path, path)
308 self.assertEqual(expected.node, node)
309 self.assertEqual(expected.share, share)
310
311 tree_iter = self.queue_store.iter_next(tree_iter)
312303
313 def test_model_is_cleared_before_updating(self):304 def test_model_is_cleared_before_updating(self):
314 """The model is cleared before upadting with a new set of data."""305 """The model is cleared before upadting with a new set of data."""
@@ -329,6 +320,15 @@
329 self.assertTrue(self.queue_view.is_sensitive(),320 self.assertTrue(self.queue_view.is_sensitive(),
330 'Tree view must be enabled on changed.')321 'Tree view must be enabled on changed.')
331322
323 def test_update_is_correct_for_queue(self):
324 """Correctly updates the queue state."""
325 data = self.build_some_data()
326 setattr(self.ui.sd, '%s_queue' % self.queue, data)
327
328 self.ui.update()
329
330 self.assert_queue_store_correct(self.queue_store, data)
331
332332
333class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase):333class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase):
334 """UI test cases for content queue view."""334 """UI test cases for content queue view."""
@@ -345,10 +345,6 @@
345class MagicicadaUIStatusTestCase(MagicicadaUITestCase):345class MagicicadaUIStatusTestCase(MagicicadaUITestCase):
346 """UI test cases for the status label."""346 """UI test cases for the status label."""
347347
348 def setUp(self):
349 """Init."""
350 super(MagicicadaUIStatusTestCase, self).setUp()
351
352 def test_callback_is_connected(self):348 def test_callback_is_connected(self):
353 """Status callback is connected."""349 """Status callback is connected."""
354 self.assertEqual(self.ui.sd.status_changed_callback,350 self.assertEqual(self.ui.sd.status_changed_callback,
@@ -363,13 +359,53 @@
363 self.ui.on_status_changed(**kwargs)359 self.ui.on_status_changed(**kwargs)
364 self.assertEqual(self.ui.status_label.get_text(), kwargs['description'])360 self.assertEqual(self.ui.status_label.get_text(), kwargs['description'])
365361
362 def test_update_is_correct_for_status_label(self):
363 """Correctly updates the status label."""
364 expected = 'dummy test'
365 self.ui.sd.current_state._set(description=expected)
366
367 self.ui.update()
368
369 self.assertEqual(expected, self.ui.status_label.get_text())
370
366371
367class MagicicadaUIConnectionTestCase(MagicicadaUITestCase):372class MagicicadaUIConnectionTestCase(MagicicadaUITestCase):
368 """UI test cases for."""373 """UI test cases for."""
369374
370 def setUp(self):375 def assert_indicator_is_updated_correctly(self, indicator):
371 """Init."""376 """Test that correctly updates the 'indicator'."""
372 super(MagicicadaUIConnectionTestCase, self).setUp()377 cs = self.ui.sd.current_state
378 for expected in (True, False):
379 cs._set(**{indicator: expected})
380
381 self.ui.update()
382
383 self.assertEqual(self.ui.widget_enabled(self.ui.start),
384 not cs.is_started,
385 'start must be enabled if not started.')
386 self.assertEqual(self.ui.widget_enabled(self.ui.stop),
387 cs.is_started,
388 'stop must be enabled if started.')
389
390 if cs.is_started:
391 actual = self.ui.widget_enabled(getattr(self.ui, indicator))
392 self.assertEqual(expected, actual,
393 '%s must be %s' % (indicator, expected))
394
395 self.assertEqual(self.ui.widget_enabled(self.ui.connect),
396 not cs.is_connected,
397 'connect must be enabled if not connected.')
398 self.assertEqual(self.ui.widget_enabled(self.ui.disconnect),
399 cs.is_connected,
400 'disconnect must be enabled if connected.')
401 else:
402 self.assertFalse(self.ui.connect.is_sensitive(),
403 'connect must be disabled when %s' % cs)
404 self.assertTrue(self.ui.connect.get_property('visible'),
405 'connect must be visible when %s' % cs)
406 actual = self.ui.widget_enabled(getattr(self.ui, indicator))
407 self.assertFalse(actual,
408 '%s must be disabled' % (indicator,))
373409
374 def test_all_disabled_at_startup(self):410 def test_all_disabled_at_startup(self):
375 """Indicators are all disabled at startup."""411 """Indicators are all disabled at startup."""
@@ -391,13 +427,11 @@
391 """On SD started, the UI enables connect and indicator."""427 """On SD started, the UI enables connect and indicator."""
392 # must have click start first428 # must have click start first
393 self.ui.on_start_clicked(self.ui.start)429 self.ui.on_start_clicked(self.ui.start)
394 assert not self.ui.stop.is_sensitive()
395 assert not self.ui.connect.is_sensitive()
396430
397 self.ui.on_started()431 self.ui.on_started()
398432
399 self.assertTrue(self.ui.stop.is_sensitive())433 self.assertTrue(self.ui.widget_enabled(self.ui.stop))
400 self.assertTrue(self.ui.connect.is_sensitive())434 self.assertTrue(self.ui.widget_enabled(self.ui.connect))
401 self.assert_indicator_ready(self.ui.is_started)435 self.assert_indicator_ready(self.ui.is_started)
402 self.assert_indicator_disabled(self.ui.is_connected)436 self.assert_indicator_disabled(self.ui.is_connected)
403 self.assert_indicator_disabled(self.ui.is_online)437 self.assert_indicator_disabled(self.ui.is_online)
@@ -407,11 +441,10 @@
407 self.ui.on_start_clicked(self.ui.start)441 self.ui.on_start_clicked(self.ui.start)
408 self.ui.on_started()442 self.ui.on_started()
409 self.ui.on_connect_clicked(self.ui.start)443 self.ui.on_connect_clicked(self.ui.start)
410 assert not self.ui.disconnect.is_sensitive()
411444
412 self.ui.on_connected()445 self.ui.on_connected()
413446
414 self.assertTrue(self.ui.disconnect.is_sensitive())447 self.assertTrue(self.ui.widget_enabled(self.ui.disconnect))
415 self.assert_indicator_ready(self.ui.is_started)448 self.assert_indicator_ready(self.ui.is_started)
416 self.assert_indicator_ready(self.ui.is_connected)449 self.assert_indicator_ready(self.ui.is_connected)
417 self.assert_indicator_loading(self.ui.is_online)450 self.assert_indicator_loading(self.ui.is_online)
@@ -471,3 +504,7 @@
471 self.assert_indicator_ready(self.ui.is_connected)504 self.assert_indicator_ready(self.ui.is_connected)
472 self.assert_indicator_disabled(self.ui.is_online)505 self.assert_indicator_disabled(self.ui.is_online)
473506
507 def test_update_is_correct_for_indicators_and_buttons(self):
508 """Correctly updates the indicators and buttons state."""
509 for i in ('is_started', 'is_connected', 'is_online'):
510 self.assert_indicator_is_updated_correctly(i)

Subscribers

People subscribed via source and target branches

to all changes: