Merge lp:~diegosarmentero/ubuntuone-windows-installer/reset-password-page into lp:ubuntuone-windows-installer

Proposed by Diego Sarmentero
Status: Merged
Approved by: Roberto Alsina
Approved revision: 47
Merged at revision: 50
Proposed branch: lp:~diegosarmentero/ubuntuone-windows-installer/reset-password-page
Merge into: lp:ubuntuone-windows-installer
Diff against target: 402 lines (+29/-266)
2 files modified
ubuntuone_installer/gui/qt/setup_account.py (+18/-74)
ubuntuone_installer/gui/qt/tests/test_setup_account.py (+11/-192)
To merge this branch: bzr merge lp:~diegosarmentero/ubuntuone-windows-installer/reset-password-page
Reviewer Review Type Date Requested Status
Natalia Bidart (community) Approve
Review via email: mp+73523@code.launchpad.net

Commit message

Reset Password Page Complete.

Description of the change

Reset Password Page Complete.

To post a comment you must log in.
46. By Diego Sarmentero

Changed utils.ui to common in setup_account and test_setup_account.
Merge.

Revision history for this message
Diego Sarmentero (diegosarmentero) wrote :
47. By Diego Sarmentero

Assigning bug.

Revision history for this message
Natalia Bidart (nataliabidart) wrote :

Looks good!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'ubuntuone_installer/gui/qt/setup_account.py'
--- ubuntuone_installer/gui/qt/setup_account.py 2011-08-31 16:23:45 +0000
+++ ubuntuone_installer/gui/qt/setup_account.py 2011-09-06 15:25:05 +0000
@@ -23,6 +23,7 @@
2323
24from PyQt4 import QtGui, QtCore24from PyQt4 import QtGui, QtCore
2525
26from ubuntu_sso.qt import common
26from ubuntu_sso.qt import gui as sso_gui27from ubuntu_sso.qt import gui as sso_gui
2728
28from ubuntuone_installer.gui.qt import enhanced_check_box29from ubuntuone_installer.gui.qt import enhanced_check_box
@@ -30,10 +31,7 @@
30_ = gettext.gettext31_ = gettext.gettext
3132
32# pylint: disable=C010333# pylint: disable=C0103
33BAD = u'<img src=":/password_hint_warning.png" /><font> %s </font>'
34ERROR = u'<font color="#df2d1f"><b> %s </b></font>'34ERROR = u'<font color="#df2d1f"><b> %s </b></font>'
35GOOD = u'<img src=":/password_hint_ok.png" /><font> %s </font>'
36NORMAL = u'<font> %s </font>'
37TITLE_STYLE = "<span style=\"font-size:24px\">%s</span>"35TITLE_STYLE = "<span style=\"font-size:24px\">%s</span>"
3836
39EMAIL = _("Email")37EMAIL = _("Email")
@@ -42,11 +40,6 @@
42EMAIL_MATCH = _("The email addresses do not match")40EMAIL_MATCH = _("The email addresses do not match")
43NAME = _("Name")41NAME = _("Name")
44PASSWORD = _("Create a password")42PASSWORD = _("Create a password")
45PASSWORD_LENGTH = _("At least 8 characters")
46PASSWORD_DIGIT = _("At least one number")
47PASSWORD_UPPER = _("At least one uppercase letter")
48PASSWORD_MATCH = _("Passwords don't match")
49PASSWORD_MUST_CONTAIN = _("Your password must contain")
50RETYPE_EMAIL = _("Retype email")43RETYPE_EMAIL = _("Retype email")
51RETYPE_PASSWORD = _("Retype password")44RETYPE_PASSWORD = _("Retype password")
52SUBTITLE = _("You only need to set up your account "45SUBTITLE = _("You only need to set up your account "
@@ -67,7 +60,9 @@
67 def __init__(self, *args, **kwargs):60 def __init__(self, *args, **kwargs):
68 super(SetupAccountPage, self).__init__(*args, **kwargs)61 super(SetupAccountPage, self).__init__(*args, **kwargs)
69 self.ui.password_edit.textEdited.connect(62 self.ui.password_edit.textEdited.connect(
70 lambda: self.password_assistance(NORMAL))63 lambda: common.password_assistance(self.ui.password_edit,
64 self.ui.password_assistance,
65 common.NORMAL))
71 terms = TERMS.format(terms_and_conditions=TERMS_LINK,66 terms = TERMS.format(terms_and_conditions=TERMS_LINK,
72 privacy_policy=PRIVACY_POLICY_LINK)67 privacy_policy=PRIVACY_POLICY_LINK)
73 self.terms_checkbox = enhanced_check_box.EnhancedCheckBox(terms)68 self.terms_checkbox = enhanced_check_box.EnhancedCheckBox(terms)
@@ -78,9 +73,15 @@
78 self.name_assistance,73 self.name_assistance,
79 self.email_assistance,74 self.email_assistance,
80 self.confirm_email_assistance,75 self.confirm_email_assistance,
81 self.password_check_match]76 self.password_check_match_wrapper]
82 self.set_up_button = None77 self.set_up_button = None
8378
79 def password_check_match_wrapper(self):
80 """Wrapper between validation_functions calls and utils function."""
81 common.password_check_match(self.ui.password_edit,
82 self.ui.confirm_password_edit,
83 self.ui.password_assistance)
84
84 # Invalid name "initializePage"85 # Invalid name "initializePage"
85 # pylint: disable=C010386 # pylint: disable=C0103
8687
@@ -114,7 +115,7 @@
114 QtGui.QWizard.Stretch,115 QtGui.QWizard.Stretch,
115 QtGui.QWizard.CustomButton3])116 QtGui.QWizard.CustomButton3])
116117
117 self.password_default_assistance()118 common.password_default_assistance(self.ui.password_assistance)
118 # Hide assistance labels by default119 # Hide assistance labels by default
119 self.ui.name_assistance.setVisible(False)120 self.ui.name_assistance.setVisible(False)
120 self.ui.email_assistance.setVisible(False)121 self.ui.email_assistance.setVisible(False)
@@ -145,10 +146,10 @@
145 if not text.strip():146 if not text.strip():
146 self.ui.name_assistance.setVisible(True)147 self.ui.name_assistance.setVisible(True)
147 self.ui.name_assistance.setText(ERROR % EMPTY_NAME)148 self.ui.name_assistance.setText(ERROR % EMPTY_NAME)
148 self.check_as_invalid(self.ui.name_edit)149 common.check_as_invalid(self.ui.name_edit)
149 else:150 else:
150 self.ui.name_assistance.setVisible(False)151 self.ui.name_assistance.setVisible(False)
151 self.check_as_valid(self.ui.name_edit)152 common.check_as_valid(self.ui.name_edit)
152153
153 def email_assistance(self):154 def email_assistance(self):
154 """Show help for the email field."""155 """Show help for the email field."""
@@ -156,10 +157,10 @@
156 if not is_correct_email(text):157 if not is_correct_email(text):
157 self.ui.email_assistance.setText(ERROR % INVALID_EMAIL)158 self.ui.email_assistance.setText(ERROR % INVALID_EMAIL)
158 self.ui.email_assistance.setVisible(True)159 self.ui.email_assistance.setVisible(True)
159 self.check_as_invalid(self.ui.email_edit)160 common.check_as_invalid(self.ui.email_edit)
160 else:161 else:
161 self.ui.email_assistance.setVisible(False)162 self.ui.email_assistance.setVisible(False)
162 self.check_as_valid(self.ui.email_edit)163 common.check_as_valid(self.ui.email_edit)
163164
164 def confirm_email_assistance(self):165 def confirm_email_assistance(self):
165 """Show help for the confirm email field."""166 """Show help for the confirm email field."""
@@ -168,67 +169,10 @@
168 if text1 != text2:169 if text1 != text2:
169 self.ui.confirm_email_assistance.setText(ERROR % EMAIL_MATCH)170 self.ui.confirm_email_assistance.setText(ERROR % EMAIL_MATCH)
170 self.ui.confirm_email_assistance.setVisible(True)171 self.ui.confirm_email_assistance.setVisible(True)
171 self.check_as_invalid(self.ui.confirm_email_edit)172 common.check_as_invalid(self.ui.confirm_email_edit)
172 else:173 else:
173 self.ui.confirm_email_assistance.setVisible(False)174 self.ui.confirm_email_assistance.setVisible(False)
174 self.check_as_valid(self.ui.confirm_email_edit)175 common.check_as_valid(self.ui.confirm_email_edit)
175
176 def password_assistance(self, icon_type=BAD):
177 """Show help for the password field."""
178 text1 = unicode(self.ui.password_edit.text())
179 label_text = ["<b>%s</b>" % PASSWORD_MUST_CONTAIN, ]
180
181 if len(text1) < 8:
182 sign = icon_type
183 else:
184 sign = GOOD
185 label_text.append(sign % PASSWORD_LENGTH)
186
187 if re.search('[A-Z]', text1) is None:
188 sign = icon_type
189 else:
190 sign = GOOD
191 label_text.append(sign % PASSWORD_UPPER)
192
193 if re.search('[\d+]', text1) is None:
194 sign = icon_type
195 else:
196 sign = GOOD
197 label_text.append(sign % PASSWORD_DIGIT)
198
199 self.ui.password_assistance.setText("<br>".join(label_text))
200
201 def password_check_match(self):
202 """Check if passwords match, otherwise show a message."""
203 self.password_assistance()
204 label_text = unicode(self.ui.password_assistance.text())
205 text1 = unicode(self.ui.password_edit.text())
206 text2 = unicode(self.ui.confirm_password_edit.text())
207 if text1 != text2:
208 label_text += "<br>" + BAD % PASSWORD_MATCH
209 self.ui.password_assistance.setText(label_text)
210
211 def password_default_assistance(self):
212 """Show default help for the password field."""
213 label_text = ["<b>%s</b>" % PASSWORD_MUST_CONTAIN, ]
214
215 label_text.append(NORMAL % PASSWORD_LENGTH)
216 label_text.append(NORMAL % PASSWORD_UPPER)
217 label_text.append(NORMAL % PASSWORD_DIGIT)
218
219 self.ui.password_assistance.setText("<br>".join(label_text))
220
221 def check_as_invalid(self, line_edit):
222 """Set QLineEdit's formError property as True, refresh the style."""
223 line_edit.setProperty("formError", True)
224 line_edit.style().unpolish(line_edit)
225 line_edit.style().polish(line_edit)
226
227 def check_as_valid(self, line_edit):
228 """Set QLineEdit's formError property as False, refresh the style."""
229 line_edit.setProperty("formError", False)
230 line_edit.style().unpolish(line_edit)
231 line_edit.style().polish(line_edit)
232176
233 def showEvent(self, event):177 def showEvent(self, event):
234 """Set set_up_button as default button when the page is shown."""178 """Set set_up_button as default button when the page is shown."""
235179
=== modified file 'ubuntuone_installer/gui/qt/tests/test_setup_account.py'
--- ubuntuone_installer/gui/qt/tests/test_setup_account.py 2011-08-30 16:09:00 +0000
+++ ubuntuone_installer/gui/qt/tests/test_setup_account.py 2011-09-06 15:25:05 +0000
@@ -22,6 +22,8 @@
2222
23from PyQt4 import QtGui, QtCore23from PyQt4 import QtGui, QtCore
2424
25from ubuntu_sso.qt import common
26
25from ubuntuone_installer.gui.qt import gui, setup_account27from ubuntuone_installer.gui.qt import gui, setup_account
26from ubuntuone_installer.gui.qt.tests import BaseTestCase28from ubuntuone_installer.gui.qt.tests import BaseTestCase
27from ubuntuone_installer.gui.qt.ui import (29from ubuntuone_installer.gui.qt.ui import (
@@ -135,103 +137,6 @@
135 setup_account.ERROR % setup_account.EMPTY_NAME)137 setup_account.ERROR % setup_account.EMPTY_NAME)
136 self.ui.hide()138 self.ui.hide()
137139
138 def test_short_password(self):
139 """Status with short password.
140
141 * Password assistance contains the right message.
142 """
143 self.ui.ui.password_edit.setText("foobar")
144 self.ui.password_assistance()
145 self.assertIn(
146 setup_account.BAD % setup_account.PASSWORD_LENGTH,
147 unicode(self.ui.ui.password_assistance.text()),
148 )
149
150 def test_long_password(self):
151 """Status with long password.
152
153 * Password assistance contains the right message.
154 """
155 self.ui.ui.password_edit.setText("foobarbaz")
156 self.ui.password_assistance()
157 self.assertIn(
158 setup_account.GOOD % setup_account.PASSWORD_LENGTH,
159 unicode(self.ui.ui.password_assistance.text()),
160 )
161
162 def test_no_number_password(self):
163 """Status with password without a number.
164
165 * Password assistance contains the right message.
166 """
167 self.ui.ui.password_edit.setText("foobarbaz")
168 self.ui.password_assistance()
169 self.assertIn(
170 setup_account.BAD % setup_account.PASSWORD_DIGIT,
171 unicode(self.ui.ui.password_assistance.text()),
172 )
173
174 def test_number_password(self):
175 """Status with password with a number.
176
177 * Password assistance contains the right message.
178 """
179 self.ui.ui.password_edit.setText("foobarba7")
180 self.ui.password_assistance()
181 self.assertIn(
182 setup_account.GOOD % setup_account.PASSWORD_DIGIT,
183 unicode(self.ui.ui.password_assistance.text()),
184 )
185
186 def test_no_uppercase_password(self):
187 """Status with password without uppercase letters.
188
189 * Password assistance contains the right message.
190 """
191 self.ui.ui.password_edit.setText("foobarbaz")
192 self.ui.password_assistance()
193 self.assertIn(
194 setup_account.BAD % setup_account.PASSWORD_UPPER,
195 unicode(self.ui.ui.password_assistance.text()),
196 )
197
198 def test_upper_password(self):
199 """Status with password with uppercase letters.
200
201 * Password assistance contains the right message.
202 """
203 self.ui.ui.password_edit.setText("Foobarba7")
204 self.ui.password_assistance()
205 self.assertIn(
206 setup_account.GOOD % setup_account.PASSWORD_UPPER,
207 unicode(self.ui.ui.password_assistance.text()),
208 )
209
210 def test_matching_passwords(self):
211 """Status when the passwords match.
212
213 * Password assistance doesn't contain the message.
214 """
215 self.ui.ui.password_edit.setText("Foobarba7")
216 self.ui.ui.confirm_password_edit.setText("Foobarba7")
217 self.ui.password_check_match()
218 self.assertNotIn(
219 setup_account.BAD % setup_account.PASSWORD_MATCH,
220 unicode(self.ui.ui.password_assistance.text()))
221
222 def test_not_matching_passwords(self):
223 """Status when the passwords not match.
224
225 * Password assistance contains the right message.
226 """
227 self.ui.ui.password_edit.setText("Foobarba7")
228 self.ui.ui.confirm_password_edit.setText("BazBarFo0")
229 self.ui.password_check_match()
230 self.assertIn(
231 setup_account.BAD % setup_account.PASSWORD_MATCH,
232 unicode(self.ui.ui.password_assistance.text()),
233 )
234
235 def test_password_default_assistance(self):140 def test_password_default_assistance(self):
236 """Status when the password line edit receive focus and shows popup.141 """Status when the password line edit receive focus and shows popup.
237142
@@ -242,91 +147,15 @@
242 self.ui.validate_data_on_focus_changed(4)147 self.ui.validate_data_on_focus_changed(4)
243 self.ui.focus_changed(None, self.ui.ui.password_edit)148 self.ui.focus_changed(None, self.ui.ui.password_edit)
244 self.assertIn(149 self.assertIn(
245 setup_account.NORMAL % setup_account.PASSWORD_LENGTH,150 common.NORMAL % common.PASSWORD_LENGTH,
246 unicode(self.ui.ui.password_assistance.text()),151 unicode(self.ui.ui.password_assistance.text()),
247 )152 )
248 self.assertIn(153 self.assertIn(
249 setup_account.NORMAL % setup_account.PASSWORD_UPPER,154 common.NORMAL % common.PASSWORD_UPPER,
250 unicode(self.ui.ui.password_assistance.text()),155 unicode(self.ui.ui.password_assistance.text()),
251 )156 )
252 self.assertIn(157 self.assertIn(
253 setup_account.NORMAL % setup_account.PASSWORD_DIGIT,158 common.NORMAL % common.PASSWORD_DIGIT,
254 unicode(self.ui.ui.password_assistance.text()),
255 )
256
257 def test_password_assistance_in_focus_length_correct(self):
258 """Check the QLineEdit for password when the length is correct."""
259 self.ui.ui.password_edit.setText("aaaaaaaaa")
260 self.ui.ui.confirm_password_edit.setText("")
261 self.ui.password_assistance(setup_account.NORMAL)
262 self.assertIn(
263 setup_account.GOOD % setup_account.PASSWORD_LENGTH,
264 unicode(self.ui.ui.password_assistance.text()),
265 )
266 self.assertIn(
267 setup_account.NORMAL % setup_account.PASSWORD_UPPER,
268 unicode(self.ui.ui.password_assistance.text()),
269 )
270 self.assertIn(
271 setup_account.NORMAL % setup_account.PASSWORD_DIGIT,
272 unicode(self.ui.ui.password_assistance.text()),
273 )
274
275 def test_password_assistance_in_focus_with_upper(self):
276 """Check the QLineEdit for password when it has an upper case char."""
277 self.ui.ui.password_edit.setText("AAa")
278 self.ui.ui.confirm_password_edit.setText("")
279 self.ui.password_assistance(setup_account.NORMAL)
280 self.assertIn(
281 setup_account.NORMAL % setup_account.PASSWORD_LENGTH,
282 unicode(self.ui.ui.password_assistance.text()),
283 )
284 self.assertIn(
285 setup_account.GOOD % setup_account.PASSWORD_UPPER,
286 unicode(self.ui.ui.password_assistance.text()),
287 )
288 self.assertIn(
289 setup_account.NORMAL % setup_account.PASSWORD_DIGIT,
290 unicode(self.ui.ui.password_assistance.text()),
291 )
292
293 def test_password_assistance_in_focus_with_number(self):
294 """Check the QLineEdit for password when it contains numbers."""
295 self.ui.ui.password_edit.setText("a123")
296 self.ui.ui.confirm_password_edit.setText("")
297 self.ui.password_assistance(setup_account.NORMAL)
298 self.assertIn(
299 setup_account.NORMAL % setup_account.PASSWORD_LENGTH,
300 unicode(self.ui.ui.password_assistance.text()),
301 )
302 self.assertIn(
303 setup_account.NORMAL % setup_account.PASSWORD_UPPER,
304 unicode(self.ui.ui.password_assistance.text()),
305 )
306 self.assertIn(
307 setup_account.GOOD % setup_account.PASSWORD_DIGIT,
308 unicode(self.ui.ui.password_assistance.text()),
309 )
310
311 def test_password_assistance_in_focus_all_ok(self):
312 """Check the QLineEdit for password when all the condition are ok."""
313 self.ui.ui.password_edit.setText("T3st3rqw")
314 self.ui.ui.confirm_password_edit.setText("T3st3rqw")
315 self.ui.password_assistance(setup_account.NORMAL)
316 self.assertIn(
317 setup_account.GOOD % setup_account.PASSWORD_LENGTH,
318 unicode(self.ui.ui.password_assistance.text()),
319 )
320 self.assertIn(
321 setup_account.GOOD % setup_account.PASSWORD_UPPER,
322 unicode(self.ui.ui.password_assistance.text()),
323 )
324 self.assertIn(
325 setup_account.GOOD % setup_account.PASSWORD_DIGIT,
326 unicode(self.ui.ui.password_assistance.text()),
327 )
328 self.assertNotIn(
329 setup_account.NORMAL % setup_account.PASSWORD_MATCH,
330 unicode(self.ui.ui.password_assistance.text()),159 unicode(self.ui.ui.password_assistance.text()),
331 )160 )
332161
@@ -343,16 +172,6 @@
343 self.ui.on_currentIdChanged(self.ui.CONGRATULATIONS_PAGE)172 self.ui.on_currentIdChanged(self.ui.CONGRATULATIONS_PAGE)
344 self.assertTrue(self.ui.sideWidget().ui.states_frame.isVisible())173 self.assertTrue(self.ui.sideWidget().ui.states_frame.isVisible())
345174
346 def test_check_valid(self):
347 """Check the propery value of a QLineEdit marked as valid."""
348 self.ui.check_as_valid(self.ui.ui.name_edit)
349 self.assertFalse(self.ui.ui.name_edit.property("formError").toBool())
350
351 def test_check_invalid(self):
352 """Check the propery value of a QLineEdit marked as invalid."""
353 self.ui.check_as_invalid(self.ui.ui.name_edit)
354 self.assertTrue(self.ui.ui.name_edit.property("formError").toBool())
355
356 def test_focus_changed_1(self):175 def test_focus_changed_1(self):
357 """Check functions execution when focus_changed() is executed."""176 """Check functions execution when focus_changed() is executed."""
358 self.patch(self.ui, 'validation_functions', FakeValidationDict())177 self.patch(self.ui, 'validation_functions', FakeValidationDict())

Subscribers

People subscribed via source and target branches