Merge lp:~nataliabidart/ubuntu-sso-client/reusable-headers into lp:ubuntu-sso-client
- reusable-headers
- Merge into trunk
Proposed by
Natalia Bidart
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Natalia Bidart | ||||
Approved revision: | 921 | ||||
Merged at revision: | 910 | ||||
Proposed branch: | lp:~nataliabidart/ubuntu-sso-client/reusable-headers | ||||
Merge into: | lp:ubuntu-sso-client | ||||
Diff against target: |
1257 lines (+391/-267) 19 files modified
data/qt/stylesheet.qss (+1/-7) run-tests (+1/-1) ubuntu_sso/qt/__init__.py (+26/-2) ubuntu_sso/qt/current_user_sign_in_page.py (+4/-6) ubuntu_sso/qt/email_verification_page.py (+1/-1) ubuntu_sso/qt/forgotten_password_page.py (+1/-1) ubuntu_sso/qt/reset_password_page.py (+1/-1) ubuntu_sso/qt/setup_account_page.py (+5/-5) ubuntu_sso/qt/sso_wizard_page.py (+101/-75) ubuntu_sso/qt/tests/__init__.py (+54/-6) ubuntu_sso/qt/tests/test_common.py (+49/-2) ubuntu_sso/qt/tests/test_current_user_sign_in_page.py (+4/-4) ubuntu_sso/qt/tests/test_email_verification.py (+6/-7) ubuntu_sso/qt/tests/test_forgotten_password.py (+3/-2) ubuntu_sso/qt/tests/test_loadingoverlay.py (+0/-3) ubuntu_sso/qt/tests/test_reset_password.py (+4/-14) ubuntu_sso/qt/tests/test_setup_account.py (+36/-65) ubuntu_sso/qt/tests/test_sso_wizard_page.py (+88/-59) ubuntu_sso/qt/tests/test_ubuntu_sso_wizard.py (+6/-6) |
||||
To merge this branch: | bzr merge lp:~nataliabidart/ubuntu-sso-client/reusable-headers | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Diego Sarmentero (community) | Approve | ||
Roberto Alsina (community) | Approve | ||
Review via email: mp+97129@code.launchpad.net |
Commit message
- The tooltip should not be shown for titles and subtitles when no cut off was
needed (LP: #949741).
- Making the WizardHeader a reusable class.
- Added some minor logging to build_general_
- Improved code for the 'sign in' button validation.
Description of the change
To post a comment you must log in.
- 914. By Natalia Bidart
-
Fixed tests.
- 915. By Natalia Bidart
-
Fixed lint issues.
- 916. By Natalia Bidart
-
Pep8 fixes.
- 917. By Natalia Bidart
-
Merged trunk in.
- 918. By Natalia Bidart
-
- Added some minor logging to build_general_
error_msg. - 919. By Natalia Bidart
-
- Do not hide the error when a new captcha is requested, since that will
immediatly hide a potential error shown from a just-failed registration
attempt. - 920. By Natalia Bidart
-
Revert error hiding and fiule bug for it.
- 921. By Natalia Bidart
-
- Improved code for 'sign in' button validation.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'data/qt/stylesheet.qss' |
2 | --- data/qt/stylesheet.qss 2012-03-05 20:30:57 +0000 |
3 | +++ data/qt/stylesheet.qss 2012-03-14 13:30:25 +0000 |
4 | @@ -95,17 +95,11 @@ |
5 | font-size: 20px; |
6 | } |
7 | |
8 | -QLabel#title_label { |
9 | - font-size: 20px; |
10 | -} |
11 | - |
12 | -QFrame#header { |
13 | +WizardHeader { |
14 | padding-top: 1px; |
15 | padding-bottom: 1px; |
16 | } |
17 | |
18 | QLabel#form_errors { |
19 | - font: bold 14px; |
20 | - color: #df2d1f; |
21 | padding-bottom: 1px; |
22 | } |
23 | |
24 | === modified file 'run-tests' |
25 | --- run-tests 2012-02-17 16:57:34 +0000 |
26 | +++ run-tests 2012-03-14 13:30:25 +0000 |
27 | @@ -57,7 +57,7 @@ |
28 | |
29 | echo "*** Running QT test suite for ""$MODULE"" ***" |
30 | ./setup.py build |
31 | -USE_QT_MAINLOOP=True $XVFB_CMDLINE u1trial --reactor=qt4 --gui -p "$GTK_TESTS_PATH" -i "test_windows.py" "$MODULE" |
32 | +$XVFB_CMDLINE u1trial --reactor=qt4 --gui -p "$GTK_TESTS_PATH" -i "test_windows.py" "$MODULE" |
33 | rm -rf _trial_temp |
34 | rm -rf build |
35 | |
36 | |
37 | === modified file 'ubuntu_sso/qt/__init__.py' |
38 | --- ubuntu_sso/qt/__init__.py 2012-03-12 14:03:08 +0000 |
39 | +++ ubuntu_sso/qt/__init__.py 2012-03-14 13:30:25 +0000 |
40 | @@ -18,20 +18,26 @@ |
41 | |
42 | import collections |
43 | |
44 | +from PyQt4 import QtGui, QtCore |
45 | + |
46 | +from ubuntu_sso.logger import setup_gui_logging |
47 | + |
48 | +logger = setup_gui_logging('ubuntu_sso.qt') |
49 | |
50 | LINK_STYLE = (u'<a href="{link_url}">' |
51 | '<span style="color:#df2d1f;">{link_text}</span></a>') |
52 | ERROR_ALL = '__all__' |
53 | -ERROR_STYLE = u'<font color="#df2d1f"><b>%s</b></font>' |
54 | +ERROR_STYLE = u'<font color="#df2d1f" style="font-size:small"><b>%s</b></font>' |
55 | ERROR_MESSAGE = 'message' |
56 | PREFERED_UI_SIZE = {'width': 550, 'height': 525} |
57 | -TITLE_STYLE = u'<span style="font-size:24px">%s</span>' |
58 | +TITLE_STYLE = u'<span style="font-size:xx-large">%s</span>' |
59 | WINDOW_TITLE = 'Ubuntu Single Sign On' |
60 | |
61 | |
62 | # Based on the gtk implementation |
63 | def build_general_error_message(errordict): |
64 | """Build a user-friendly error message from the errordict.""" |
65 | + logger.debug('build_general_error_message: errordict is: %r.', errordict) |
66 | result = '' |
67 | if isinstance(errordict, collections.Mapping): |
68 | msg1 = errordict.get(ERROR_ALL) |
69 | @@ -52,4 +58,22 @@ |
70 | [('%s: %s' % (k, v)) for k, v in errordict.iteritems()]) |
71 | else: |
72 | result = repr(errordict) |
73 | + |
74 | + logger.info('build_general_error_message: returning %r.', result) |
75 | return result |
76 | + |
77 | + |
78 | +def maybe_elide_text(label, text, width, markup=None): |
79 | + """Set 'text' to be the 'label's text. |
80 | + |
81 | + If 'text' is longer than 'width', set the label's tooltip to be the full |
82 | + text, and the text itself to be the elided version of 'text'. |
83 | + |
84 | + """ |
85 | + fm = QtGui.QFontMetrics(label.font()) |
86 | + elided_text = fm.elidedText(text, QtCore.Qt.ElideRight, width) |
87 | + if elided_text != text: |
88 | + label.setToolTip(text) |
89 | + if markup is not None: |
90 | + elided_text = markup % elided_text |
91 | + label.setText(elided_text) |
92 | |
93 | === modified file 'ubuntu_sso/qt/current_user_sign_in_page.py' |
94 | --- ubuntu_sso/qt/current_user_sign_in_page.py 2012-03-12 14:53:00 +0000 |
95 | +++ ubuntu_sso/qt/current_user_sign_in_page.py 2012-03-14 13:30:25 +0000 |
96 | @@ -119,12 +119,10 @@ |
97 | |
98 | def _validate(self): |
99 | """Perform input validation.""" |
100 | - valid = True |
101 | correct_mail = is_correct_email(unicode(self.ui.email_edit.text())) |
102 | - password = unicode(self.ui.password_edit.text()) |
103 | - if not correct_mail or not password: |
104 | - valid = False |
105 | - self.ui.sign_in_button.setEnabled(valid) |
106 | + correct_password = len(unicode(self.ui.password_edit.text())) > 0 |
107 | + enabled = correct_mail and correct_password |
108 | + self.ui.sign_in_button.setEnabled(enabled) |
109 | |
110 | def login(self): |
111 | """Perform the login using the self.backend.""" |
112 | @@ -149,7 +147,7 @@ |
113 | # let the user know |
114 | logger.error('Got error when login %s, error: %s', |
115 | self.app_name, error) |
116 | - self.show_error(self.app_name, build_general_error_message(error)) |
117 | + self.show_error(build_general_error_message(error)) |
118 | |
119 | def on_logged_in(self, app_name, result): |
120 | """We managed to log in.""" |
121 | |
122 | === modified file 'ubuntu_sso/qt/email_verification_page.py' |
123 | --- ubuntu_sso/qt/email_verification_page.py 2012-03-09 17:27:30 +0000 |
124 | +++ ubuntu_sso/qt/email_verification_page.py 2012-03-14 13:30:25 +0000 |
125 | @@ -134,7 +134,7 @@ |
126 | self.hide_overlay() |
127 | msg = error.pop(ERROR_EMAIL_TOKEN, '') |
128 | msg += build_general_error_message(error) |
129 | - self.show_error(self.app_name, msg) |
130 | + self.show_error(msg) |
131 | |
132 | # pylint: disable=C0103 |
133 | |
134 | |
135 | === modified file 'ubuntu_sso/qt/forgotten_password_page.py' |
136 | --- ubuntu_sso/qt/forgotten_password_page.py 2012-03-09 17:27:30 +0000 |
137 | +++ ubuntu_sso/qt/forgotten_password_page.py 2012-03-14 13:30:25 +0000 |
138 | @@ -127,4 +127,4 @@ |
139 | # set the error message |
140 | self.hide_overlay() |
141 | msg = REQUEST_PASSWORD_TOKEN_WRONG_EMAIL |
142 | - self.show_error(self.app_name, msg) |
143 | + self.show_error(msg) |
144 | |
145 | === modified file 'ubuntu_sso/qt/reset_password_page.py' |
146 | --- ubuntu_sso/qt/reset_password_page.py 2012-03-09 17:27:30 +0000 |
147 | +++ ubuntu_sso/qt/reset_password_page.py 2012-03-14 13:30:25 +0000 |
148 | @@ -169,7 +169,7 @@ |
149 | """Let the user know that there was an error.""" |
150 | logger.error('Got error changing password for %s, error: %s', |
151 | self.app_name, error) |
152 | - self.show_error(self.app_name, build_general_error_message(error)) |
153 | + self.show_error(build_general_error_message(error)) |
154 | |
155 | def set_new_password(self): |
156 | """Request a new password to be set.""" |
157 | |
158 | === modified file 'ubuntu_sso/qt/setup_account_page.py' |
159 | --- ubuntu_sso/qt/setup_account_page.py 2012-03-13 20:33:06 +0000 |
160 | +++ ubuntu_sso/qt/setup_account_page.py 2012-03-14 13:30:25 +0000 |
161 | @@ -322,10 +322,10 @@ |
162 | self.captcha_image = pixmap_image |
163 | self.on_captcha_refresh_complete() |
164 | |
165 | - def on_captcha_generation_error(self, error, *args, **kwargs): |
166 | + @log_call(logger.error) |
167 | + def on_captcha_generation_error(self, app_name, error): |
168 | """An error ocurred.""" |
169 | - logger.error('Got error on captcha generation: %s', error) |
170 | - self.show_error(self.app_name, CAPTCHA_LOAD_ERROR) |
171 | + self.show_error(CAPTCHA_LOAD_ERROR) |
172 | self.on_captcha_refresh_complete() |
173 | |
174 | @log_call(logger.error) |
175 | @@ -337,7 +337,7 @@ |
176 | self.set_error_message(self.ui.email_assistance, msg) |
177 | error_msg = build_general_error_message(error) |
178 | if error_msg: |
179 | - self.show_error(self.app_name, error_msg) |
180 | + self.show_error(error_msg) |
181 | self._refresh_captcha() |
182 | |
183 | @log_call(logger.info) |
184 | @@ -378,7 +378,7 @@ |
185 | messages.append(CAPTCHA_REQUIRED_ERROR) |
186 | if len(messages) > 0: |
187 | condition = False |
188 | - self.show_error(self.app_name, '\n'.join(messages)) |
189 | + self.show_error('\n'.join(messages)) |
190 | return condition |
191 | |
192 | def set_next_validation(self): |
193 | |
194 | === modified file 'ubuntu_sso/qt/sso_wizard_page.py' |
195 | --- ubuntu_sso/qt/sso_wizard_page.py 2012-03-12 14:53:00 +0000 |
196 | +++ ubuntu_sso/qt/sso_wizard_page.py 2012-03-14 13:30:25 +0000 |
197 | @@ -23,31 +23,38 @@ |
198 | QApplication, |
199 | QCursor, |
200 | QFrame, |
201 | - QFontMetrics, |
202 | QHBoxLayout, |
203 | + QLabel, |
204 | + QStyle, |
205 | QVBoxLayout, |
206 | - QStyle, |
207 | QWizardPage, |
208 | - QLabel, |
209 | ) |
210 | from twisted.internet import defer |
211 | |
212 | from ubuntu_sso import main |
213 | from ubuntu_sso.logger import setup_gui_logging, log_call |
214 | -from ubuntu_sso.qt import PREFERED_UI_SIZE, TITLE_STYLE |
215 | +from ubuntu_sso.qt import ( |
216 | + ERROR_STYLE, |
217 | + maybe_elide_text, |
218 | + PREFERED_UI_SIZE, |
219 | + TITLE_STYLE, |
220 | +) |
221 | from ubuntu_sso.utils.ui import GENERIC_BACKEND_ERROR |
222 | |
223 | |
224 | logger = setup_gui_logging('ubuntu_sso.sso_wizard_page') |
225 | |
226 | |
227 | -class Header(QFrame): |
228 | - """Header Class for Title and Subtitle in all wizard pages.""" |
229 | +class WizardHeader(QFrame): |
230 | + """WizardHeader Class for Title and Subtitle in all wizard pages.""" |
231 | |
232 | - def __init__(self): |
233 | + def __init__(self, max_width, parent=None): |
234 | """Create a new instance.""" |
235 | - super(Header, self).__init__() |
236 | - self.setObjectName('header') |
237 | + super(WizardHeader, self).__init__(parent=parent) |
238 | + self.max_width = max_width |
239 | + self.max_title_width = self.max_width * 0.95 |
240 | + self.max_subtitle_width = self.max_width * 1.8 |
241 | + |
242 | vbox = QVBoxLayout(self) |
243 | vbox.setContentsMargins(0, 0, 0, 0) |
244 | self.title_label = QLabel() |
245 | @@ -64,11 +71,8 @@ |
246 | def set_title(self, title): |
247 | """Set the Title of the page or hide it otherwise""" |
248 | if title: |
249 | - fm = QFontMetrics(self.subtitle_label.font()) |
250 | - width = PREFERED_UI_SIZE['width'] * 0.95 |
251 | - elided_text = fm.elidedText(title, Qt.ElideRight, width) |
252 | - self.title_label.setToolTip(title) |
253 | - self.title_label.setText(elided_text) |
254 | + maybe_elide_text(self.title_label, title, self.max_title_width, |
255 | + markup=TITLE_STYLE) |
256 | self.title_label.setVisible(True) |
257 | else: |
258 | self.title_label.setVisible(False) |
259 | @@ -76,28 +80,23 @@ |
260 | def set_subtitle(self, subtitle): |
261 | """Set the Subtitle of the page or hide it otherwise""" |
262 | if subtitle: |
263 | - fm = QFontMetrics(self.subtitle_label.font()) |
264 | - width = PREFERED_UI_SIZE['width'] * 1.8 |
265 | - elided_text = fm.elidedText(subtitle, Qt.ElideRight, width) |
266 | - self.subtitle_label.setText(elided_text) |
267 | - self.subtitle_label.setToolTip(subtitle) |
268 | + maybe_elide_text(self.subtitle_label, subtitle, |
269 | + self.max_subtitle_width) |
270 | self.subtitle_label.setVisible(True) |
271 | else: |
272 | self.subtitle_label.setVisible(False) |
273 | |
274 | |
275 | -class SSOWizardPage(QWizardPage): |
276 | - """Root class for all wizard pages.""" |
277 | +class BaseWizardPage(QWizardPage): |
278 | + """Base class for all wizard pages.""" |
279 | |
280 | ui_class = None |
281 | - _signals = {} # override in children |
282 | + max_width = 0 |
283 | processingStarted = pyqtSignal() |
284 | processingFinished = pyqtSignal() |
285 | |
286 | - def __init__(self, app_name, **kwargs): |
287 | - """Create a new instance.""" |
288 | - parent = kwargs.pop('parent', None) |
289 | - super(SSOWizardPage, self).__init__(parent=parent) |
290 | + def __init__(self, parent=None): |
291 | + super(BaseWizardPage, self).__init__(parent=parent) |
292 | |
293 | self.ui = None |
294 | if self.ui_class is not None: |
295 | @@ -105,55 +104,108 @@ |
296 | self.ui = self.ui_class() |
297 | self.ui.setupUi(self) |
298 | |
299 | - # store common useful data provided by the app |
300 | - self.app_name = app_name |
301 | - self.ping_url = kwargs.get('ping_url', '') |
302 | - self.tc_url = kwargs.get('tc_url', '') |
303 | - self.policy_url = kwargs.get('policy_url', '') |
304 | - self.help_text = kwargs.get('help_text', '') |
305 | + if self.layout() is None: |
306 | + self.setLayout(QVBoxLayout(self)) |
307 | |
308 | # Set the error area |
309 | - self.form_errors_label = QLabel(' ') |
310 | + self.form_errors_label = QLabel() |
311 | self.form_errors_label.setObjectName('form_errors') |
312 | self.form_errors_label.setAlignment(Qt.AlignBottom) |
313 | self.layout().insertWidget(0, self.form_errors_label) |
314 | + |
315 | # Set the header |
316 | - self.header = Header() |
317 | + self.header = WizardHeader(max_width=self.max_width) |
318 | self.header.set_title(title='') |
319 | self.header.set_subtitle(subtitle='') |
320 | self.layout().insertWidget(0, self.header) |
321 | - self._signals_receivers = {} |
322 | - self.backend = None |
323 | |
324 | self.layout().setAlignment(Qt.AlignLeft) |
325 | |
326 | - self.setup_page() |
327 | + self._is_processing = False |
328 | + |
329 | + def _get_is_processing(self): |
330 | + """Is this widget processing any request?""" |
331 | + return self._is_processing |
332 | + |
333 | + def _set_is_processing(self, new_value): |
334 | + """Set this widget to be processing a request.""" |
335 | + self._is_processing = new_value |
336 | + self.setEnabled(not new_value) |
337 | + if not self._is_processing: |
338 | + self.processingFinished.emit() |
339 | + else: |
340 | + self.processingStarted.emit() |
341 | + |
342 | + is_processing = property(fget=_get_is_processing, fset=_set_is_processing) |
343 | + |
344 | + # pylint: disable=C0103 |
345 | + |
346 | + def cleanupPage(self): |
347 | + """Hide the errors.""" |
348 | + self.hide_error() |
349 | + |
350 | + def setTitle(self, title=''): |
351 | + """Set the Wizard Page Title.""" |
352 | + self.header.set_title(title) |
353 | + |
354 | + def setSubTitle(self, subtitle=''): |
355 | + """Set the Wizard Page Subtitle.""" |
356 | + self.header.set_subtitle(subtitle) |
357 | + |
358 | + def title(self): |
359 | + """Return the header's title.""" |
360 | + return self.header.title_label.text() |
361 | + |
362 | + def subTitle(self): |
363 | + """Return the header's subtitle.""" |
364 | + return self.header.subtitle_label.text() |
365 | + |
366 | + # pylint: enable=C0103 |
367 | |
368 | @log_call(logger.error) |
369 | - def show_error(self, app_name, message): |
370 | + def show_error(self, message): |
371 | """Show an error message inside the page.""" |
372 | - self.hide_overlay() |
373 | - fm = QFontMetrics(self.form_errors_label.font()) |
374 | - width = PREFERED_UI_SIZE['width'] * 0.95 |
375 | - elided_text = fm.elidedText(message, Qt.ElideRight, width) |
376 | - self.form_errors_label.setText(elided_text) |
377 | - self.form_errors_label.setToolTip(message) |
378 | + self.is_processing = False |
379 | + maybe_elide_text(self.form_errors_label, message, |
380 | + self.max_width * 0.95, markup=ERROR_STYLE) |
381 | |
382 | def hide_error(self): |
383 | """Hide the label errors in the current page.""" |
384 | - # We actually want the label with one chat, because if it is an |
385 | + # We actually want the label with one empty char, because if it is an |
386 | # empty string, the height of the label is 0 |
387 | self.form_errors_label.setText(' ') |
388 | |
389 | + |
390 | +class SSOWizardPage(BaseWizardPage): |
391 | + """Root class for all SSO specific wizard pages.""" |
392 | + |
393 | + _signals = {} # override in children |
394 | + max_width = PREFERED_UI_SIZE['width'] |
395 | + |
396 | + def __init__(self, app_name, **kwargs): |
397 | + """Create a new instance.""" |
398 | + parent = kwargs.pop('parent', None) |
399 | + super(SSOWizardPage, self).__init__(parent=parent) |
400 | + |
401 | + # store common useful data provided by the app |
402 | + self.app_name = app_name |
403 | + self.ping_url = kwargs.get('ping_url', '') |
404 | + self.tc_url = kwargs.get('tc_url', '') |
405 | + self.policy_url = kwargs.get('policy_url', '') |
406 | + self.help_text = kwargs.get('help_text', '') |
407 | + |
408 | + self._signals_receivers = {} |
409 | + self.backend = None |
410 | + |
411 | + self.setup_page() |
412 | + |
413 | def hide_overlay(self): |
414 | """Emit the signal to notify the upper container that ends loading.""" |
415 | - self.setEnabled(True) |
416 | - self.processingFinished.emit() |
417 | + self.is_processing = False |
418 | |
419 | def show_overlay(self): |
420 | """Emit the signal to notify the upper container that is loading.""" |
421 | - self.setEnabled(False) |
422 | - self.processingStarted.emit() |
423 | + self.is_processing = True |
424 | |
425 | @defer.inlineCallbacks |
426 | def setup_page(self): |
427 | @@ -165,30 +217,6 @@ |
428 | self._set_translated_strings() |
429 | self._connect_ui() |
430 | |
431 | - # pylint: disable=C0103 |
432 | - |
433 | - def cleanupPage(self): |
434 | - """Hide the errors.""" |
435 | - self.hide_error() |
436 | - |
437 | - def setTitle(self, title=''): |
438 | - """Set the Wizard Page Title.""" |
439 | - self.header.set_title(TITLE_STYLE % title) |
440 | - |
441 | - def setSubTitle(self, subtitle=''): |
442 | - """Set the Wizard Page Subtitle.""" |
443 | - self.header.set_subtitle(subtitle) |
444 | - |
445 | - def title(self): |
446 | - """Return the header's title.""" |
447 | - return self.header.title_label.text() |
448 | - |
449 | - def subTitle(self): |
450 | - """Return the header's subtitle.""" |
451 | - return self.header.subtitle_label.text() |
452 | - |
453 | - # pylint: enable=C0103 |
454 | - |
455 | def _filter_by_app_name(self, f): |
456 | """Excecute the decorated function only for 'self.app_name'.""" |
457 | |
458 | @@ -219,11 +247,9 @@ |
459 | |
460 | def _set_translated_strings(self): |
461 | """Implement in each child.""" |
462 | - raise NotImplementedError() |
463 | |
464 | def _connect_ui(self): |
465 | """Implement in each child.""" |
466 | - raise NotImplementedError() |
467 | |
468 | def _handle_error(self, remote_call, handler, error): |
469 | """Handle any error when calling the remote backend.""" |
470 | |
471 | === modified file 'ubuntu_sso/qt/tests/__init__.py' |
472 | --- ubuntu_sso/qt/tests/__init__.py 2012-03-05 21:18:15 +0000 |
473 | +++ ubuntu_sso/qt/tests/__init__.py 2012-03-14 13:30:25 +0000 |
474 | @@ -21,7 +21,7 @@ |
475 | from twisted.trial.unittest import TestCase |
476 | |
477 | from ubuntu_sso import main, NO_OP |
478 | -from ubuntu_sso.qt import TITLE_STYLE |
479 | +from ubuntu_sso.qt import ERROR_STYLE, maybe_elide_text, TITLE_STYLE |
480 | from ubuntu_sso.tests import ( |
481 | APP_NAME, |
482 | HELP_TEXT, |
483 | @@ -38,6 +38,15 @@ |
484 | # pylint: disable=W0212 |
485 | |
486 | |
487 | +def build_string_for_pixels(label, width): |
488 | + """Return a random string that will be as big as with in pixels.""" |
489 | + char = 'a' |
490 | + fm = QtGui.QFontMetrics(label.font()) |
491 | + pixel_width = fm.width(char) |
492 | + chars = int(width / pixel_width) |
493 | + return char * chars |
494 | + |
495 | + |
496 | class FakedObject(object): |
497 | """Fake an object, record every call.""" |
498 | |
499 | @@ -439,6 +448,9 @@ |
500 | self.wizard = self.ui_wizard_class() |
501 | self.patch(self.ui, 'wizard', lambda: self.wizard) |
502 | |
503 | + self.ui.show() |
504 | + self.addCleanup(self.ui.hide) |
505 | + |
506 | def _set_called(self, *args, **kwargs): |
507 | """Store 'args' and 'kwargs' for test assertions.""" |
508 | self._called = (args, kwargs) |
509 | @@ -467,6 +479,38 @@ |
510 | |
511 | self.assertEqual(self.signal_results, [signal_args]) |
512 | |
513 | + def assert_title_correct(self, title_label, expected, max_width): |
514 | + """Check that the label's text is equal to 'expected'.""" |
515 | + label = QtGui.QLabel() |
516 | + maybe_elide_text(label, expected, max_width) |
517 | + |
518 | + self.assertEqual(TITLE_STYLE % unicode(label.text()), |
519 | + unicode(title_label.text())) |
520 | + self.assertEqual(unicode(label.toolTip()), |
521 | + unicode(title_label.toolTip())) |
522 | + self.assertTrue(title_label.isVisible()) |
523 | + |
524 | + def assert_subtitle_correct(self, subtitle_label, expected, max_width): |
525 | + """Check that the subtitle is equal to 'expected'.""" |
526 | + label = QtGui.QLabel() |
527 | + maybe_elide_text(label, expected, max_width) |
528 | + |
529 | + self.assertEqual(unicode(label.text()), unicode(subtitle_label.text())) |
530 | + self.assertEqual(unicode(label.toolTip()), |
531 | + unicode(subtitle_label.toolTip())) |
532 | + self.assertTrue(subtitle_label.isVisible()) |
533 | + |
534 | + def assert_error_correct(self, error_label, expected, max_width): |
535 | + """Check that the error 'error_label' displays 'expected' as text.""" |
536 | + label = QtGui.QLabel() |
537 | + maybe_elide_text(label, expected, max_width) |
538 | + |
539 | + self.assertEqual(ERROR_STYLE % unicode(label.text()), |
540 | + unicode(error_label.text())) |
541 | + self.assertEqual(unicode(label.toolTip()), |
542 | + unicode(error_label.toolTip())) |
543 | + self.assertTrue(error_label.isVisible()) |
544 | + |
545 | def get_pixmap_data(self, pixmap): |
546 | """Get the raw data of a QPixmap.""" |
547 | byte_array = QtCore.QByteArray() |
548 | @@ -550,14 +594,18 @@ |
549 | self.assertEqual(self._overlay_hide_counter, 1) |
550 | self.assertTrue(self.ui.isEnabled()) |
551 | |
552 | + # pylint: disable=W0221 |
553 | + |
554 | def assert_title_correct(self, expected): |
555 | """Check that the title is equal to 'expected'.""" |
556 | - self.assertEqual(TITLE_STYLE % expected, unicode(self.ui.title())) |
557 | + check = super(PageBaseTestCase, self).assert_title_correct |
558 | + check(self.ui.header.title_label, expected, |
559 | + self.ui.header.max_title_width) |
560 | |
561 | def assert_subtitle_correct(self, expected): |
562 | """Check that the subtitle is equal to 'expected'.""" |
563 | - elided_text = unicode(self.ui.subTitle()) |
564 | - elided_text = elided_text[:len(elided_text) - 1] |
565 | + check = super(PageBaseTestCase, self).assert_subtitle_correct |
566 | + check(self.ui.header.subtitle_label, expected, |
567 | + self.ui.header.max_subtitle_width) |
568 | |
569 | - self.assertTrue(expected.startswith(elided_text)) |
570 | - self.assertEqual(self.ui.header.subtitle_label.toolTip(), expected) |
571 | + # pylint: enable=W0221 |
572 | |
573 | === modified file 'ubuntu_sso/qt/tests/test_common.py' |
574 | --- ubuntu_sso/qt/tests/test_common.py 2011-10-28 10:41:18 +0000 |
575 | +++ ubuntu_sso/qt/tests/test_common.py 2012-03-14 13:30:25 +0000 |
576 | @@ -20,7 +20,9 @@ |
577 | from twisted.internet import defer |
578 | from twisted.trial.unittest import TestCase |
579 | |
580 | -from ubuntu_sso.qt.common import (check_as_invalid, |
581 | +from ubuntu_sso.qt import maybe_elide_text |
582 | +from ubuntu_sso.qt.common import ( |
583 | + check_as_invalid, |
584 | check_as_valid, |
585 | password_assistance, |
586 | password_check_match, |
587 | @@ -30,7 +32,9 @@ |
588 | PASSWORD_DIGIT, |
589 | PASSWORD_LENGTH, |
590 | PASSWORD_MATCH, |
591 | - PASSWORD_UPPER) |
592 | + PASSWORD_UPPER, |
593 | +) |
594 | +from ubuntu_sso.qt.tests import build_string_for_pixels |
595 | |
596 | |
597 | class PasswordTestCase(TestCase): |
598 | @@ -234,3 +238,46 @@ |
599 | line_edit = QtGui.QLineEdit() |
600 | check_as_invalid(line_edit) |
601 | self.assertTrue(line_edit.property("formError").toBool()) |
602 | + |
603 | + |
604 | +class ElidedTextTestCase(TestCase): |
605 | + """The test case for the maybe_elide_text function.""" |
606 | + |
607 | + max_width = 100 |
608 | + |
609 | + @defer.inlineCallbacks |
610 | + def setUp(self): |
611 | + """Setup tests.""" |
612 | + yield super(ElidedTextTestCase, self).setUp() |
613 | + self.ui = QtGui.QLabel() |
614 | + |
615 | + def test_text_not_elided_if_too_short(self): |
616 | + """If text is shorter than max_width, do not elide.""" |
617 | + text = build_string_for_pixels(self.ui, self.max_width - 1) |
618 | + |
619 | + maybe_elide_text(self.ui, text, self.max_width) |
620 | + |
621 | + self.assertEqual(self.ui.toolTip(), '') |
622 | + self.assertEqual(self.ui.text(), text) |
623 | + self.assertNotIn(u'\u2026', self.ui.text()) |
624 | + |
625 | + def test_text_not_elided_if_equals_max_width(self): |
626 | + """If text is equal than max_width, do not elide.""" |
627 | + text = build_string_for_pixels(self.ui, self.max_width) |
628 | + |
629 | + maybe_elide_text(self.ui, text, self.max_width) |
630 | + |
631 | + self.assertEqual(self.ui.toolTip(), '') |
632 | + self.assertEqual(self.ui.text(), text) |
633 | + self.assertNotIn(u'\u2026', self.ui.text()) |
634 | + |
635 | + def test_text_elided_if_bigger_than_max_width(self): |
636 | + """If text is equal than max_width, do not elide.""" |
637 | + text = build_string_for_pixels(self.ui, self.max_width + 10) |
638 | + |
639 | + maybe_elide_text(self.ui, text, self.max_width) |
640 | + |
641 | + self.assertEqual(self.ui.toolTip(), text) |
642 | + expected = unicode(self.ui.text()) |
643 | + self.assertTrue(expected.endswith(u'\u2026')) |
644 | + self.assertTrue(text.startswith(expected[:-1])) |
645 | |
646 | === modified file 'ubuntu_sso/qt/tests/test_current_user_sign_in_page.py' |
647 | --- ubuntu_sso/qt/tests/test_current_user_sign_in_page.py 2012-03-12 19:47:07 +0000 |
648 | +++ ubuntu_sso/qt/tests/test_current_user_sign_in_page.py 2012-03-14 13:30:25 +0000 |
649 | @@ -142,13 +142,13 @@ |
650 | def test_on_login_error(self): |
651 | """Test the on_login_error method.""" |
652 | self.patch(self.ui, "show_error", self._set_called) |
653 | - app_name = 'my_app' |
654 | - self.ui.app_name = app_name |
655 | error = {'errtype': 'UserNotValidated'} |
656 | - self.ui.on_login_error(app_name, error) |
657 | + |
658 | + self.ui.on_login_error(self.app_name, error) |
659 | + |
660 | self.assertEqual(self._overlay_hide_counter, 0) |
661 | self.assertTrue(self.ui.isEnabled()) |
662 | - expected = ((self.ui, 'my_app', ''), {}) |
663 | + expected = ((self.ui, self.app_name, ''), {}) |
664 | self.assertTrue(expected, self._called) |
665 | |
666 | def test_on_logged_in(self): |
667 | |
668 | === modified file 'ubuntu_sso/qt/tests/test_email_verification.py' |
669 | --- ubuntu_sso/qt/tests/test_email_verification.py 2012-03-12 19:47:07 +0000 |
670 | +++ ubuntu_sso/qt/tests/test_email_verification.py 2012-03-14 13:30:25 +0000 |
671 | @@ -78,14 +78,12 @@ |
672 | email = 'mail@example' |
673 | self.ui.email = email |
674 | self.ui.set_titles(email) |
675 | - self.assertEqual(unicode(self.ui.header.title_label.text()), |
676 | - email_verification_page.VERIFY_EMAIL_TITLE) |
677 | + self.assert_title_correct(email_verification_page.VERIFY_EMAIL_TITLE) |
678 | expected = email_verification_page.VERIFY_EMAIL_CONTENT % { |
679 | "app_name": self.app_name, |
680 | "email": email, |
681 | } |
682 | - self.assertEqual(unicode(self.ui.header.subtitle_label.toolTip()), |
683 | - expected) |
684 | + self.assert_subtitle_correct(expected) |
685 | |
686 | def test_initialize_page(self): |
687 | """Test the initialization method.""" |
688 | @@ -100,10 +98,11 @@ |
689 | def test_on_email_validation_error(self): |
690 | """Test the validate_email method.""" |
691 | self.patch(self.ui, "show_error", self._set_called) |
692 | - app_name = 'my_app' |
693 | error = {email_verification_page: 'error in email_verification_page'} |
694 | - self.ui.on_email_validation_error(app_name, error) |
695 | - expected = ((self.ui, app_name, ''), {}) |
696 | + |
697 | + self.ui.on_email_validation_error(self.app_name, error) |
698 | + |
699 | + expected = ((self.ui, ''), {}) |
700 | self.assertTrue(expected, self._called) |
701 | self.assertEqual(self._overlay_hide_counter, 1) |
702 | |
703 | |
704 | === modified file 'ubuntu_sso/qt/tests/test_forgotten_password.py' |
705 | --- ubuntu_sso/qt/tests/test_forgotten_password.py 2012-03-12 19:47:07 +0000 |
706 | +++ ubuntu_sso/qt/tests/test_forgotten_password.py 2012-03-14 13:30:25 +0000 |
707 | @@ -113,7 +113,8 @@ |
708 | """Test on_password_reset_error method.""" |
709 | self.patch(self.ui, "show_error", self._set_called) |
710 | error = {'errtype': 'FooBarBaz'} |
711 | + |
712 | self.ui.on_password_reset_error(self.app_name, error) |
713 | - expected = ((self.ui, self.app_name, |
714 | - gui.REQUEST_PASSWORD_TOKEN_WRONG_EMAIL), {}) |
715 | + |
716 | + expected = ((self.ui, gui.REQUEST_PASSWORD_TOKEN_WRONG_EMAIL), {}) |
717 | self.assertTrue(expected, self._called) |
718 | |
719 | === modified file 'ubuntu_sso/qt/tests/test_loadingoverlay.py' |
720 | --- ubuntu_sso/qt/tests/test_loadingoverlay.py 2012-02-23 19:49:02 +0000 |
721 | +++ ubuntu_sso/qt/tests/test_loadingoverlay.py 2012-03-14 13:30:25 +0000 |
722 | @@ -29,8 +29,5 @@ |
723 | |
724 | def test_status_correct(self): |
725 | """Test if the necessary variables for the animation exists""" |
726 | - self.ui.show() |
727 | - self.addCleanup(self.ui.hide) |
728 | - |
729 | self.assertTrue(self.ui.counter is not None) |
730 | self.assertTrue(self.ui.orientation is not None) |
731 | |
732 | === modified file 'ubuntu_sso/qt/tests/test_reset_password.py' |
733 | --- ubuntu_sso/qt/tests/test_reset_password.py 2012-03-12 19:47:07 +0000 |
734 | +++ ubuntu_sso/qt/tests/test_reset_password.py 2012-03-14 13:30:25 +0000 |
735 | @@ -70,9 +70,7 @@ |
736 | |
737 | def test_initialize(self): |
738 | """Check the Title and Subtitle.""" |
739 | - self.ui.show() |
740 | self.ui.initializePage() |
741 | - self.addCleanup(self.ui.hide) |
742 | self.assert_title_correct(RESET_TITLE) |
743 | self.assert_subtitle_correct(RESET_SUBTITLE) |
744 | self.assertEqual(unicode(self.ui.ui.password_label.text()), |
745 | @@ -84,15 +82,11 @@ |
746 | |
747 | def test_focus_changed_password_visibility(self): |
748 | """Check visibility changes when focus_changed() is executed.""" |
749 | - self.ui.show() |
750 | - self.addCleanup(self.ui.hide) |
751 | self.ui.focus_changed(None, self.ui.ui.password_line_edit) |
752 | self.assertTrue(self.ui.ui.password_assistance.isVisible()) |
753 | |
754 | def test_show_hide_event(self): |
755 | """Check connections to focusChanged on show and hide event.""" |
756 | - self.ui.show() |
757 | - self.addCleanup(self.ui.hide) |
758 | self.assertEqual(QtGui.QApplication.instance().receivers( |
759 | QtCore.SIGNAL("focusChanged(QWidget*, QWidget*)")), 1) |
760 | self.ui.hide() |
761 | @@ -104,24 +98,20 @@ |
762 | def test_focus_changed_1(self): |
763 | """Check functions execution when focus_changed() is executed.""" |
764 | self.patch(common, 'password_default_assistance', self._set_called) |
765 | - |
766 | - self.ui.show() |
767 | - self.addCleanup(self.ui.hide) |
768 | - |
769 | self.assertFalse(self._called) |
770 | + |
771 | self.ui.focus_changed(None, self.ui.ui.password_line_edit) |
772 | + |
773 | self.assertTrue(self.ui.ui.password_assistance.isVisible()) |
774 | self.assertTrue(self._called) |
775 | |
776 | def test_focus_changed_2(self): |
777 | """Check functions execution when focus_changed() is executed.""" |
778 | self.patch(common, 'password_check_match', self._set_called) |
779 | - |
780 | - self.ui.show() |
781 | - self.addCleanup(self.ui.hide) |
782 | - |
783 | self.assertFalse(self._called) |
784 | + |
785 | self.ui.focus_changed(None, self.ui.ui.confirm_password_line_edit) |
786 | + |
787 | self.assertTrue(self.ui.ui.password_assistance.isVisible()) |
788 | self.assertTrue(self._called) |
789 | |
790 | |
791 | === modified file 'ubuntu_sso/qt/tests/test_setup_account.py' |
792 | --- ubuntu_sso/qt/tests/test_setup_account.py 2012-03-12 19:47:07 +0000 |
793 | +++ ubuntu_sso/qt/tests/test_setup_account.py 2012-03-14 13:30:25 +0000 |
794 | @@ -43,13 +43,9 @@ |
795 | """ |
796 | self.ui.ui.name_edit.setText("") |
797 | self.ui.name_assistance() |
798 | - self.ui.show() |
799 | - self.addCleanup(self.ui.hide) |
800 | self.assertTrue(self.ui.ui.name_assistance.isVisible()) |
801 | - self.assertEqual( |
802 | - unicode(self.ui.ui.name_assistance.text()), |
803 | - gui.ERROR_STYLE % gui.EMPTY_NAME) |
804 | - self.ui.hide() |
805 | + self.assert_error_correct(self.ui.ui.name_assistance, gui.EMPTY_NAME, |
806 | + max_width=self.ui.header.max_title_width) |
807 | |
808 | def test_enable_setup_button_with_visible_check(self): |
809 | """Test _enable_setup_button method with terms check visible.""" |
810 | @@ -65,8 +61,6 @@ |
811 | self.ui.ui.captcha_solution_edit.setText('captcha solution') |
812 | self.ui.terms_checkbox.setChecked(True) |
813 | |
814 | - self.ui.show() |
815 | - self.addCleanup(self.ui.hide) |
816 | self.ui.terms_checkbox.setVisible(True) |
817 | self.ui.ui.captcha_solution_edit.textEdited.emit('') |
818 | self.assertTrue(self.ui.set_up_button.isEnabled()) |
819 | @@ -84,8 +78,6 @@ |
820 | self.ui.ui.confirm_password_edit.setText(password) |
821 | self.ui.ui.captcha_solution_edit.setText('captcha solution') |
822 | |
823 | - self.ui.show() |
824 | - self.addCleanup(self.ui.hide) |
825 | self.ui.terms_checkbox.setVisible(False) |
826 | self.ui.ui.captcha_solution_edit.textEdited.emit('') |
827 | self.assertTrue(self.ui.set_up_button.isEnabled()) |
828 | @@ -114,8 +106,6 @@ |
829 | |
830 | def test_password_focus_gain(self): |
831 | """Check functions execution when focus_changed() is executed.""" |
832 | - self.ui.show() |
833 | - self.addCleanup(self.ui.hide) |
834 | self.ui.ui.password_assistance.setVisible(False) |
835 | self.assertFalse(self.ui.ui.password_assistance.isVisible()) |
836 | self.patch(self.ui, 'name_assistance', self._set_called) |
837 | @@ -192,8 +182,6 @@ |
838 | def test_initialize_page(self): |
839 | """Widgets are properly initialized.""" |
840 | self.ui.initializePage() |
841 | - self.ui.show() |
842 | - self.addCleanup(self.ui.hide) |
843 | |
844 | # set up account button |
845 | expected = [QtGui.QWizard.BackButton, QtGui.QWizard.Stretch, |
846 | @@ -232,8 +220,6 @@ |
847 | self.patch(self.ui, 'set_next_validation', self._set_called) |
848 | self.ui.initializePage() |
849 | self.ui.captcha_received = True |
850 | - self.ui.show() |
851 | - self.addCleanup(self.ui.hide) |
852 | |
853 | self.ui.set_up_button.clicked.emit(False) |
854 | self.assertEqual(self._called, ((False,), {})) |
855 | @@ -241,13 +227,10 @@ |
856 | def test_set_error_message(self): |
857 | """Check the state of the label after calling: set_error_message.""" |
858 | self.ui.email_assistance() |
859 | - self.ui.show() |
860 | - self.addCleanup(self.ui.hide) |
861 | self.ui.set_error_message(self.ui.ui.email_assistance, "message") |
862 | self.assertTrue(self.ui.ui.email_assistance.isVisible()) |
863 | - self.assertEqual( |
864 | - unicode(self.ui.ui.email_assistance.text()), |
865 | - gui.ERROR_STYLE % "message") |
866 | + self.assert_error_correct(self.ui.ui.email_assistance, "message", |
867 | + max_width=self.ui.header.max_title_width) |
868 | |
869 | def test_blank_name(self): |
870 | """Status when the name field is blank (spaces). |
871 | @@ -257,13 +240,9 @@ |
872 | """ |
873 | self.ui.ui.name_edit.setText(" ") |
874 | self.ui.name_assistance() |
875 | - self.ui.show() |
876 | - self.addCleanup(self.ui.hide) |
877 | self.assertTrue(self.ui.ui.name_assistance.isVisible()) |
878 | - self.assertEqual( |
879 | - unicode(self.ui.ui.name_assistance.text()), |
880 | - gui.ERROR_STYLE % gui.EMPTY_NAME) |
881 | - self.ui.hide() |
882 | + self.assert_error_correct(self.ui.ui.name_assistance, gui.EMPTY_NAME, |
883 | + max_width=self.ui.header.max_title_width) |
884 | |
885 | def test_valid_name(self): |
886 | """Status when the name field is valid. |
887 | @@ -272,10 +251,7 @@ |
888 | """ |
889 | self.ui.ui.name_edit.setText("John Doe") |
890 | self.ui.name_assistance() |
891 | - self.ui.show() |
892 | - self.addCleanup(self.ui.hide) |
893 | self.assertFalse(self.ui.ui.name_assistance.isVisible()) |
894 | - self.ui.hide() |
895 | |
896 | def test_invalid_email(self): |
897 | """Status when the email field has no @. |
898 | @@ -285,12 +261,10 @@ |
899 | """ |
900 | self.ui.ui.email_edit.setText("foobar") |
901 | self.ui.email_assistance() |
902 | - self.ui.show() |
903 | - self.addCleanup(self.ui.hide) |
904 | self.assertTrue(self.ui.ui.email_assistance.isVisible()) |
905 | - self.assertEqual( |
906 | - unicode(self.ui.ui.email_assistance.text()), |
907 | - gui.ERROR_STYLE % gui.INVALID_EMAIL) |
908 | + self.assert_error_correct(self.ui.ui.email_assistance, |
909 | + gui.INVALID_EMAIL, |
910 | + max_width=self.ui.header.max_title_width) |
911 | |
912 | def test_valid_email(self): |
913 | """Status when the email field has a @. |
914 | @@ -299,10 +273,7 @@ |
915 | """ |
916 | self.ui.ui.email_edit.setText("foo@bar") |
917 | self.ui.email_assistance() |
918 | - self.ui.show() |
919 | - self.addCleanup(self.ui.hide) |
920 | self.assertFalse(self.ui.ui.email_assistance.isVisible()) |
921 | - self.ui.hide() |
922 | |
923 | def test_matching_emails(self): |
924 | """Status when the email fields match. |
925 | @@ -312,10 +283,7 @@ |
926 | self.ui.ui.email_edit.setText("foo@bar") |
927 | self.ui.ui.confirm_email_edit.setText("foo@bar") |
928 | self.ui.confirm_email_assistance() |
929 | - self.ui.show() |
930 | - self.addCleanup(self.ui.hide) |
931 | self.assertFalse(self.ui.ui.confirm_email_assistance.isVisible()) |
932 | - self.ui.hide() |
933 | |
934 | def test_not_matching_emails(self): |
935 | """Status when the email fields don't match. |
936 | @@ -326,18 +294,13 @@ |
937 | self.ui.ui.email_edit.setText("foo@bar") |
938 | self.ui.ui.confirm_email_edit.setText("foo@baz") |
939 | self.ui.confirm_email_assistance() |
940 | - self.ui.show() |
941 | - self.addCleanup(self.ui.hide) |
942 | self.assertTrue(self.ui.ui.confirm_email_assistance.isVisible()) |
943 | - self.assertEqual( |
944 | - unicode(self.ui.ui.confirm_email_assistance.text()), |
945 | - gui.ERROR_STYLE % gui.EMAIL_MATCH) |
946 | - self.ui.hide() |
947 | + self.assert_error_correct(self.ui.ui.confirm_email_assistance, |
948 | + gui.EMAIL_MATCH, |
949 | + max_width=self.ui.header.max_title_width) |
950 | |
951 | def test_focus_changed_password_visibility(self): |
952 | """Check visibility changes when focus_changed() is executed.""" |
953 | - self.ui.show() |
954 | - self.addCleanup(self.ui.hide) |
955 | self.ui.focus_changed(None, self.ui.ui.password_edit) |
956 | self.assertTrue(self.ui.ui.password_assistance.isVisible()) |
957 | |
958 | @@ -352,33 +315,41 @@ |
959 | self.ui.showEvent(QtGui.QShowEvent()) |
960 | self.ui.hideEvent(QtGui.QHideEvent()) |
961 | |
962 | - def test_on_captcha_refreshing(self): |
963 | + def test_on_captcha_refreshing_visible(self): |
964 | """Check the state of the overlay on captcha refreshing.""" |
965 | - self.assertEqual(self._overlay_show_counter, 0) |
966 | - self.ui.on_captcha_refreshing() |
967 | - self.assertEqual(self._overlay_show_counter, 0) |
968 | - self.assertTrue(self.ui.isEnabled()) |
969 | - self.ui.captcha_received = True |
970 | - self.ui.show() |
971 | - self.addCleanup(self.ui.hide) |
972 | - self.assertEqual(self._overlay_show_counter, 0) |
973 | - self.assertTrue(self.ui.isEnabled()) |
974 | - self.ui.on_captcha_refreshing() |
975 | + self.ui.hide_overlay() |
976 | + |
977 | + self.assertEqual(self._overlay_show_counter, 0) |
978 | + self.assertTrue(self.ui.isEnabled()) |
979 | + |
980 | + self.ui.on_captcha_refreshing() |
981 | + |
982 | self.assertFalse(self.ui.isEnabled()) |
983 | self.assertEqual(self._overlay_show_counter, 1) |
984 | |
985 | + def test_on_captcha_refreshing_not_visible(self): |
986 | + """Check the state of the overlay on captcha refreshing.""" |
987 | + self.ui.hide_overlay() |
988 | + |
989 | + self.assertEqual(self._overlay_show_counter, 0) |
990 | + self.assertTrue(self.ui.isEnabled()) |
991 | + |
992 | + self.ui.hide() |
993 | + self.ui.on_captcha_refreshing() |
994 | + |
995 | + self.assertEqual(self._overlay_show_counter, 0) |
996 | + self.assertTrue(self.ui.isEnabled()) |
997 | + |
998 | def test_on_captcha_refresh_complete(self): |
999 | """Check the state of the overlay on captcha refreshing complete.""" |
1000 | self.assertEqual(self._overlay_hide_counter, 0) |
1001 | - self.assertTrue(self.ui.isEnabled()) |
1002 | + |
1003 | self.ui.on_captcha_refresh_complete() |
1004 | + |
1005 | self.assertEqual(self._overlay_hide_counter, 1) |
1006 | - self.assertTrue(self.ui.isEnabled()) |
1007 | |
1008 | def test_hide_error_on_refresh_captcha(self): |
1009 | """Test that the errors are hidden on refresh captcha.""" |
1010 | - self.ui.show() |
1011 | - self.addCleanup(self.ui.hide) |
1012 | - self.ui.show_error(self.app_name, 'error-message') |
1013 | + self.ui.show_error('error-message') |
1014 | self.ui.ui.refresh_label.linkActivated.emit('link') |
1015 | self.assertEqual(self.ui.form_errors_label.text(), ' ') |
1016 | |
1017 | === modified file 'ubuntu_sso/qt/tests/test_sso_wizard_page.py' |
1018 | --- ubuntu_sso/qt/tests/test_sso_wizard_page.py 2012-03-05 18:56:50 +0000 |
1019 | +++ ubuntu_sso/qt/tests/test_sso_wizard_page.py 2012-03-14 13:30:25 +0000 |
1020 | @@ -16,98 +16,127 @@ |
1021 | |
1022 | """Test the SSOWizardPage and related.""" |
1023 | |
1024 | -from twisted.internet import defer |
1025 | - |
1026 | -from ubuntu_sso.qt import PREFERED_UI_SIZE |
1027 | -from ubuntu_sso.qt.setup_account_page import SetupAccountPage |
1028 | -from ubuntu_sso.qt.sso_wizard_page import Header |
1029 | -from ubuntu_sso.qt.tests import BaseTestCase, PageBaseTestCase |
1030 | - |
1031 | - |
1032 | -class HeaderTest(BaseTestCase): |
1033 | +from ubuntu_sso.qt import PREFERED_UI_SIZE, sso_wizard_page as gui |
1034 | +from ubuntu_sso.qt.tests import ( |
1035 | + APP_NAME, |
1036 | + BaseTestCase, |
1037 | + build_string_for_pixels, |
1038 | + PageBaseTestCase, |
1039 | +) |
1040 | + |
1041 | + |
1042 | +MAX_WIDTH = 100 |
1043 | + |
1044 | + |
1045 | +class WizardHeaderTestCase(BaseTestCase): |
1046 | |
1047 | """Tests for injected Header in each Wizard Page.""" |
1048 | |
1049 | - @defer.inlineCallbacks |
1050 | - def setUp(self): |
1051 | - yield super(HeaderTest, self).setUp() |
1052 | - self.header = Header() |
1053 | + kwargs = dict(max_width=MAX_WIDTH) |
1054 | + ui_class = gui.WizardHeader |
1055 | + ui_wizard_class = None |
1056 | |
1057 | def test_label_state(self): |
1058 | """Check the title and subtitle properties.""" |
1059 | - self.assertTrue(self.header.title_label.wordWrap()) |
1060 | - self.assertTrue(self.header.subtitle_label.wordWrap()) |
1061 | - self.assertFalse(self.header.title_label.isVisible()) |
1062 | - self.assertFalse(self.header.subtitle_label.isVisible()) |
1063 | + self.assertTrue(self.ui.title_label.wordWrap()) |
1064 | + self.assertTrue(self.ui.subtitle_label.wordWrap()) |
1065 | + self.assertFalse(self.ui.title_label.isVisible()) |
1066 | + self.assertFalse(self.ui.subtitle_label.isVisible()) |
1067 | |
1068 | def test_set_title(self): |
1069 | """Check if set_title works ok, showing the widget if necessary.""" |
1070 | - self.header.set_title('title') |
1071 | - self.assertEqual(self.header.title_label.text(), 'title') |
1072 | - self.header.show() |
1073 | - self.assertTrue(self.header.title_label.isVisible()) |
1074 | - self.header.hide() |
1075 | + max_width = self.ui.max_title_width |
1076 | + text = build_string_for_pixels(self.ui.title_label, max_width) |
1077 | + |
1078 | + self.ui.set_title(text) |
1079 | + |
1080 | + self.assert_title_correct(self.ui.title_label, text, max_width) |
1081 | |
1082 | def test_set_elided_title(self): |
1083 | """Check if set_title adds the ellipsis when necessary.""" |
1084 | # add an extra letter so we ensure this needs to be trimmed |
1085 | - title = 'a' * int(PREFERED_UI_SIZE['width'] * 0.95) + 'a' |
1086 | - self.header.set_title(title) |
1087 | - self.assertEqual(self.header.title_label.toolTip(), title) |
1088 | - expected = unicode(self.header.title_label.text()) |
1089 | - self.assertTrue(expected.endswith(u'\u2026')) |
1090 | + max_width = self.ui.max_title_width |
1091 | + text = build_string_for_pixels(self.ui.title_label, max_width + 10) |
1092 | + |
1093 | + self.ui.set_title(text) |
1094 | + |
1095 | + self.assert_title_correct(self.ui.title_label, text, max_width) |
1096 | |
1097 | def test_set_empty_title(self): |
1098 | """Check if the widget is hidden for empty title.""" |
1099 | - self.header.set_title('') |
1100 | - self.assertFalse(self.header.title_label.isVisible()) |
1101 | + self.ui.set_title('') |
1102 | + |
1103 | + self.assertEqual(self.ui.title_label.toolTip(), '') |
1104 | + self.assertFalse(self.ui.title_label.isVisible()) |
1105 | |
1106 | def test_set_subtitle(self): |
1107 | """Check if set_subtitle works ok, showing the widget if necessary.""" |
1108 | - self.header.set_subtitle('subtitle') |
1109 | - self.assertEqual(self.header.subtitle_label.text(), 'subtitle') |
1110 | - self.header.show() |
1111 | - self.assertTrue(self.header.subtitle_label.isVisible()) |
1112 | - self.header.hide() |
1113 | + max_width = self.ui.max_subtitle_width |
1114 | + text = build_string_for_pixels(self.ui.subtitle_label, max_width) |
1115 | + |
1116 | + self.ui.set_subtitle(text) |
1117 | + |
1118 | + self.assert_subtitle_correct(self.ui.subtitle_label, text, max_width) |
1119 | |
1120 | def test_set_elided_subtitle(self): |
1121 | """Check if set_subtitle adds the ellipsis when necessary.""" |
1122 | - subtitle = 'a' * int(PREFERED_UI_SIZE['width'] * 0.95) + 'a' |
1123 | - self.header.set_subtitle(subtitle) |
1124 | - self.assertEqual(self.header.subtitle_label.toolTip(), subtitle) |
1125 | - expected = unicode(self.header.subtitle_label.text()) |
1126 | - self.assertTrue(expected.endswith(u'\u2026')) |
1127 | + max_width = self.ui.max_subtitle_width |
1128 | + text = build_string_for_pixels(self.ui.subtitle_label, max_width + 10) |
1129 | + |
1130 | + self.ui.set_subtitle(text) |
1131 | + |
1132 | + self.assert_subtitle_correct(self.ui.subtitle_label, text, max_width) |
1133 | |
1134 | def test_set_empty_subtitle(self): |
1135 | """Check if the widget is hidden for empty subtitle.""" |
1136 | - self.header.set_title('') |
1137 | - self.assertFalse(self.header.title_label.isVisible()) |
1138 | - |
1139 | - |
1140 | -class SSOWizardPageTest(PageBaseTestCase): |
1141 | - |
1142 | - """Tests for SSOWizardPage.""" |
1143 | - |
1144 | - ui_class = SetupAccountPage |
1145 | + self.ui.set_subtitle('') |
1146 | + |
1147 | + self.assertEqual(self.ui.subtitle_label.toolTip(), '') |
1148 | + self.assertFalse(self.ui.subtitle_label.isVisible()) |
1149 | + |
1150 | + |
1151 | +class BaseWizardPageTestCase(PageBaseTestCase): |
1152 | + |
1153 | + """Tests for SSOWizardPage.""" |
1154 | + |
1155 | + kwargs = {} |
1156 | + ui_class = gui.BaseWizardPage |
1157 | + |
1158 | + def test_max_width(self): |
1159 | + """The max_width is correct.""" |
1160 | + self.assertEqual(self.ui.max_width, 0) |
1161 | + |
1162 | + |
1163 | +class SSOWizardPageTestCase(BaseWizardPageTestCase): |
1164 | + |
1165 | + """Tests for SSOWizardPage.""" |
1166 | + |
1167 | + kwargs = dict(app_name=APP_NAME) |
1168 | + ui_class = gui.SSOWizardPage |
1169 | + |
1170 | + def test_max_width(self): |
1171 | + """The max_width is correct.""" |
1172 | + self.assertEqual(self.ui.max_width, PREFERED_UI_SIZE['width']) |
1173 | |
1174 | def test_show_error(self): |
1175 | """Test show_error with a normal length string.""" |
1176 | message = 'error-message' |
1177 | - self.ui.show_error(self.app_name, message) |
1178 | - self.assertEqual(self.ui.form_errors_label.toolTip(), message) |
1179 | - expected = unicode(self.ui.form_errors_label.text()) |
1180 | - self.assertEqual(expected, message) |
1181 | + self.ui.show_error(message) |
1182 | + |
1183 | + self.assert_error_correct(self.ui.form_errors_label, message, |
1184 | + self.ui.header.max_title_width) |
1185 | |
1186 | def test_show_error_long_text(self): |
1187 | """Test show_error with a long length string.""" |
1188 | - message = 'a' * int(PREFERED_UI_SIZE['width'] * 0.95) + 'a' |
1189 | - self.ui.show_error(self.app_name, message) |
1190 | - self.assertEqual(self.ui.form_errors_label.toolTip(), message) |
1191 | - expected = unicode(self.ui.form_errors_label.text()) |
1192 | - self.assertTrue(expected.endswith(u'\u2026')) |
1193 | + message = build_string_for_pixels(self.ui.form_errors_label, |
1194 | + self.ui.header.max_title_width + 10) |
1195 | + self.ui.show_error(message) |
1196 | + |
1197 | + self.assert_error_correct(self.ui.form_errors_label, message, |
1198 | + self.ui.header.max_title_width) |
1199 | |
1200 | def test_hide_error(self): |
1201 | """Test show_error with a long length string.""" |
1202 | - message = ' ' |
1203 | self.ui.hide_error() |
1204 | - self.assertEqual(self.ui.form_errors_label.text(), message) |
1205 | + |
1206 | + self.assertEqual(self.ui.form_errors_label.text(), ' ') |
1207 | |
1208 | === modified file 'ubuntu_sso/qt/tests/test_ubuntu_sso_wizard.py' |
1209 | --- ubuntu_sso/qt/tests/test_ubuntu_sso_wizard.py 2012-03-13 20:33:06 +0000 |
1210 | +++ ubuntu_sso/qt/tests/test_ubuntu_sso_wizard.py 2012-03-14 13:30:25 +0000 |
1211 | @@ -112,8 +112,6 @@ |
1212 | |
1213 | def test_window_size(self): |
1214 | """check the window size.""" |
1215 | - self.ui.show() |
1216 | - self.addCleanup(self.ui.hide) |
1217 | size = self.ui.size() |
1218 | self.assertTrue(size.height() >= PREFERED_UI_SIZE['height']) |
1219 | self.assertTrue(size.width() >= PREFERED_UI_SIZE['width']) |
1220 | @@ -131,6 +129,9 @@ |
1221 | |
1222 | def test_overlay_shows(self): |
1223 | """Test if the signals call the overlay.show properly.""" |
1224 | + # reset the counter |
1225 | + self.ui.overlay.show_counter = 0 |
1226 | + |
1227 | for page in self.ui._pages: |
1228 | page.show_overlay() |
1229 | |
1230 | @@ -138,6 +139,9 @@ |
1231 | |
1232 | def test_overlay_hides(self): |
1233 | """Test if the signals call the overlay.show properly.""" |
1234 | + # reset the counter |
1235 | + self.ui.overlay.show_counter = 0 |
1236 | + |
1237 | for page in self.ui._pages: |
1238 | page.hide_overlay() |
1239 | |
1240 | @@ -157,8 +161,6 @@ |
1241 | |
1242 | def test_email_verification_page_params_from_current_user(self): |
1243 | """Tests that email_verification_page receives the proper params.""" |
1244 | - self.ui.show() |
1245 | - self.addCleanup(self.ui.hide) |
1246 | self.ui._next_id = self.ui.current_user_page_id |
1247 | self.ui.next() |
1248 | self.ui.current_user.ui.email_edit.setText(EMAIL) |
1249 | @@ -169,8 +171,6 @@ |
1250 | |
1251 | def test_email_verification_page_params_from_setup(self): |
1252 | """Tests that email_verification_page receives the proper params.""" |
1253 | - self.ui.show() |
1254 | - self.addCleanup(self.ui.hide) |
1255 | self.ui.setup_account.ui.email_edit.setText(EMAIL) |
1256 | self.ui.setup_account.ui.password_edit.setText(PASSWORD) |
1257 | self.ui.setup_account.on_user_registered(APP_NAME, {}) |
Text conflict in ubuntu_ sso/qt/ tests/test_ email_verificat ion.py
1 conflicts encountered.