Merge lp:~nataliabidart/magicicada-gui/bind-more-signals into lp:magicicada-gui

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
Reviewer Review Type Date Requested Status
Facundo Batista Approve
Review via email: mp+25813@code.launchpad.net

Description of the change

Binding callbacks for started/stopped, connected/disconnected, online/offline. Binding methods start/quit and connect/disconnect.

To post a comment you must log in.
24. By Natalia Bidart

Tweaks.

Revision history for this message
Facundo Batista (facundo) wrote :

Go forward!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'data/media/active-016.png'
0Binary 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 differ0Binary 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
=== added file 'data/media/active.svg'
--- data/media/active.svg 1970-01-01 00:00:00 +0000
+++ data/media/active.svg 2010-05-22 03:21:24 +0000
@@ -0,0 +1,203 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 width="425.71429"
14 height="461.42856"
15 id="svg2"
16 sodipodi:version="0.32"
17 inkscape:version="0.47 r22583"
18 version="1.0"
19 sodipodi:docname="active.svg"
20 inkscape:output_extension="org.inkscape.output.svg.inkscape">
21 <defs
22 id="defs4">
23 <linearGradient
24 id="linearGradient3250">
25 <stop
26 style="stop-color:#b8b8b8;stop-opacity:0;"
27 offset="0"
28 id="stop3252" />
29 <stop
30 id="stop3258"
31 offset="0.40588239"
32 style="stop-color:#b8b8b8;stop-opacity:1;" />
33 <stop
34 style="stop-color:#b8b8b8;stop-opacity:0;"
35 offset="1"
36 id="stop3254" />
37 </linearGradient>
38 <linearGradient
39 id="linearGradient3224">
40 <stop
41 style="stop-color:#ffffff;stop-opacity:1;"
42 offset="0"
43 id="stop3226" />
44 <stop
45 style="stop-color:#c8c8c8;stop-opacity:1;"
46 offset="1"
47 id="stop3228" />
48 </linearGradient>
49 <linearGradient
50 id="linearGradient3214">
51 <stop
52 style="stop-color:#3b3b3b;stop-opacity:1;"
53 offset="0"
54 id="stop3216" />
55 <stop
56 style="stop-color:#afafaf;stop-opacity:1;"
57 offset="1"
58 id="stop3218" />
59 </linearGradient>
60 <linearGradient
61 id="linearGradient3176">
62 <stop
63 style="stop-color:#c1ffb6;stop-opacity:1;"
64 offset="0"
65 id="stop3178" />
66 <stop
67 id="stop3184"
68 offset="0.40630153"
69 style="stop-color:#00e632;stop-opacity:1;" />
70 <stop
71 style="stop-color:#1c3a4f;stop-opacity:1"
72 offset="1"
73 id="stop3180" />
74 </linearGradient>
75 <inkscape:perspective
76 sodipodi:type="inkscape:persp3d"
77 inkscape:vp_x="0 : 526.18109 : 1"
78 inkscape:vp_y="0 : 1000 : 0"
79 inkscape:vp_z="744.09448 : 526.18109 : 1"
80 inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
81 id="perspective10" />
82 <inkscape:perspective
83 id="perspective2390"
84 inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
85 inkscape:vp_z="744.09448 : 526.18109 : 1"
86 inkscape:vp_y="0 : 1000 : 0"
87 inkscape:vp_x="0 : 526.18109 : 1"
88 sodipodi:type="inkscape:persp3d" />
89 <radialGradient
90 inkscape:collect="always"
91 xlink:href="#linearGradient3176"
92 id="radialGradient3182"
93 cx="346.42856"
94 cy="338.07645"
95 fx="346.42856"
96 fy="338.07645"
97 r="165.71428"
98 gradientUnits="userSpaceOnUse"
99 gradientTransform="matrix(-1.2831103,0.3438084,-0.3438084,-1.2831103,907.16815,652.76078)" />
100 <radialGradient
101 inkscape:collect="always"
102 xlink:href="#linearGradient3214"
103 id="radialGradient3220"
104 cx="317.60519"
105 cy="539.41315"
106 fx="317.60519"
107 fy="539.41315"
108 r="165.53342"
109 gradientTransform="matrix(1,0,0,0.2054734,0,428.57808)"
110 gradientUnits="userSpaceOnUse" />
111 <radialGradient
112 inkscape:collect="always"
113 xlink:href="#linearGradient3224"
114 id="radialGradient3230"
115 cx="317.60394"
116 cy="220.94547"
117 fx="317.60394"
118 fy="220.94547"
119 r="164.06058"
120 gradientTransform="matrix(1.0076229,0,0,0.1968921,-2.4553843,177.59098)"
121 gradientUnits="userSpaceOnUse" />
122 <linearGradient
123 inkscape:collect="always"
124 xlink:href="#linearGradient3250"
125 id="linearGradient3256"
126 x1="318.47412"
127 y1="651.00037"
128 x2="309.90268"
129 y2="413.85742"
130 gradientUnits="userSpaceOnUse"
131 spreadMethod="pad" />
132 <radialGradient
133 inkscape:collect="always"
134 xlink:href="#linearGradient3214"
135 id="radialGradient3274"
136 gradientUnits="userSpaceOnUse"
137 gradientTransform="matrix(1,0,0,0.2054734,11.428571,428.57808)"
138 cx="317.60519"
139 cy="539.41315"
140 fx="317.60519"
141 fy="539.41315"
142 r="165.53342" />
143 <radialGradient
144 inkscape:collect="always"
145 xlink:href="#linearGradient3224"
146 id="radialGradient3276"
147 gradientUnits="userSpaceOnUse"
148 gradientTransform="matrix(1.0076229,0,0,0.1922742,8.9731871,177.85367)"
149 cx="317.60394"
150 cy="220.94547"
151 fx="317.60394"
152 fy="220.94547"
153 r="164.06058" />
154 </defs>
155 <sodipodi:namedview
156 id="base"
157 pagecolor="#ffffff"
158 bordercolor="#666666"
159 borderopacity="1.0"
160 gridtolerance="10000"
161 guidetolerance="10"
162 objecttolerance="10"
163 inkscape:pageopacity="0.0"
164 inkscape:pageshadow="2"
165 inkscape:zoom="0.70710678"
166 inkscape:cx="577.43933"
167 inkscape:cy="433.43027"
168 inkscape:document-units="px"
169 inkscape:current-layer="layer1"
170 showgrid="false"
171 inkscape:window-width="1250"
172 inkscape:window-height="775"
173 inkscape:window-x="0"
174 inkscape:window-y="0"
175 inkscape:window-maximized="1" />
176 <metadata
177 id="metadata7">
178 <rdf:RDF>
179 <cc:Work
180 rdf:about="">
181 <dc:format>image/svg+xml</dc:format>
182 <dc:type
183 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
184 </cc:Work>
185 </rdf:RDF>
186 </metadata>
187 <g
188 inkscape:label="Layer 1"
189 inkscape:groupmode="layer"
190 id="layer1"
191 transform="translate(-105.61697,-158.14316)">
192 <path
193 sodipodi:type="arc"
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"
195 id="path2396"
196 sodipodi:cx="323.57144"
197 sodipodi:cy="389.50504"
198 sodipodi:rx="165.71428"
199 sodipodi:ry="165.71428"
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"
201 transform="translate(5.643371,-11.272676)" />
202 </g>
203</svg>
0204
=== modified file 'magicicada/__init__.py'
--- magicicada/__init__.py 2010-05-17 16:10:28 +0000
+++ magicicada/__init__.py 2010-05-22 03:21:24 +0000
@@ -28,8 +28,8 @@
28from twisted.internet import gtk2reactor # for gtk-2.028from twisted.internet import gtk2reactor # for gtk-2.0
29gtk2reactor.install()29gtk2reactor.install()
3030
31from magicicada import syncdaemon
31from magicicada.helpers import get_data_file, get_builder, NO_OP32from magicicada.helpers import get_data_file, get_builder, NO_OP
32from magicicada.syncdaemon import SyncDaemon
3333
34CONTENT_QUEUE = 'content'34CONTENT_QUEUE = 'content'
35META_QUEUE = 'meta'35META_QUEUE = 'meta'
@@ -42,7 +42,8 @@
42 'online': _('Service reached Nirvana.'),42 'online': _('Service reached Nirvana.'),
43 }43 }
4444
45 def __init__(self, launchpad_available=False, on_destroy=NO_OP):45 def __init__(self, launchpad_available=False, on_destroy=NO_OP,
46 syncdaemon_class=syncdaemon.SyncDaemon):
46 """Init."""47 """Init."""
47 self.builder = get_builder('gui.glade')48 self.builder = get_builder('gui.glade')
48 self.builder.connect_signals(self)49 self.builder.connect_signals(self)
@@ -59,8 +60,8 @@
5960
60 animation_filename = get_data_file('media', 'loader-ball.gif')61 animation_filename = get_data_file('media', 'loader-ball.gif')
61 self.loading_animation = gtk.gdk.PixbufAnimation(animation_filename)62 self.loading_animation = gtk.gdk.PixbufAnimation(animation_filename)
6263 active_filename = get_data_file('media', 'active-016.png')
63 self.started = self.connected = self.online = False64 self.active_indicator = gtk.gdk.pixbuf_new_from_file(active_filename)
6465
65 widgets = (66 widgets = (
66 'start', 'stop', 'connect', 'disconnect', # toolbar buttons67 'start', 'stop', 'connect', 'disconnect', # toolbar buttons
@@ -81,16 +82,26 @@
8182
82 self.main_window.show()83 self.main_window.show()
8384
84 self.sd = SyncDaemon()85 self.sd = syncdaemon_class()
86 self.sd.on_started_callback = self.on_started
87 self.sd.on_stopped_callback = self.on_stopped
88 self.sd.on_connected_callback = self.on_connected
89 self.sd.on_disconnected_callback = self.on_disconnected
90 self.sd.on_online_callback = self.on_online
91 self.sd.on_offline_callback = self.on_offline
92 self.sd.status_changed_callback = self.on_status_changed
85 self.sd.content_queue_changed_callback = self.on_content_queue_changed93 self.sd.content_queue_changed_callback = self.on_content_queue_changed
86 self.sd.meta_queue_changed_callback = self.on_meta_queue_changed94 self.sd.meta_queue_changed_callback = self.on_meta_queue_changed
8795
96 self.widget_enabled = lambda w: \
97 w.get_property('visible') and w.is_sensitive()
98
88 # GTK callbacks99 # GTK callbacks
89100
90 def on_main_window_destroy(self, widget, data=None):101 def on_main_window_destroy(self, widget, data=None):
91 """Called when the MagicicadaWindow is closed."""102 """Called when the MagicicadaWindow is closed."""
92 # Clean up code for saving application state should be added here.103 # Clean up code for saving application state should be added here.
93 if self.started:104 if self.widget_enabled(self.stop):
94 self.on_stop_clicked(self.stop)105 self.on_stop_clicked(self.stop)
95 self.sd.shutdown()106 self.sd.shutdown()
96 self.on_destroy()107 self.on_destroy()
@@ -106,46 +117,39 @@
106117
107 def on_start_clicked(self, widget, data=None):118 def on_start_clicked(self, widget, data=None):
108 """Start syncdaemon."""119 """Start syncdaemon."""
109 self.started = True120 self.sd.start()
110 self.connect.set_sensitive(True)
111 self.start.hide()121 self.start.hide()
122 self.stop.set_sensitive(False)
112 self.stop.show()123 self.stop.show()
113124 self.start_loading(self.is_started)
114 self.doing_something(self.is_started)
115125
116 def on_stop_clicked(self, widget, data=None):126 def on_stop_clicked(self, widget, data=None):
117 """Stop syncdaemon."""127 """Stop syncdaemon."""
118 assert self.started128 if self.widget_enabled(self.disconnect):
119
120 if self.connected:
121 self.on_disconnect_clicked(self.disconnect)129 self.on_disconnect_clicked(self.disconnect)
122 self.connect.set_sensitive(False)130 self.connect.set_sensitive(False)
123131
124 self.started = False
125 self.start.show()132 self.start.show()
133 self.start.set_sensitive(False)
126 self.stop.hide()134 self.stop.hide()
127135
128 self.on_stopped()136 self.sd.quit()
129137
130 def on_connect_clicked(self, widget, data=None):138 def on_connect_clicked(self, widget, data=None):
131 """Connect syncdaemon."""139 """Connect syncdaemon."""
132 assert self.started140 self.sd.connect()
133 self.connected = True
134 self.connect.hide()141 self.connect.hide()
142 self.disconnect.set_sensitive(False)
135 self.disconnect.show()143 self.disconnect.show()
136144 self.start_loading(self.is_connected)
137 self.on_started()
138 self.doing_something(self.is_connected)
139145
140 def on_disconnect_clicked(self, widget, data=None):146 def on_disconnect_clicked(self, widget, data=None):
141 """Disconnect syncdaemon."""147 """Disconnect syncdaemon."""
142 assert self.started
143 assert self.connected
144 self.connected = False
145 self.connect.show()148 self.connect.show()
149 self.connect.set_sensitive(False)
146 self.disconnect.hide()150 self.disconnect.hide()
147151
148 self.on_disconnected()152 self.sd.disconnect()
149153
150 def on_status_icon_activate(self, widget, data=None):154 def on_status_icon_activate(self, widget, data=None):
151 """Systray icon was clicked."""155 """Systray icon was clicked."""
@@ -158,43 +162,45 @@
158162
159 def on_started(self, *args, **kwargs):163 def on_started(self, *args, **kwargs):
160 """Callback'ed when syncadaemon is started."""164 """Callback'ed when syncadaemon is started."""
161 self.stop_doing_something(self.is_started)165 self.stop.set_sensitive(True)
162 self.status_label.set_text(self.STATUS['started'])166 self.activate_indicator(self.is_started)
167 self.connect.set_sensitive(True)
163168
164 def on_stopped(self, *args, **kwargs):169 def on_stopped(self, *args, **kwargs):
165 """Callback'ed when syncadaemon is stopped."""170 """Callback'ed when syncadaemon is stopped."""
166171 self.start.set_sensitive(True)
167 self.stop_doing_something(self.is_started, sensitive=False)172
168173 self.activate_indicator(self.is_started, sensitive=False)
169 self.is_started.set_sensitive(False)174 self.activate_indicator(self.is_connected, sensitive=False)
170 self.is_connected.set_sensitive(False)175 self.activate_indicator(self.is_online, sensitive=False)
171 self.is_online.set_sensitive(False)
172176
173 def on_connected(self, *args, **kwargs):177 def on_connected(self, *args, **kwargs):
174 """Callback'ed when syncadaemon is connected."""178 """Callback'ed when syncadaemon is connected."""
175 self.is_connected.set_sensitive(True)179 self.disconnect.set_sensitive(True)
176 self.doing_something(self.is_online)180 self.activate_indicator(self.is_connected)
177 self.status_label.set_text(self.STATUS['connected'])181 self.start_loading(self.is_online)
182 self.start_loading(self.is_online)
178183
179 def on_disconnected(self, *args, **kwargs):184 def on_disconnected(self, *args, **kwargs):
180 """Callback'ed when syncadaemon is disconnected."""185 """Callback'ed when syncadaemon is disconnected."""
181186 self.connect.set_sensitive(True)
182 self.stop_doing_something(self.is_connected, sensitive=False)187
183188 self.activate_indicator(self.is_connected, sensitive=False)
184 self.is_connected.set_sensitive(False)189 self.activate_indicator(self.is_online, sensitive=False)
185 self.is_online.set_sensitive(False)
186190
187 def on_online(self, *args, **kwargs):191 def on_online(self, *args, **kwargs):
188 """Callback'ed when syncadaemon is online."""192 """Callback'ed when syncadaemon is online."""
189 self.is_onlined.set_sensitive(True)193 self.is_online.set_sensitive(True)
190 self.status_label.set_text(self.STATUS['online'])194 self.activate_indicator(self.is_online)
191195
192 def on_offline(self, *args, **kwargs):196 def on_offline(self, *args, **kwargs):
193 """Callback'ed when syncadaemon is offline."""197 """Callback'ed when syncadaemon is offline."""
194198 self.activate_indicator(self.is_online, sensitive=False)
195 self.stop_doing_something(self.is_online, sensitive=False)199
196200 def on_status_changed(self, name, description, is_error, is_connected,
197 self.is_online.set_sensitive(False)201 is_online, queues, connection):
202 """Callback'ed when the SD status changed."""
203 self.status_label.set_text(description)
198204
199 def _on_queue_changed(self, queue_name, items, *args, **kwargs):205 def _on_queue_changed(self, queue_name, items, *args, **kwargs):
200 """Callback'ed when a queue changed."""206 """Callback'ed when a queue changed."""
@@ -218,12 +224,12 @@
218224
219 # custom225 # custom
220226
221 def doing_something(self, what):227 def start_loading(self, what):
222 """Set a loader animation on 'what'."""228 """Set a loader animation on 'what'."""
223 what.set_sensitive(True)229 what.set_sensitive(True)
224 what.set_from_animation(self.loading_animation)230 what.set_from_animation(self.loading_animation)
225231
226 def stop_doing_something(self, what, sensitive=True):232 def activate_indicator(self, what, sensitive=True):
227 """Set a loader animation on 'what'."""233 """Set ready pixbuf on 'what' and make it 'sensitive'."""
228 what.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_BUTTON)
229 what.set_sensitive(sensitive)234 what.set_sensitive(sensitive)
235 what.set_from_pixbuf(self.active_indicator)
230236
=== modified file 'magicicada/tests/test_magicicada.py'
--- magicicada/tests/test_magicicada.py 2010-05-17 16:10:28 +0000
+++ magicicada/tests/test_magicicada.py 2010-05-22 03:21:24 +0000
@@ -26,9 +26,8 @@
2626
27from twisted.trial.unittest import TestCase27from twisted.trial.unittest import TestCase
2828
29from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE29from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon
30from magicicada.helpers import get_builder, NO_OP30from magicicada.helpers import get_builder, NO_OP
31from magicicada.syncdaemon import SyncDaemon, QueueData
3231
33DEFAULT_TIMEOUT = 20032DEFAULT_TIMEOUT = 200
3433
@@ -47,8 +46,20 @@
47 """A faked syncdaemon."""46 """A faked syncdaemon."""
4847
49 def __init__(self):48 def __init__(self):
49 self.on_started_callback = NO_OP
50 self.on_stopped_callback = NO_OP
51 self.on_connected_callback = NO_OP
52 self.on_disconnected_callback = NO_OP
53 self.on_online_callback = NO_OP
54 self.on_offline_callback = NO_OP
55 self.status_changed_callback = NO_OP
50 self.content_queue_changed_callback = NO_OP56 self.content_queue_changed_callback = NO_OP
51 self.meta_queue_changed_callback = NO_OP57 self.meta_queue_changed_callback = NO_OP
58 self.shutdown = NO_OP
59 self.start = NO_OP
60 self.quit = NO_OP
61 self.connect = NO_OP
62 self.disconnect = NO_OP
5263
5364
54class MagicicadaUITestCase(TestCase):65class MagicicadaUITestCase(TestCase):
@@ -57,31 +68,50 @@
57 def setUp(self):68 def setUp(self):
58 """Init."""69 """Init."""
59 self.builder = get_builder('gui.glade')70 self.builder = get_builder('gui.glade')
60 self.ui = MagicicadaUI()71 self.ui = MagicicadaUI(syncdaemon_class=FakedSyncdaemon)
61 self._called = False72 self._called = False
73 self.set_called = lambda *_: setattr(self, '_called', True)
6274
63 def tearDown(self):75 def tearDown(self):
64 """Clenaup."""76 """Cleanup."""
65 self.ui.on_main_window_destroy(self.ui.main_window)77 self.ui.on_main_window_destroy(self.ui.main_window)
66 self._called = False78 self._called = False
67 self.builder = None79 self.builder = None
6880
81 def assert_indicator_disabled(self, indicator):
82 """Test that 'indicator' is not sensitive."""
83 self.assertFalse(indicator.is_sensitive(), 'indicator is not sensitive')
84
85 def assert_indicator_ready(self, indicator):
86 """Test that 'indicator' is sensitive and green."""
87 self.assertTrue(indicator.is_sensitive(), 'indicator is sensitive')
88 expected = indicator.get_pixbuf() # a test on its own
89 self.assertEqual(self.ui.active_indicator, expected,
90 'indicator is the correct pixbuf')
91
92 def assert_indicator_loading(self, indicator):
93 """Test that 'indicator' is sensitive and loading."""
94 self.assertTrue(indicator.is_sensitive(), 'indicator is sensitive')
95 expected = indicator.get_animation() # a test on its own
96 self.assertEqual(self.ui.loading_animation, expected,
97 'indicator is the correct animation')
98
99
100class MagicicadaUIBasicTestCase(MagicicadaUITestCase):
101 """UI test cases for basic state."""
102
69 def test_init_creates_sd_instance(self):103 def test_init_creates_sd_instance(self):
70 """SyncDaemon instance is created at creation time."""104 """SyncDaemon instance is created at creation time."""
71 self.assertTrue(isinstance(self.ui.sd, SyncDaemon))105 self.assertTrue(self.ui.sd is not None)
106 self.assertTrue(isinstance(self.ui.sd, FakedSyncdaemon))
72107
73 def test_destroy_shutdowns_sd_instance(self):108 def test_destroy_shutdowns_sd_instance(self):
74 """SyncDaemon instance is shutdown at destroy time."""109 """SyncDaemon instance is shutdown at destroy time."""
75 self.patch(self.ui.sd, 'shutdown',110 self.patch(self.ui.sd, 'shutdown', self.set_called)
76 lambda *_: setattr(self, '_called', True))
77 self.ui.on_main_window_destroy(self.ui.main_window)111 self.ui.on_main_window_destroy(self.ui.main_window)
78 self.assertTrue(self._called,112 self.assertTrue(self._called,
79 'syncdaemon.shutdown must be called at destroy time.')113 'syncdaemon.shutdown must be called at destroy time.')
80114
81
82class MagicicadaUIStartupTestCase(MagicicadaUITestCase):
83 """UI test cases for startup state."""
84
85 def test_main_window_is_visible(self):115 def test_main_window_is_visible(self):
86 """UI can be created."""116 """UI can be created."""
87 self.assertTrue(self.ui.main_window.get_property('visible'))117 self.assertTrue(self.ui.main_window.get_property('visible'))
@@ -99,52 +129,110 @@
99 self.assertFalse(self.ui.stop.get_property('visible'))129 self.assertFalse(self.ui.stop.get_property('visible'))
100 self.assertFalse(self.ui.disconnect.get_property('visible'))130 self.assertFalse(self.ui.disconnect.get_property('visible'))
101131
102 def test_not_started_not_connected_not_online(self):
103 """Test default values for flags."""
104 self.assertFalse(self.ui.started)
105 self.assertFalse(self.ui.connected)
106 self.assertFalse(self.ui.online)
107
108 def test_indicators_are_non_sensitive(self):132 def test_indicators_are_non_sensitive(self):
109 """Test default sensitivity for indicators."""133 """Test default sensitivity for indicators."""
110 #import pdb; pdb.set_trace()
111 self.assertFalse(self.ui.is_started.is_sensitive())134 self.assertFalse(self.ui.is_started.is_sensitive())
112 self.assertFalse(self.ui.is_connected.is_sensitive())135 self.assertFalse(self.ui.is_connected.is_sensitive())
113 self.assertFalse(self.ui.is_online.is_sensitive())136 self.assertFalse(self.ui.is_online.is_sensitive())
114137
138 def test_update_is_correct(self):
139 """Update updates."""
140 # XXX: TODO
141
115142
116class MagicicadaUIClickedTestCase(MagicicadaUITestCase):143class MagicicadaUIClickedTestCase(MagicicadaUITestCase):
117 """UI test cases."""144 """UI test cases."""
118145
119 def test_started_if_start_clicked(self):146 def test_on_start_clicked(self):
120 """Test started if Start was clicked."""147 """Test on_start_clicked."""
121 self.ui.on_start_clicked(self.ui.start)148 self.ui.on_start_clicked(self.ui.start)
122 self.assertTrue(self.ui.started)
123 self.assertFalse(self.ui.connected)
124 self.assertFalse(self.ui.online)
125149
126 def test_can_connect_can_stop_if_start_clicked(self):
127 """Test Connect and Stop are enabled if Start was clicked."""
128 self.ui.on_start_clicked(self.ui.start)
129 self.assertFalse(self.ui.start.get_property('visible'))150 self.assertFalse(self.ui.start.get_property('visible'))
130 self.assertTrue(self.ui.stop.get_property('visible'))151 self.assertTrue(self.ui.stop.get_property('visible'))
131 self.assertTrue(self.ui.connect.is_sensitive())152 self.assertFalse(self.ui.stop.is_sensitive())
132153
133 def test_connected_if_connect_clicked(self):154 self.assert_indicator_loading(self.ui.is_started)
134 """Test connected if Connect was clicked."""155 self.assert_indicator_disabled(self.ui.is_connected)
135 self.ui.on_start_clicked(self.ui.start) # need to be started156 self.assert_indicator_disabled(self.ui.is_online)
136 self.ui.on_connect_clicked(self.ui.connect)157
137158 def test_on_start_clicked_starts_syncdaemon(self):
138 self.assertTrue(self.ui.started)159 """Test on_start_clicked."""
139 self.assertTrue(self.ui.connected)160 self.patch(self.ui.sd, 'start', self.set_called)
140 self.assertFalse(self.ui.online)161 self.ui.on_start_clicked(self.ui.start)
141162 self.assertTrue(self._called, 'syncdaemon.start was called.')
142 def test_can_disconnect_if_connect_clicked(self):163
143 """Test Disconnect is enabled if Connect was clicked."""164 def test_on_connect_clicked(self):
144 self.ui.on_start_clicked(self.ui.start) # need to be started165 """Test on_connect_clicked."""
145 self.ui.on_connect_clicked(self.ui.connect)166 self.ui.on_start_clicked(self.ui.start) # need to be started
167 self.ui.on_started()
168 self.ui.on_connect_clicked(self.ui.connect)
169
146 self.assertFalse(self.ui.connect.get_property('visible'))170 self.assertFalse(self.ui.connect.get_property('visible'))
147 self.assertTrue(self.ui.disconnect.get_property('visible'))171 self.assertTrue(self.ui.disconnect.get_property('visible'))
172 self.assertFalse(self.ui.disconnect.is_sensitive())
173
174 self.assert_indicator_ready(self.ui.is_started)
175 self.assert_indicator_loading(self.ui.is_connected)
176 self.assert_indicator_disabled(self.ui.is_online)
177
178 def test_on_connect_clicked_connects_syncdaemon(self):
179 """Test on_connect_clicked."""
180 self.patch(self.ui.sd, 'connect', self.set_called)
181 self.ui.on_connect_clicked(self.ui.connect)
182 self.assertTrue(self._called, 'syncdaemon.connect was called.')
183
184 def test_on_stop_clicked(self):
185 """Test on_stop_clicked."""
186 self.ui.on_start_clicked(self.ui.start)
187 self.ui.on_started()
188 assert not self.ui.widget_enabled(self.ui.disconnect)
189 self.patch(self.ui, 'on_disconnect_clicked', self.set_called)
190 self.ui.on_stop_clicked(self.ui.stop)
191
192 self.assertFalse(self._called, 'on_disconnect_clicked was not called.')
193
194 self.assertTrue(self.ui.start.get_property('visible'))
195 self.assertFalse(self.ui.start.is_sensitive())
196 self.assertFalse(self.ui.stop.get_property('visible'))
197
198 self.assertTrue(self.ui.connect.get_property('visible'))
199 self.assertFalse(self.ui.connect.is_sensitive())
200 self.assertFalse(self.ui.disconnect.get_property('visible'))
201
202 def test_on_stop_clicked_if_connected(self):
203 """Test on_stop_clicked."""
204 self.ui.on_start_clicked(self.ui.start)
205 self.ui.on_started()
206 self.ui.on_connect_clicked(self.ui.connect)
207 self.ui.on_connected()
208 self.patch(self.ui, 'on_disconnect_clicked', self.set_called)
209 self.ui.on_stop_clicked(self.ui.stop)
210
211 self.assertTrue(self._called, 'on_disconnect_clicked was called.')
212
213 def test_on_stop_clicked_stops_syncdaemon(self):
214 """Test on_stop_clicked."""
215 self.patch(self.ui.sd, 'quit', self.set_called)
216 self.ui.on_stop_clicked(self.ui.stop)
217 self.assertTrue(self._called, 'syncdaemon.quit was called.')
218
219 def test_on_disconnect_clicked(self):
220 """Test on_disconnect_clicked."""
221 self.ui.on_start_clicked(self.ui.start)
222 self.ui.on_started()
223 self.ui.on_connect_clicked(self.ui.connect)
224 self.ui.on_connected()
225 self.ui.on_disconnect_clicked(self.ui.disconnect)
226
227 self.assertTrue(self.ui.connect.get_property('visible'))
228 self.assertFalse(self.ui.connect.is_sensitive())
229 self.assertFalse(self.ui.disconnect.get_property('visible'))
230
231 def test_on_disconnect_clicked_disconnects_syncdaemon(self):
232 """Test on_disconnect_clicked."""
233 self.patch(self.ui.sd, 'disconnect', self.set_called)
234 self.ui.on_disconnect_clicked(self.ui.disconnect)
235 self.assertTrue(self._called, 'syncdaemon.disconnect was called.')
148236
149237
150class MagicicadaUISystrayIconTestCase(MagicicadaUITestCase):238class MagicicadaUISystrayIconTestCase(MagicicadaUITestCase):
@@ -165,7 +253,7 @@
165253
166254
167class _MagicicadaUIQueueTestCase(MagicicadaUITestCase):255class _MagicicadaUIQueueTestCase(MagicicadaUITestCase):
168 """Abstratc UI test cases for a queue views."""256 """Abstratc UI test cases for queue tree views."""
169257
170 queue = None258 queue = None
171259
@@ -183,8 +271,9 @@
183 """Build some data to pass to queue changed callback."""271 """Build some data to pass to queue changed callback."""
184 items = []272 items = []
185 for i in xrange(limit):273 for i in xrange(limit):
186 cq = QueueData(operation='operation %i' % i, path='path %i' % i,274 cq = syncdaemon.QueueData(operation='operation %i' % i,
187 node='node %i' % i, share='share %i' % i)275 path='path %i' % i, node='node %i' % i,
276 share='share %i' % i)
188 items.append(cq)277 items.append(cq)
189 return items278 return items
190279
@@ -242,12 +331,143 @@
242331
243332
244class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase):333class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase):
245 """UI test cases for content queue views."""334 """UI test cases for content queue view."""
246335
247 queue = CONTENT_QUEUE336 queue = CONTENT_QUEUE
248337
249338
250class MagicicadaUIMetaQueueTestCase(_MagicicadaUIQueueTestCase):339class MagicicadaUIMetaQueueTestCase(_MagicicadaUIQueueTestCase):
251 """UI test cases for meta queue views."""340 """UI test cases for meta queue view."""
252341
253 queue = META_QUEUE342 queue = META_QUEUE
343
344
345class MagicicadaUIStatusTestCase(MagicicadaUITestCase):
346 """UI test cases for the status label."""
347
348 def setUp(self):
349 """Init."""
350 super(MagicicadaUIStatusTestCase, self).setUp()
351
352 def test_callback_is_connected(self):
353 """Status callback is connected."""
354 self.assertEqual(self.ui.sd.status_changed_callback,
355 self.ui.on_status_changed,
356 'status_changed callback must be set')
357
358 def test_on_status_changed_updates_status_label(self):
359 """On status changed the status label is updated."""
360 kwargs = dict(name='test', description='the status for testing',
361 is_error=False, is_connected=True, is_online=False,
362 queues=None, connection=None)
363 self.ui.on_status_changed(**kwargs)
364 self.assertEqual(self.ui.status_label.get_text(), kwargs['description'])
365
366
367class MagicicadaUIConnectionTestCase(MagicicadaUITestCase):
368 """UI test cases for."""
369
370 def setUp(self):
371 """Init."""
372 super(MagicicadaUIConnectionTestCase, self).setUp()
373
374 def test_all_disabled_at_startup(self):
375 """Indicators are all disabled at startup."""
376 self.assert_indicator_disabled(self.ui.is_started)
377 self.assert_indicator_disabled(self.ui.is_connected)
378 self.assert_indicator_disabled(self.ui.is_online)
379
380 def test_callback_are_connected(self):
381 """Connection callbacks are connected."""
382 for callback in ('on_started', 'on_stopped',
383 'on_connected', 'on_disconnected',
384 'on_online', 'on_offline'):
385 sd_cb = getattr(self.ui.sd, '%s_callback' % callback)
386 ui_cb = getattr(self.ui, callback)
387 self.assertEqual(sd_cb, ui_cb,
388 '%s callback must be set' % callback)
389
390 def test_on_started_is_correct(self):
391 """On SD started, the UI enables connect and indicator."""
392 # must have click start first
393 self.ui.on_start_clicked(self.ui.start)
394 assert not self.ui.stop.is_sensitive()
395 assert not self.ui.connect.is_sensitive()
396
397 self.ui.on_started()
398
399 self.assertTrue(self.ui.stop.is_sensitive())
400 self.assertTrue(self.ui.connect.is_sensitive())
401 self.assert_indicator_ready(self.ui.is_started)
402 self.assert_indicator_disabled(self.ui.is_connected)
403 self.assert_indicator_disabled(self.ui.is_online)
404
405 def test_on_connected_is_correct(self):
406 """On SD connected, the UI enables indicator."""
407 self.ui.on_start_clicked(self.ui.start)
408 self.ui.on_started()
409 self.ui.on_connect_clicked(self.ui.start)
410 assert not self.ui.disconnect.is_sensitive()
411
412 self.ui.on_connected()
413
414 self.assertTrue(self.ui.disconnect.is_sensitive())
415 self.assert_indicator_ready(self.ui.is_started)
416 self.assert_indicator_ready(self.ui.is_connected)
417 self.assert_indicator_loading(self.ui.is_online)
418
419 def test_on_online_is_correct(self):
420 """On SD online, the UI enables indicator."""
421 self.ui.on_start_clicked(self.ui.start)
422 self.ui.on_started()
423 self.ui.on_connect_clicked(self.ui.connect)
424 self.ui.on_connected()
425
426 self.ui.on_online()
427
428 self.assert_indicator_ready(self.ui.is_started)
429 self.assert_indicator_ready(self.ui.is_connected)
430 self.assert_indicator_ready(self.ui.is_online)
431
432 def test_on_stopped_is_correct(self):
433 """On SD stopped, the UI disables stop and indicator."""
434 self.ui.on_start_clicked(self.ui.start)
435 self.ui.on_started()
436 self.ui.on_stop_clicked(self.ui.stop)
437
438 self.ui.on_stopped()
439
440 self.assertTrue(self.ui.start.is_sensitive())
441 self.assertTrue(self.ui.start.get_property('visible'))
442 self.assert_indicator_disabled(self.ui.is_started)
443 self.assert_indicator_disabled(self.ui.is_connected)
444 self.assert_indicator_disabled(self.ui.is_online)
445
446 def test_on_disconnected_is_correct(self):
447 """On SD disconnected, the UI disables connect and indicator."""
448 self.ui.on_start_clicked(self.ui.start)
449 self.ui.on_started()
450 self.ui.on_connect_clicked(self.ui.connect)
451 self.ui.on_connected()
452 self.ui.on_disconnect_clicked(self.ui.disconnect)
453
454 self.ui.on_disconnected()
455
456 self.assertTrue(self.ui.connect.is_sensitive())
457 self.assert_indicator_ready(self.ui.is_started)
458 self.assert_indicator_disabled(self.ui.is_connected)
459 self.assert_indicator_disabled(self.ui.is_online)
460
461 def test_on_offline_is_correct(self):
462 """On SD offline, the UI disables indicator."""
463 self.ui.on_start_clicked(self.ui.start)
464 self.ui.on_started()
465 self.ui.on_connect_clicked(self.ui.connect)
466 self.ui.on_connected()
467
468 self.ui.on_offline()
469
470 self.assert_indicator_ready(self.ui.is_started)
471 self.assert_indicator_ready(self.ui.is_connected)
472 self.assert_indicator_disabled(self.ui.is_online)
473

Subscribers

People subscribed via source and target branches

to all changes: