Merge lp:~nataliabidart/ubuntu/maverick/ubuntu-sso-client/ubuntu-sso-client-0.99.1 into lp:ubuntu/maverick/ubuntu-sso-client

Proposed by Natalia Bidart
Status: Merged
Merged at revision: 5
Proposed branch: lp:~nataliabidart/ubuntu/maverick/ubuntu-sso-client/ubuntu-sso-client-0.99.1
Merge into: lp:ubuntu/maverick/ubuntu-sso-client
Diff against target: 725 lines (+321/-154)
12 files modified
PKG-INFO (+1/-1)
bin/ubuntu-sso-login-gui (+2/-2)
data/ui.glade (+2/-0)
debian/changelog (+10/-0)
debian/control (+1/-1)
run-tests (+5/-3)
setup.py (+1/-1)
ubuntu_sso/gui.py (+38/-23)
ubuntu_sso/keyring.py (+112/-111)
ubuntu_sso/main.py (+4/-4)
ubuntu_sso/tests/test_gui.py (+30/-8)
ubuntu_sso/tests/test_keyring.py (+115/-0)
To merge this branch: bzr merge lp:~nataliabidart/ubuntu/maverick/ubuntu-sso-client/ubuntu-sso-client-0.99.1
Reviewer Review Type Date Requested Status
Ubuntu branches Pending
Review via email: mp+33134@code.launchpad.net

Description of the change

Critical bug fixes for v0.99.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'PKG-INFO'
2--- PKG-INFO 2010-08-12 00:00:08 +0000
3+++ PKG-INFO 2010-08-19 17:58:43 +0000
4@@ -1,6 +1,6 @@
5 Metadata-Version: 1.0
6 Name: ubuntu-sso-client
7-Version: 0.99
8+Version: 0.99.1
9 Summary: Ubuntu Single Sign-On client
10 Home-page: https://launchpad.net/ubuntu-sso-client
11 Author: Natalia Bidart
12
13=== modified file 'bin/ubuntu-sso-login-gui'
14--- bin/ubuntu-sso-login-gui 2010-08-12 00:00:08 +0000
15+++ bin/ubuntu-sso-login-gui 2010-08-19 17:58:43 +0000
16@@ -25,8 +25,8 @@
17 from ubuntu_sso.gui import UbuntuSSOClientGUI
18
19
20-APP_NAME = 'Super Testing App'
21-TC_URI = 'http://ubuntu.com'
22+APP_NAME = 'Ubuntu'
23+TC_URI = 'http://one.ubuntu.com/terms'
24 HELP_TEXT = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' \
25 'Nam sed lorem nibh. Suspendisse gravida nulla non nunc suscipit ' \
26 'pulvinar tempus ut augue.'
27
28=== modified file 'data/ui.glade'
29--- data/ui.glade 2010-08-12 00:00:08 +0000
30+++ data/ui.glade 2010-08-19 17:58:43 +0000
31@@ -349,6 +349,8 @@
32 </object>
33 <object class="GtkVBox" id="tc_browser_vbox">
34 <property name="visible">True</property>
35+ <signal name="hide" handler="on_tc_browser_vbox_hide"/>
36+ <signal name="show" handler="on_tc_browser_vbox_show"/>
37 <child>
38 <object class="GtkScrolledWindow" id="tc_browser_window">
39 <property name="visible">True</property>
40
41=== modified file 'debian/changelog'
42--- debian/changelog 2010-08-12 09:38:17 +0000
43+++ debian/changelog 2010-08-19 17:58:43 +0000
44@@ -1,3 +1,13 @@
45+ubuntu-sso-client (0.99.1-0ubuntu1) UNRELEASED; urgency=low
46+
47+ * New upstream release:
48+ - Delayed opening the webkit browser to the latest possible. (LP: #617041)
49+ (nataliabidart)
50+ - Use a proper dictionary with different attributes for each key so old
51+ keys are not overwritten nor deleted. (LP: #617347) (alecu)
52+
53+ -- Natalia Bidart (nessita) <nataliabidart@gmail.com> Thu, 19 Aug 2010 13:02:10 -0300
54+
55 ubuntu-sso-client (0.99-0ubuntu1) maverick; urgency=low
56
57 * New upstream release.
58
59=== modified file 'debian/control'
60--- debian/control 2010-08-11 16:18:28 +0000
61+++ debian/control 2010-08-19 17:58:43 +0000
62@@ -7,7 +7,7 @@
63 python-support (>= 0.6.4),
64 python-distutils-extra (>= 2.10)
65 Maintainer: Natalia Bidart <natalia.bidart@canonical.com>
66-Standards-Version: 3.8.4
67+Standards-Version: 3.9.1
68 XS-Python-Version: current
69
70 Package: ubuntu-sso-client
71
72=== modified file 'run-tests'
73--- run-tests 2010-08-11 17:03:11 +0000
74+++ run-tests 2010-08-19 17:58:43 +0000
75@@ -18,9 +18,11 @@
76 `which xvfb-run` ./contrib/test $@
77 pyflakes bin ubuntu_sso
78 if [ -x `which pep8` ]; then
79- pep8 --repeat bin ubuntu_sso/gui.py ubuntu_sso/main.py \
80- ubuntu_sso/tests/test_gui.py ubuntu_sso/tests/test_main.py contrib/
81+ pep8 --repeat bin/ contrib/ \
82+ ubuntu_sso/gui.py ubuntu_sso/main.py ubuntu_sso/keyring.py \
83+ ubuntu_sso/tests/test_gui.py ubuntu_sso/tests/test_main.py \
84+ ubuntu_sso/tests/test_keyring.py
85 else
86 echo "Please install the 'pep8' package."
87 fi
88-rm -rf _trial_temp/
89\ No newline at end of file
90+rm -rf _trial_temp/
91
92=== modified file 'setup.py'
93--- setup.py 2010-08-12 00:00:08 +0000
94+++ setup.py 2010-08-19 17:58:43 +0000
95@@ -72,7 +72,7 @@
96
97 setup(
98 name='ubuntu-sso-client',
99- version='0.99',
100+ version='0.99.1',
101 license='GPL v3',
102 author='Natalia Bidart',
103 author_email='natalia.bidart@canonical.com',
104
105=== modified file 'ubuntu_sso/gui.py'
106--- ubuntu_sso/gui.py 2010-08-12 00:00:08 +0000
107+++ ubuntu_sso/gui.py 2010-08-19 17:58:43 +0000
108@@ -153,8 +153,8 @@
109 """Ubuntu single sign on GUI."""
110
111 CAPTCHA_SOLUTION_ENTRY = _('Type the characters above')
112- CONNECT_HELP_LABEL = _('To connect this computer to') + ' %s ' + \
113- _('enter your details below.')
114+ CONNECT_HELP_LABEL = _('To connect this computer to %(app_name)s ' \
115+ 'enter your details below.')
116 EMAIL1_ENTRY = _('Email address')
117 EMAIL2_ENTRY = _('Re-type Email address')
118 EMAIL_MISMATCH = _('The email addresses don\'t match, please double check '
119@@ -163,11 +163,11 @@
120 EMAIL_TOKEN_ENTRY = _('Enter code verification here')
121 FIELD_REQUIRED = _('This field is required.')
122 FORGOTTEN_PASSWORD_BUTTON = _('I\'ve forgotten my password')
123- JOIN_HEADER_LABEL = _('Create') + ' %s ' + _('account')
124+ JOIN_HEADER_LABEL = _('Create %(app_name)s account')
125 LOADING = _('Loading...')
126 LOGIN_BUTTON_LABEL = _('Already have an account? Click here to sign in')
127 LOGIN_EMAIL_ENTRY = _('Email address')
128- LOGIN_HEADER_LABEL = _('Connect to') + ' %s'
129+ LOGIN_HEADER_LABEL = _('Connect to %(app_name)s')
130 LOGIN_PASSWORD_ENTRY = _('Password')
131 NAME_ENTRY = _('Name')
132 NEXT = _('Next')
133@@ -185,9 +185,9 @@
134 RESET_PASSWORD = _('Reset Password')
135 RESET_CODE_ENTRY = _('Reset code')
136 RESET_EMAIL_ENTRY = _('Email address')
137- SET_NEW_PASSWORD_LABEL = _('A password reset code has been sent to %s.\n' \
138- 'Please enter the code below along with your ' \
139- 'new password.')
140+ SET_NEW_PASSWORD_LABEL = _('A password reset code has been sent to ' \
141+ '%(email)s.\nPlease enter the code below ' \
142+ 'along with your new password.')
143 SUCCESS = _('The process finished successfully. Congratulations!')
144 TC = _('Terms & Conditions')
145 TC_NOT_ACCEPTED = _('Agreeing to the Ubuntu One Terms & Conditions is '
146@@ -198,8 +198,8 @@
147
148 A verification code has just been sent to your email address.
149 Please enter your code from the email. An example is shown below.""")
150- YES_TO_TC = _('I agree with the')
151- YES_TO_UPDATES = _('Yes! Email me tips and updates.')
152+ YES_TO_TC = _('I agree with the %(app_name)s ') # Terms&Conditions button
153+ YES_TO_UPDATES = _('Yes! Email me %(app_name)s tips and updates.')
154
155 def __init__(self, app_name, tc_uri, help_text,
156 window_id=0, login_only=False, close_callback=None):
157@@ -211,7 +211,7 @@
158 self._signals_receivers = {}
159
160 self.app_name = app_name
161- self.app_label = '<b>%s</b>' % app_name
162+ self.app_label = '<b>%s</b>' % self.app_name
163 self.tc_uri = tc_uri
164 self.help_text = help_text
165 self.close_callback = close_callback
166@@ -437,8 +437,8 @@
167
168 def _build_enter_details_page(self):
169 """Build the enter details page."""
170- self.enter_details_vbox.header = (self.JOIN_HEADER_LABEL %
171- self.app_label)
172+ d = {'app_name': self.app_label}
173+ self.enter_details_vbox.header = self.JOIN_HEADER_LABEL % d
174 self.enter_details_vbox.help_text = self.help_text
175
176 self.enter_details_vbox.pack_start(self.name_entry, expand=False)
177@@ -461,8 +461,10 @@
178 else:
179 self._set_captcha_image()
180
181- self.yes_to_updates_checkbutton.set_label(self.YES_TO_UPDATES)
182- self.yes_to_tc_checkbutton.set_label(self.YES_TO_TC)
183+ msg = self.YES_TO_UPDATES % {'app_name': self.app_name}
184+ self.yes_to_updates_checkbutton.set_label(msg)
185+ msg = self.YES_TO_TC % {'app_name': self.app_name}
186+ self.yes_to_tc_checkbutton.set_label(msg)
187 self.tc_button.set_label(self.TC)
188 self.login_button.set_label(self.LOGIN_BUTTON_LABEL)
189
190@@ -476,11 +478,6 @@
191
192 def _build_tc_page(self):
193 """Build the Terms & Conditions page."""
194- self.tc_browser = webkit.WebView()
195- self.tc_browser.open(self.tc_uri)
196- self.tc_browser.show()
197- self.tc_browser_window.add(self.tc_browser)
198-
199 return self.tc_browser_vbox
200
201 def _build_processing_page(self):
202@@ -510,8 +507,9 @@
203
204 def _build_login_page(self):
205 """Build the login page."""
206- self.login_vbox.header = self.LOGIN_HEADER_LABEL % self.app_label
207- self.login_vbox.help_text = self.CONNECT_HELP_LABEL % self.app_label
208+ d = {'app_name': self.app_label}
209+ self.login_vbox.header = self.LOGIN_HEADER_LABEL % d
210+ self.login_vbox.help_text = self.CONNECT_HELP_LABEL % d
211
212 self.login_details_vbox.pack_start(self.login_email_entry)
213 self.login_details_vbox.reorder_child(self.login_email_entry, 0)
214@@ -777,6 +775,22 @@
215
216 self._set_current_page(self.processing_vbox)
217
218+ def on_tc_browser_vbox_show(self, *args, **kwargs):
219+ """The T&C page is being shown."""
220+ browser = webkit.WebView()
221+ browser.open(self.tc_uri)
222+ browser.show()
223+ self.tc_browser_window.add(browser)
224+
225+ def on_tc_browser_vbox_hide(self, *args, **kwargs):
226+ """The T&C page is no longer being shown."""
227+ children = self.tc_browser_window.get_children()
228+ if len(children) > 0:
229+ browser = children[0]
230+ self.tc_browser_window.remove(browser)
231+ browser.destroy()
232+ del browser
233+
234 # backend callbacks
235
236 def on_captcha_generated(self, captcha_id, *args, **kwargs):
237@@ -836,8 +850,9 @@
238
239 def on_password_reset_token_sent(self, email, *args, **kwargs):
240 """Password reset token was successfully sent."""
241- e = self.reset_email_entry.get_text()
242- self.set_new_password_vbox.help_text = self.SET_NEW_PASSWORD_LABEL % e
243+ email = self.reset_email_entry.get_text()
244+ msg = self.SET_NEW_PASSWORD_LABEL % {'email': email}
245+ self.set_new_password_vbox.help_text = msg
246 self._set_current_page(self.set_new_password_vbox)
247
248 def on_password_reset_error(self, *args, **kwargs):
249
250=== modified file 'ubuntu_sso/keyring.py'
251--- ubuntu_sso/keyring.py 2010-08-11 17:03:11 +0000
252+++ ubuntu_sso/keyring.py 2010-08-19 17:58:43 +0000
253@@ -1,111 +1,112 @@
254-# Copyright (C) 2010 Canonical
255-#
256-# Authors:
257-# Andrew Higginson
258-#
259-# This program is free software; you can redistribute it and/or modify it under
260-# the terms of the GNU General Public License as published by the Free Software
261-# Foundation; version 3.
262-#
263-# This program is distributed in the hope that it will be useful, but WITHOUT
264-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
265-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
266-# details.
267-#
268-# You should have received a copy of the GNU General Public License along with
269-# this program; if not, write to the Free Software Foundation, Inc.,
270-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
271-
272-import gnomekeyring
273-
274-from urllib import urlencode
275-from urlparse import parse_qsl
276-
277-class Keyring(object):
278-
279- KEYRING_NAME = "login"
280-
281- def __init__(self, app_name):
282-
283- if not gnomekeyring.is_available():
284- raise gnomekeyring.NoKeyringDaemonError
285- self.app_name = app_name
286-
287- def _create_keyring(self, name):
288- """
289- Creates a keyring, if it already exists,
290- it does nothing
291- """
292- keyring_names = gnomekeyring.list_keyring_names_sync()
293- if not name in keyring_names:
294- gnomekeyring.create_sync(name)
295-
296- def _item_exists(self, sync, name):
297- """
298- Returns whether a named item exists in a
299- named keyring
300- """
301- return self._get_item_id_from_name(sync, name) != None
302-
303- def _get_item_id_from_name(self, sync, name):
304- """
305- Returns the ID for a named item
306- """
307- for item_id in gnomekeyring.list_item_ids_sync(sync):
308- item_info = gnomekeyring.item_get_info_sync(sync, item_id)
309- display_name = item_info.get_display_name()
310- if display_name == name:
311- return item_id
312- return None
313-
314- def _get_item_info_from_name(self, sync, name):
315- """
316- Returns the ID for a named item
317- """
318- for item_id in gnomekeyring.list_item_ids_sync(sync):
319- item_info = gnomekeyring.item_get_info_sync(sync, item_id)
320- display_name = item_info.get_display_name()
321- if display_name == name:
322- return item_info
323- return None
324-
325- def set_ubuntusso_attr(self, attr):
326- """
327- Sets the attributes of the Ubuntu SSO item
328- """
329- # Creates the secret from the attributes
330- secret = urlencode(attr)
331-
332- # Create the keyring
333- self._create_keyring(self.KEYRING_NAME)
334-
335- # If the item already exists, delete it
336- if self._item_exists(self.KEYRING_NAME, self.app_name):
337- item_id = self._get_item_id_from_name(self.KEYRING_NAME,
338- self.app_name)
339- gnomekeyring.item_delete_sync(self.KEYRING_NAME, item_id)
340-
341- # Add our SSO item
342- gnomekeyring.item_create_sync(self.KEYRING_NAME,
343- gnomekeyring.ITEM_GENERIC_SECRET, self.app_name, {},
344- secret, True)
345-
346- def get_ubuntusso_attr(self):
347- """
348- Returns the secret of the SSO item in a dictionary
349- """
350- # If we have no attributes, return None
351- if self._get_item_info_from_name(self.KEYRING_NAME,
352- self.app_name) == None:
353- return None
354- secret = self._get_item_info_from_name(self.KEYRING_NAME,
355- self.app_name).get_secret()
356- return dict(parse_qsl(secret))
357-
358-if __name__ == "__main__":
359- SSO_ITEM_NAME = "Software Center UbuntuSSO token"
360- keyring = Keyring(SSO_ITEM_NAME)
361- keyring.set_ubuntusso_attr({"ha":"hehddddeff", "hi":"hggehes", "ho":"he"})
362- print keyring.get_ubuntusso_attr()
363-
364-
365+# Copyright (C) 2010 Canonical
366+#
367+# Authors:
368+# Andrew Higginson
369+# Alejandro J. Cura <alecu@canonical.com>
370+#
371+# This program is free software; you can redistribute it and/or modify it under
372+# the terms of the GNU General Public License as published by the Free Software
373+# Foundation; version 3.
374+#
375+# This program is distributed in the hope that it will be useful, but WITHOUT
376+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
377+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
378+# details.
379+#
380+# You should have received a copy of the GNU General Public License along with
381+# this program; if not, write to the Free Software Foundation, Inc.,
382+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
383+
384+"""Handle keys in the gnome kerying."""
385+
386+import gnomekeyring
387+
388+from urllib import urlencode
389+from urlparse import parse_qsl
390+
391+
392+class Keyring(object):
393+
394+ KEYRING_NAME = "login"
395+
396+ def __init__(self, app_name):
397+ if not gnomekeyring.is_available():
398+ raise gnomekeyring.NoKeyringDaemonError
399+ self.app_name = app_name
400+
401+ def _create_keyring(self, name):
402+ """Creates a keyring, if it already exists, do nothing."""
403+ keyring_names = gnomekeyring.list_keyring_names_sync()
404+ if not name in keyring_names:
405+ gnomekeyring.create_sync(name)
406+
407+ def _get_item_id_from_name(self, sync, name):
408+ """Return the ID for a named item."""
409+ for item_id in gnomekeyring.list_item_ids_sync(sync):
410+ item_info = gnomekeyring.item_get_info_sync(sync, item_id)
411+ display_name = item_info.get_display_name()
412+ if display_name == name:
413+ return item_id
414+
415+ def _get_item_info_from_name(self, sync, name):
416+ """Return the ID for a named item."""
417+ for item_id in gnomekeyring.list_item_ids_sync(sync):
418+ item_info = gnomekeyring.item_get_info_sync(sync, item_id)
419+ display_name = item_info.get_display_name()
420+ if display_name == name:
421+ return item_info
422+
423+ def set_ubuntusso_attr(self, cred):
424+ """Set the credentials of the Ubuntu SSO item."""
425+ # Creates the secret from the credentials
426+ secret = urlencode(cred)
427+
428+ # Create the keyring
429+ self._create_keyring(self.KEYRING_NAME)
430+
431+ # No need to delete the item if it already exists
432+
433+ # A set of attributes for this credentials
434+ attr = {"key-type": "Ubuntu SSO credentials",
435+ "token-name": cred["name"].encode("utf8")}
436+
437+ # Add our SSO credentials to the keyring
438+ gnomekeyring.item_create_sync(self.KEYRING_NAME,
439+ gnomekeyring.ITEM_GENERIC_SECRET, self.app_name, attr,
440+ secret, True)
441+
442+ def get_ubuntusso_attr(self):
443+ """Return the secret of the SSO item in a dictionary."""
444+ # If we have no attributes, return None
445+ exist = self._get_item_info_from_name(self.KEYRING_NAME, self.app_name)
446+ if exist is not None:
447+ secret = self._get_item_info_from_name(self.KEYRING_NAME,
448+ self.app_name).get_secret()
449+ return dict(parse_qsl(secret))
450+
451+ def delete_ubuntusso_attr(self):
452+ """Delete a set of credentials from the keyring."""
453+ item_id = self._get_item_id_from_name(self.KEYRING_NAME,
454+ self.app_name)
455+ if item_id is not None:
456+ gnomekeyring.item_delete_sync(self.KEYRING_NAME, item_id)
457+
458+
459+if __name__ == "__main__":
460+ kr1 = Keyring("Test key 1")
461+ kr2 = Keyring("Test key 2")
462+
463+ kr1.delete_ubuntusso_attr()
464+ kr2.delete_ubuntusso_attr()
465+
466+ d1 = {"name": "test-1", "ha": "hehddddeff", "hi": "hggehes", "ho": "he"}
467+ d2 = {"name": "test-2", "hi": "ho", "let's": "go"}
468+
469+ kr1.set_ubuntusso_attr(d1)
470+ kr2.set_ubuntusso_attr(d2)
471+
472+ r1 = kr1.get_ubuntusso_attr()
473+ r2 = kr2.get_ubuntusso_attr()
474+
475+ assert r1 == d1
476+ assert r2 == d2
477
478=== modified file 'ubuntu_sso/main.py'
479--- ubuntu_sso/main.py 2010-08-12 00:00:08 +0000
480+++ ubuntu_sso/main.py 2010-08-19 17:58:43 +0000
481@@ -199,8 +199,8 @@
482 logger.exception('login failed with:')
483 raise AuthenticationError()
484
485- logger.debug('login: authentication successful! consumer_key: %r',
486- credentials['consumer_key'])
487+ logger.debug('login: authentication successful! consumer_key: %r, ' \
488+ 'token_name: %r', credentials['consumer_key'], token_name)
489 keyring_store_credentials(app_name, credentials)
490 return credentials
491
492@@ -413,8 +413,8 @@
493 class SSOCredentials(dbus.service.Object):
494 """DBus object that gets credentials, and login/registers if needed."""
495
496- @dbus.service.signal(DBUS_IFACE_CRED_NAME, signature="s")
497- def AuthorizationDenied(self, app_name):
498+ @dbus.service.signal(DBUS_IFACE_CRED_NAME, signature="")
499+ def AuthorizationDenied(self):
500 """Signal thrown when the user denies the authorization."""
501
502 @dbus.service.signal(DBUS_IFACE_CRED_NAME, signature="a{ss}")
503
504=== modified file 'ubuntu_sso/tests/test_gui.py'
505--- ubuntu_sso/tests/test_gui.py 2010-08-12 00:00:08 +0000
506+++ ubuntu_sso/tests/test_gui.py 2010-08-19 17:58:43 +0000
507@@ -22,10 +22,10 @@
508 import itertools
509 import logging
510 import os
511-import socket
512
513 import dbus
514 import gtk
515+import webkit
516
517 from twisted.trial.unittest import TestCase
518
519@@ -300,7 +300,6 @@
520 super(UbuntuSSOClientTestCase, self).setUp()
521 self.patch(dbus, 'SessionBus', FakedSessionBus)
522 self.patch(dbus, 'Interface', FakedSSOBackend)
523- self.patch(socket, 'gethostname', lambda: TOKEN_NAME)
524 self.pages = ('enter_details', 'processing', 'verify_email', 'success',
525 'tc_browser', 'login', 'request_password_token',
526 'set_new_password')
527@@ -562,7 +561,7 @@
528 def test_initial_text_for_header_label(self):
529 """The header must have the correct text at startup."""
530 msg = 'Text for the header must be "%s" (got "%s" instead).'
531- expected = self.ui.JOIN_HEADER_LABEL % APP_NAME
532+ expected = self.ui.JOIN_HEADER_LABEL % {'app_name': APP_NAME}
533 actual = self.ui.header_label.get_text()
534 # text content is correct
535 self.assertEqual(expected, actual, msg % (expected, actual))
536@@ -583,11 +582,11 @@
537 def test_initial_texts_for_checkbuttons(self):
538 """Check buttons have the correct text at startup."""
539 msg = 'Text for "%s" must be "%s" (got "%s" instead).'
540- expected = self.ui.YES_TO_UPDATES
541+ expected = self.ui.YES_TO_UPDATES % {'app_name': APP_NAME}
542 actual = self.ui.yes_to_updates_checkbutton.get_label()
543 self.assertEqual(expected, actual, msg % ('yes_to_updates_checkbutton',
544 expected, actual))
545- expected = self.ui.YES_TO_TC
546+ expected = self.ui.YES_TO_TC % {'app_name': APP_NAME}
547 actual = self.ui.yes_to_tc_checkbutton.get_label()
548 self.assertEqual(expected, actual,
549 msg % ('yes_to_tc_checkbutton', expected, actual))
550@@ -731,6 +730,29 @@
551 class TermsAndConditionsTestCase(UbuntuSSOClientTestCase):
552 """Test suite for the user registration (terms & conditions page)."""
553
554+ def test_tc_browser_is_created_when_tc_page_is_shown(self):
555+ """The webkit browser is created when the TC page is shown."""
556+ self.ui.tc_browser_vbox.show()
557+
558+ children = self.ui.tc_browser_window.get_children()
559+ self.assertEqual(1, len(children))
560+ browser = children[0]
561+ self.assertIsInstance(browser, webkit.WebView)
562+ self.assertTrue(browser.get_property('visible'))
563+
564+ self.ui.tc_browser_vbox.hide()
565+
566+ def test_tc_browser_is_destroyed_when_tc_page_is_hid(self):
567+ """The webkit browser is destroyed when the TC page is hid."""
568+ self.ui.tc_browser_vbox.show()
569+ browser = self.ui.tc_browser_window.get_children()[0]
570+ self.patch(browser, 'destroy', self._set_called)
571+ self.ui.tc_browser_vbox.hide()
572+
573+ children = self.ui.tc_browser_window.get_children()
574+ self.assertEqual(0, len(children))
575+ self.assertEqual(self._called, ((), {}))
576+
577 def test_tc_button_clicked_morphs_into_tc_browser_vbox(self):
578 """Terms & Conditions morphs to a browser window."""
579 self.ui.tc_button.clicked()
580@@ -1001,14 +1023,14 @@
581 def test_initial_text_for_header_label(self):
582 """The header must have the correct text when logging in."""
583 msg = 'Text for the header must be "%s" (got "%s" instead).'
584- expected = self.ui.LOGIN_HEADER_LABEL % APP_NAME
585+ expected = self.ui.LOGIN_HEADER_LABEL % {'app_name': APP_NAME}
586 actual = self.ui.header_label.get_text()
587 self.assertEqual(expected, actual, msg % (expected, actual))
588
589 def test_initial_text_for_help_label(self):
590 """The help must have the correct text at startup."""
591 msg = 'Text for the help must be "%s" (got "%s" instead).'
592- expected = self.ui.CONNECT_HELP_LABEL % APP_NAME
593+ expected = self.ui.CONNECT_HELP_LABEL % {'app_name': APP_NAME}
594 actual = self.ui.help_label.get_text()
595 self.assertEqual(expected, actual, msg % (expected, actual))
596
597@@ -1225,7 +1247,7 @@
598 self.ui.on_password_reset_token_sent(email=EMAIL)
599
600 self.assertEqual(self.ui.help_label.get_text(),
601- self.ui.SET_NEW_PASSWORD_LABEL % EMAIL)
602+ self.ui.SET_NEW_PASSWORD_LABEL % {'email': EMAIL})
603
604 def test_on_password_reset_token_sent_ok_button(self):
605 """After request_password_token_ok_button the ok button is updated."""
606
607=== added file 'ubuntu_sso/tests/test_keyring.py'
608--- ubuntu_sso/tests/test_keyring.py 1970-01-01 00:00:00 +0000
609+++ ubuntu_sso/tests/test_keyring.py 2010-08-19 17:58:43 +0000
610@@ -0,0 +1,115 @@
611+# test_keyring - tests for ubuntu_sso.keyring
612+#
613+# Author: Alejandro J. Cura <alecu@canonical.com>
614+#
615+# Copyright 2010 Canonical Ltd.
616+#
617+# This program is free software: you can redistribute it and/or modify it
618+# under the terms of the GNU General Public License version 3, as published
619+# by the Free Software Foundation.
620+#
621+# This program is distributed in the hope that it will be useful, but
622+# WITHOUT ANY WARRANTY; without even the implied warranties of
623+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
624+# PURPOSE. See the GNU General Public License for more details.
625+#
626+# You should have received a copy of the GNU General Public License along
627+# with this program. If not, see <http://www.gnu.org/licenses/>.
628+"""Tests for the keyring.py module."""
629+
630+import gnomekeyring
631+from twisted.trial.unittest import TestCase
632+
633+from ubuntu_sso import keyring
634+
635+
636+class MockInfoSync(object):
637+ """A mock object that represents a fake key."""
638+
639+ def __init__(self, (key, key_name, secret)):
640+ """Initialize this instance."""
641+ self.key = key
642+ self.key_name = key_name
643+ self.secret = secret
644+
645+ def get_display_name(self):
646+ """Return info on the mocked object."""
647+ return self.key_name
648+
649+
650+class MockGnomeKeyring(object):
651+ """A mock keyring that stores keys according to a given attr."""
652+
653+ def __init__(self):
654+ """Initialize this instance."""
655+ self.keyrings = set()
656+ self.store = []
657+ self.deleted = []
658+
659+ def item_create_sync(self, keyring_name, item_type, key_name, attr,
660+ secret, update_if_exists):
661+ """Sets a value in the keyring."""
662+ # we'll use the attr as the dict key, so make it a tuple
663+ key = tuple(attr.items())
664+ self.store.append((key, key_name, secret))
665+
666+ def item_delete_sync(self, keyring_name, item_id):
667+ """Makes a list of deleted items."""
668+ key, key_name, secret = self.store.pop(item_id)
669+ self.deleted.append(key_name)
670+
671+ def list_item_ids_sync(self, keyring_name):
672+ """Return a list of ids for all the items."""
673+ return [n for n, v in enumerate(self.store)]
674+
675+ def item_get_info_sync(self, keyring_name, item_id):
676+ """Return an info sync object for the item."""
677+ return MockInfoSync(self.store[item_id])
678+
679+ def list_keyring_names_sync(self):
680+ """The keyring you are looking for may be here."""
681+ return self.keyrings
682+
683+ def create_sync(self, name):
684+ """Thanks, I'll create that keyring for you."""
685+ self.keyrings.add(name)
686+
687+ def is_available(self):
688+ """A very available keyring."""
689+ return True
690+
691+
692+class TestKeyring(TestCase):
693+ """Test the gnome keyring related functions."""
694+ def setUp(self):
695+ """Initialize the mock used in these tests."""
696+ self.mgk = MockGnomeKeyring()
697+ self.patch(gnomekeyring, "item_create_sync", self.mgk.item_create_sync)
698+ self.patch(gnomekeyring, "is_available", self.mgk.is_available)
699+ self.patch(gnomekeyring, "create_sync", self.mgk.create_sync)
700+ self.patch(gnomekeyring, "list_keyring_names_sync",
701+ self.mgk.list_keyring_names_sync)
702+ self.patch(gnomekeyring, "list_item_ids_sync",
703+ self.mgk.list_item_ids_sync)
704+ self.patch(gnomekeyring, "item_get_info_sync",
705+ self.mgk.item_get_info_sync)
706+ self.patch(gnomekeyring, "item_delete_sync", self.mgk.item_delete_sync)
707+
708+ def test_set_ubuntusso(self):
709+ """Test that the set method does not erase previous keys."""
710+ sample_creds = {"name": "sample creds name"}
711+ sample_creds2 = {"name": "sample creds name 2"}
712+ keyring.Keyring("appname").set_ubuntusso_attr(sample_creds)
713+ keyring.Keyring("appname").set_ubuntusso_attr(sample_creds2)
714+
715+ self.assertEqual(len(self.mgk.store), 2)
716+ self.assertEqual(len(self.mgk.deleted), 0)
717+
718+ def test_delete_ubuntusso(self):
719+ """Test that a given key is deleted."""
720+ sample_creds = {"name": "sample creds name"}
721+ keyring.Keyring("appname").set_ubuntusso_attr(sample_creds)
722+ keyring.Keyring("appname").delete_ubuntusso_attr()
723+
724+ self.assertEqual(len(self.mgk.store), 0)
725+ self.assertEqual(len(self.mgk.deleted), 1)

Subscribers

People subscribed via source and target branches

to all changes: