Merge lp:~nataliabidart/ubuntu-sso-client/activatable-entry-and-button into lp:ubuntu-sso-client

Proposed by Natalia Bidart
Status: Merged
Approved by: John Lenton
Approved revision: 604
Merged at revision: 602
Proposed branch: lp:~nataliabidart/ubuntu-sso-client/activatable-entry-and-button
Merge into: lp:ubuntu-sso-client
Diff against target: 329 lines (+185/-3)
2 files modified
ubuntu_sso/gui.py (+32/-3)
ubuntu_sso/tests/test_gui.py (+153/-0)
To merge this branch: bzr merge lp:~nataliabidart/ubuntu-sso-client/activatable-entry-and-button
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Rodrigo Moya (community) Approve
Review via email: mp+33920@code.launchpad.net

Commit message

Every form can be submitted by activating the buttons and/or the entries (LP: #616421).

Description of the change

Every form can be submitted by activating the buttons and/or the entries.

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

Removing XXX (is beign resolved by this branch).

Revision history for this message
Rodrigo Moya (rodrigo-moya) :
review: Approve
Revision history for this message
John Lenton (chipaca) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ubuntu_sso/gui.py'
2--- ubuntu_sso/gui.py 2010-08-26 22:30:15 +0000
3+++ ubuntu_sso/gui.py 2010-08-27 15:27:59 +0000
4@@ -255,9 +255,6 @@
5 builder.add_from_file(ui_filename)
6 builder.connect_signals(self)
7
8- # XXX: every button should have tests for 'activate' signal
9- # see LP: #616421
10-
11 self.widgets = []
12 self.warnings = []
13 self.cancels = []
14@@ -278,6 +275,8 @@
15 if 'cancel_button' in name:
16 obj.connect('clicked', self.on_close_clicked)
17 self.cancels.append(obj)
18+ if '_button' in name:
19+ obj.connect('activate', lambda w: w.clicked())
20 if 'label' in name:
21 self.labels.append(obj)
22
23@@ -525,6 +524,11 @@
24 self.tc_hbox.hide_all()
25 self.login_button.set_label(self.LOGIN_BUTTON_LABEL)
26
27+ for entry in (self.name_entry, self.email1_entry, self.email2_entry,
28+ self.password1_entry, self.password2_entry,
29+ self.captcha_solution_entry):
30+ entry.connect('activate', lambda w: self.join_ok_button.clicked())
31+
32 return self.enter_details_vbox
33
34 def _build_tc_page(self):
35@@ -540,6 +544,8 @@
36
37 def _build_verify_email_page(self):
38 """Build the verify email page."""
39+ cb = lambda w: self.verify_token_button.clicked()
40+ self.email_token_entry.connect('activate', cb)
41 self.verify_email_vbox.pack_start(self.email_token_entry, expand=False)
42 self.verify_email_vbox.reorder_child(self.email_token_entry, 0)
43
44@@ -566,6 +572,9 @@
45 self.forgotten_password_button.set_label(msg)
46 self.login_ok_button.grab_focus()
47
48+ for entry in (self.login_email_entry, self.login_password_entry):
49+ entry.connect('activate', lambda w: self.login_ok_button.clicked())
50+
51 return self.login_vbox
52
53 def _build_request_password_token_page(self):
54@@ -581,6 +590,9 @@
55 self.request_password_token_ok_button.set_label(self.NEXT)
56 self.request_password_token_ok_button.set_sensitive(False)
57
58+ cb = lambda w: self.request_password_token_ok_button.clicked()
59+ self.reset_email_entry.connect('activate', cb)
60+
61 return self.request_password_token_vbox
62
63 def _build_set_new_password_page(self):
64@@ -588,10 +600,12 @@
65 self.set_new_password_vbox.header = self.RESET_PASSWORD
66 self.set_new_password_vbox.help_text = self.SET_NEW_PASSWORD_LABEL
67
68+ cb = lambda w: self.set_new_password_ok_button.clicked()
69 for entry in (self.reset_code_entry,
70 self.reset_password1_entry,
71 self.reset_password2_entry):
72 self.set_new_password_details_vbox.pack_start(entry)
73+ entry.connect('activate', cb)
74
75 cb = self.on_set_new_password_entries_changed
76 self.reset_code_entry.connect('changed', cb)
77@@ -649,6 +663,9 @@
78
79 def on_join_ok_button_clicked(self, *args, **kwargs):
80 """Submit info for processing, present the processing vbox."""
81+ if not self.join_ok_button.is_sensitive():
82+ return
83+
84 self._clear_warnings()
85
86 error = False
87@@ -725,6 +742,9 @@
88
89 def on_verify_token_button_clicked(self, *args, **kwargs):
90 """The user entered the email token, let's verify!"""
91+ if not self.verify_token_button.is_sensitive():
92+ return
93+
94 email = self.email1_entry.get_text()
95 password = self.password1_entry.get_text()
96 email_token = self.email_token_entry.get_text()
97@@ -740,6 +760,9 @@
98
99 def on_login_connect_button_clicked(self, *args, **kwargs):
100 """User wants to connect!"""
101+ if not self.login_ok_button.is_sensitive():
102+ return
103+
104 self._clear_warnings()
105
106 error = False
107@@ -780,6 +803,9 @@
108
109 def on_request_password_token_ok_button_clicked(self, *args, **kwargs):
110 """User entered the email address to reset the password."""
111+ if not self.request_password_token_ok_button.is_sensitive():
112+ return
113+
114 email = self.reset_email_entry.get_text()
115
116 logger.info('Calling request_password_reset_token with %r.', email)
117@@ -808,6 +834,9 @@
118
119 def on_set_new_password_ok_button_clicked(self, *args, **kwargs):
120 """User entered reset code and new passwords."""
121+ if not self.set_new_password_ok_button.is_sensitive():
122+ return
123+
124 email = self.reset_email_entry.get_text()
125 token = self.reset_code_entry.get_text()
126 # XXX: validate passwords!
127
128=== modified file 'ubuntu_sso/tests/test_gui.py'
129--- ubuntu_sso/tests/test_gui.py 2010-08-26 22:30:15 +0000
130+++ ubuntu_sso/tests/test_gui.py 2010-08-27 15:27:59 +0000
131@@ -574,6 +574,17 @@
132 self.assertEqual(self._called, ((widget,), {}), msg % name)
133 self._called = False
134
135+ def test_all_buttons_are_activatable(self):
136+ """Every button should be activatable."""
137+ msg = '"%s" should be activatable.'
138+ buttons = filter(lambda name: '_button' in name, self.ui.widgets)
139+ for name in buttons:
140+ widget = getattr(self.ui, name)
141+ widget.connect('clicked', self._set_called)
142+ widget.activate()
143+ self.assertEqual(self._called, ((widget,), {}), msg % name)
144+ self._called = False
145+
146 def test_window_icon(self):
147 """Main window has the proper icon."""
148 self.assertEqual('ubuntu-logo', self.ui.window.get_icon_name())
149@@ -790,6 +801,50 @@
150 actual = self.ui.login_button.get_label()
151 self.assertEqual(self.ui.LOGIN_BUTTON_LABEL, actual)
152
153+ def test_activate_name_entry_clicks_connect(self):
154+ """Activating any entry generates a connect attempt."""
155+ self.ui.join_ok_button.connect('clicked', self._set_called)
156+ self.ui.name_entry.activate()
157+ self.assertEqual(self._called, ((self.ui.join_ok_button,), {}))
158+
159+ def test_activate_email_entry_clicks_connect(self):
160+ """Activating any entry generates a connect attempt."""
161+ self.ui.join_ok_button.connect('clicked', self._set_called)
162+ self.ui.email1_entry.activate()
163+ self.assertEqual(self._called, ((self.ui.join_ok_button,), {}))
164+
165+ self._called = False
166+ self.ui.email2_entry.activate()
167+ self.assertEqual(self._called, ((self.ui.join_ok_button,), {}))
168+
169+ def test_activate_password_entry_clicks_connect(self):
170+ """Activating any entry generates a connect attempt."""
171+ self.ui.join_ok_button.connect('clicked', self._set_called)
172+ self.ui.password1_entry.activate()
173+ self.assertEqual(self._called, ((self.ui.join_ok_button,), {}))
174+
175+ self._called = False
176+ self.ui.password2_entry.activate()
177+ self.assertEqual(self._called, ((self.ui.join_ok_button,), {}))
178+
179+ def test_activate_captcha_solution_entry_clicks_connect(self):
180+ """Activating any entry generates a connect attempt."""
181+ self.ui.join_ok_button.connect('clicked', self._set_called)
182+ self.ui.captcha_solution_entry.activate()
183+ self.assertEqual(self._called, ((self.ui.join_ok_button,), {}))
184+
185+ def test_join_ok_button_does_nothing_if_clicked_but_disabled(self):
186+ """The join form can only be submitted if the button is sensitive."""
187+ self.patch(self.ui.name_entry, 'get_text', self._set_called)
188+
189+ self.ui.join_ok_button.set_sensitive(False)
190+ self.ui.join_ok_button.clicked()
191+ self.assertFalse(self._called)
192+
193+ self.ui.join_ok_button.set_sensitive(True)
194+ self.ui.join_ok_button.clicked()
195+ self.assertTrue(self._called)
196+
197
198 class NoTermsAndConditionsTestCase(UbuntuSSOClientTestCase):
199 """Test suite for the user registration (with no t&c link)."""
200@@ -986,10 +1041,33 @@
201 self.ui.success_close_button.clicked()
202 self.assertFalse(self.ui.window.get_property('visible'))
203
204+ def test_activate_email_token_entry_clicks_verify_token(self):
205+ """Activating any entry generates a connect attempt."""
206+ self.ui.verify_token_button.connect('clicked', self._set_called)
207+ self.ui.email_token_entry.activate()
208+ self.assertEqual(self._called, ((self.ui.verify_token_button,), {}))
209+
210+ def test_verify_token_button_does_nothing_if_clicked_but_disabled(self):
211+ """The email token can only be submitted if the button is sensitive."""
212+ self.patch(self.ui.email_token_entry, 'get_text', self._set_called)
213+
214+ self.ui.verify_token_button.set_sensitive(False)
215+ self.ui.verify_token_button.clicked()
216+ self.assertFalse(self._called)
217+
218+ self.ui.verify_token_button.set_sensitive(True)
219+ self.ui.verify_token_button.clicked()
220+ self.assertTrue(self._called)
221+
222
223 class RegistrationValidationTestCase(UbuntuSSOClientTestCase):
224 """Test suite for the user registration validations."""
225
226+ def setUp(self):
227+ """Init."""
228+ super(RegistrationValidationTestCase, self).setUp()
229+ self.ui.join_ok_button.set_sensitive(True)
230+
231 def test_warning_is_shown_if_name_empty(self):
232 """A warning message is shown if name is empty."""
233 self.ui.name_entry.set_text('')
234@@ -1216,6 +1294,30 @@
235 self.ui.login_back_button.clicked()
236 self.assertFalse(self.ui.warning_label.get_property('visible'))
237
238+ def test_activate_email_entry_clicks_login(self):
239+ """Activating any entry generates a connect attempt."""
240+ self.ui.login_ok_button.connect('clicked', self._set_called)
241+ self.ui.login_email_entry.activate()
242+ self.assertEqual(self._called, ((self.ui.login_ok_button,), {}))
243+
244+ def test_activate_password_entry_clicks_login(self):
245+ """Activating any entry generates a connect attempt."""
246+ self.ui.login_ok_button.connect('clicked', self._set_called)
247+ self.ui.login_password_entry.activate()
248+ self.assertEqual(self._called, ((self.ui.login_ok_button,), {}))
249+
250+ def test_login_ok_button_does_nothing_if_clicked_but_disabled(self):
251+ """The join form can only be submitted if the button is sensitive."""
252+ self.patch(self.ui.login_email_entry, 'get_text', self._set_called)
253+
254+ self.ui.login_ok_button.set_sensitive(False)
255+ self.ui.login_ok_button.clicked()
256+ self.assertFalse(self._called)
257+
258+ self.ui.login_ok_button.set_sensitive(True)
259+ self.ui.login_ok_button.clicked()
260+ self.assertTrue(self._called)
261+
262
263 class LoginValidationTestCase(UbuntuSSOClientTestCase):
264 """Test suite for the user login validation."""
265@@ -1380,6 +1482,26 @@
266 expected = '\n'.join((error['__all__'], error['message']))
267 self.assert_correct_label_warning(self.ui.warning_label, expected)
268
269+ def test_activate_reset_email_entry_clicks_login(self):
270+ """Activating any entry generates a connect attempt."""
271+ self.ui.request_password_token_ok_button.connect('clicked',
272+ self._set_called)
273+ self.ui.reset_email_entry.activate()
274+ self.assertEqual(self._called,
275+ ((self.ui.request_password_token_ok_button,), {}))
276+
277+ def test_ok_button_does_nothing_if_clicked_but_disabled(self):
278+ """The password token can be requested if the button is sensitive."""
279+ self.patch(self.ui.reset_email_entry, 'get_text', self._set_called)
280+
281+ self.ui.request_password_token_ok_button.set_sensitive(False)
282+ self.ui.request_password_token_ok_button.clicked()
283+ self.assertFalse(self._called)
284+
285+ self.ui.request_password_token_ok_button.set_sensitive(True)
286+ self.ui.request_password_token_ok_button.clicked()
287+ self.assertTrue(self._called)
288+
289
290 class SetNewPasswordTestCase(UbuntuSSOClientTestCase):
291 """Test suite for setting a new password functionality."""
292@@ -1448,6 +1570,37 @@
293 expected = '\n'.join((error['__all__'], error['message']))
294 self.assert_correct_label_warning(self.ui.warning_label, expected)
295
296+ def test_activate_reset_code_entry_clicks_set_new_password(self):
297+ """Activating any entry generates a connect attempt."""
298+ self.ui.set_new_password_ok_button.connect('clicked', self._set_called)
299+ self.ui.reset_code_entry.activate()
300+ self.assertEqual(self._called,
301+ ((self.ui.set_new_password_ok_button,), {}))
302+
303+ def test_activate_password_entry_clicks_set_new_password(self):
304+ """Activating any entry generates a connect attempt."""
305+ self.ui.set_new_password_ok_button.connect('clicked', self._set_called)
306+ self.ui.reset_password1_entry.activate()
307+ self.assertEqual(self._called,
308+ ((self.ui.set_new_password_ok_button,), {}))
309+
310+ self._called = False
311+ self.ui.reset_password2_entry.activate()
312+ self.assertEqual(self._called,
313+ ((self.ui.set_new_password_ok_button,), {}))
314+
315+ def test_ok_button_does_nothing_if_clicked_but_disabled(self):
316+ """The new passwrd can only be set if the button is sensitive."""
317+ self.patch(self.ui.reset_code_entry, 'get_text', self._set_called)
318+
319+ self.ui.set_new_password_ok_button.set_sensitive(False)
320+ self.ui.set_new_password_ok_button.clicked()
321+ self.assertFalse(self._called)
322+
323+ self.ui.set_new_password_ok_button.set_sensitive(True)
324+ self.ui.set_new_password_ok_button.clicked()
325+ self.assertTrue(self._called)
326+
327
328 class DbusTestCase(UbuntuSSOClientTestCase):
329 """Test suite for the dbus calls."""

Subscribers

People subscribed via source and target branches