1760
1781
def test_all_the_signals_are_listed(self):
1761
1782
"""All the backend signals are listed to be binded."""
1762
names = [sig for (sig, cb) in self.ui._signals]
1763
1783
for sig in ('CaptchaGenerated', 'CaptchaGenerationError',
1764
1784
'UserRegistered', 'UserRegistrationError',
1765
1785
'LoggedIn', 'LoginError',
1766
1786
'EmailValidated', 'EmailValidationError',
1767
1787
'PasswordResetTokenSent', 'PasswordResetError',
1768
1788
'PasswordChanged', 'PasswordChangeError'):
1769
self.assertIn(sig, names)
1789
self.assertIn(sig, self.ui._signals)
1771
1791
def test_signal_receivers_are_connected(self):
1772
1792
"""Callbacks are connected to signals of interest."""
1773
1793
msg1 = 'callback %r for signal %r must be added to the internal bus.'
1774
1794
msg2 = 'callback %r for signal %r must be added to the ui log.'
1775
1795
dbus_iface = self.ui.iface_name
1776
for signal, method in self.ui._signals:
1796
for signal, method in self.ui._signals.iteritems():
1777
1797
actual = self.ui.bus.callbacks.get((dbus_iface, signal))
1778
1798
self.assertEqual(method, actual, msg1 % (method, signal))
1779
1799
actual = self.ui._signals_receivers.get((dbus_iface, signal))
1780
1800
self.assertEqual(method, actual, msg2 % (method, signal))
1802
def test_callbacks_only_log_when_app_name_doesnt_match(self):
1803
"""Callbacks do nothing but logging when app_name doesn't match."""
1804
mismatch_app_name = self.ui.app_name * 2
1805
for method in self.ui._signals.itervalues():
1806
msgs = ('ignoring', method.__name__, mismatch_app_name)
1807
method(mismatch_app_name, 'dummy')
1808
self.assertTrue(self.memento.check(logging.INFO, *msgs))
1809
self.memento.records = []
1811
def test_on_captcha_generated_is_not_called(self):
1812
"""on_captcha_generated is not called if incorrect app_name."""
1813
self.patch(self.ui, 'on_captcha_generated', self._set_called)
1814
mismatch_app_name = self.ui.app_name * 2
1815
self.ui._signals['CaptchaGenerated'](mismatch_app_name, 'dummy')
1816
self.assertFalse(self._called)
1818
def test_on_captcha_generation_error_is_not_called(self):
1819
"""on_captcha_generation_error is not called if incorrect app_name."""
1820
self.patch(self.ui, 'on_captcha_generation_error', self._set_called)
1821
mismatch_app_name = self.ui.app_name * 2
1822
self.ui._signals['CaptchaGenerationError'](mismatch_app_name, 'dummy')
1823
self.assertFalse(self._called)
1825
def test_on_user_registered_is_not_called(self):
1826
"""on_user_registered is not called if incorrect app_name."""
1827
self.patch(self.ui, 'on_user_registered', self._set_called)
1828
mismatch_app_name = self.ui.app_name * 2
1829
self.ui._signals['UserRegistered'](mismatch_app_name, 'dummy')
1830
self.assertFalse(self._called)
1832
def test_on_user_registration_error_is_not_called(self):
1833
"""on_user_registration_error is not called if incorrect app_name."""
1834
self.patch(self.ui, 'on_user_registration_error', self._set_called)
1835
mismatch_app_name = self.ui.app_name * 2
1836
self.ui._signals['UserRegistrationError'](mismatch_app_name, 'dummy')
1837
self.assertFalse(self._called)
1839
def test_on_email_validated_is_not_called(self):
1840
"""on_email_validated is not called if incorrect app_name."""
1841
self.patch(self.ui, 'on_email_validated', self._set_called)
1842
mismatch_app_name = self.ui.app_name * 2
1843
self.ui._signals['EmailValidated'](mismatch_app_name, 'dummy')
1844
self.assertFalse(self._called)
1846
def test_on_email_validation_error_is_not_called(self):
1847
"""on_email_validation_error is not called if incorrect app_name."""
1848
self.patch(self.ui, 'on_email_validation_error', self._set_called)
1849
mismatch_app_name = self.ui.app_name * 2
1850
self.ui._signals['EmailValidationError'](mismatch_app_name, 'dummy')
1851
self.assertFalse(self._called)
1853
def test_on_logged_in_is_not_called(self):
1854
"""on_logged_in is not called if incorrect app_name."""
1855
self.patch(self.ui, 'on_logged_in', self._set_called)
1856
mismatch_app_name = self.ui.app_name * 2
1857
self.ui._signals['LoggedIn'](mismatch_app_name, 'dummy')
1858
self.assertFalse(self._called)
1860
def test_on_login_error_is_not_called(self):
1861
"""on_login_error is not called if incorrect app_name."""
1862
self.patch(self.ui, 'on_login_error', self._set_called)
1863
mismatch_app_name = self.ui.app_name * 2
1864
self.ui._signals['LoginError'](mismatch_app_name, 'dummy')
1865
self.assertFalse(self._called)
1867
def test_on_password_reset_token_sent_is_not_called(self):
1868
"""on_password_reset_token_sent is not called if incorrect app_name."""
1869
self.patch(self.ui, 'on_password_reset_token_sent', self._set_called)
1870
mismatch_app_name = self.ui.app_name * 2
1871
self.ui._signals['PasswordResetTokenSent'](mismatch_app_name, 'dummy')
1872
self.assertFalse(self._called)
1874
def test_on_password_reset_error_is_not_called(self):
1875
"""on_password_reset_error is not called if incorrect app_name."""
1876
self.patch(self.ui, 'on_password_reset_error', self._set_called)
1877
mismatch_app_name = self.ui.app_name * 2
1878
self.ui._signals['PasswordResetError'](mismatch_app_name, 'dummy')
1879
self.assertFalse(self._called)
1881
def test_on_password_changed_is_not_called(self):
1882
"""on_password_changed is not called if incorrect app_name."""
1883
self.patch(self.ui, 'on_password_changed', self._set_called)
1884
mismatch_app_name = self.ui.app_name * 2
1885
self.ui._signals['PasswordChanged'](mismatch_app_name, 'dummy')
1886
self.assertFalse(self._called)
1888
def test_on_password_change_error_is_not_called(self):
1889
"""on_password_change_error is not called if incorrect app_name."""
1890
self.patch(self.ui, 'on_password_change_error', self._set_called)
1891
mismatch_app_name = self.ui.app_name * 2
1892
self.ui._signals['PasswordChangeError'](mismatch_app_name, 'dummy')
1893
self.assertFalse(self._called)
1783
1896
class LoginOnlyTestCase(UbuntuSSOClientTestCase):
1784
1897
"""Test suite for the login only GUI."""
1903
2024
def test_user_cancelation_even_if_prior_login_error(self):
1904
2025
"""Only one signal is sent with the final outcome."""
1905
2026
self.click_connect_with_valid_data()
1906
self.ui.on_login_error(app_name=APP_NAME, error=self.ERROR)
2027
self.ui.on_login_error(app_name=APP_NAME, error=self.error)
1907
2028
self.ui.login_cancel_button.clicked()
1909
2030
self.assertEqual(len(self._called), 1)
1910
2031
self.assertTrue(gui.SIG_USER_CANCELATION in self._called)
2034
class DefaultButtonsTestCase(UbuntuSSOClientTestCase):
2035
"""Each UI page has a default button when visible."""
2039
super(DefaultButtonsTestCase, self).setUp()
2041
('enter_details_vbox', 'join_ok_button'),
2042
('tc_browser_vbox', 'tc_back_button'),
2043
('verify_email_vbox', 'verify_token_button'),
2044
('login_vbox', 'login_ok_button'),
2045
('request_password_token_vbox',
2046
'request_password_token_ok_button'),
2047
('set_new_password_vbox', 'set_new_password_ok_button'),
2048
('success_vbox', 'success_close_button'),
2049
('processing_vbox', None))
2051
def test_pages_have_default_widget_set(self):
2052
"""Each page has a proper button as default widget."""
2053
msg = 'Page %r must have %r as default_widget (got %r instead).'
2054
for pname, bname in self.mapping:
2055
page = getattr(self.ui, pname)
2056
button = bname and getattr(self.ui, bname)
2057
self.assertTrue(page.default_widget is button,
2058
msg % (pname, bname, page.default_widget))
2060
def test_default_widget_can_default(self):
2061
"""Each default button can default."""
2062
msg = 'Button %r must have can-default enabled.'
2063
for _, bname in self.mapping:
2064
if bname is not None:
2065
button = getattr(self.ui, bname)
2066
self.assertTrue(button.get_property('can-default'),
2069
def test_set_current_page_grabs_focus_for_default_button(self):
2070
"""Setting the current page marks the default widget as default."""
2071
msg = '%r "has_default" must be True when %r if the current page.'
2072
for pname, bname in self.mapping:
2073
if bname is not None:
2074
page = getattr(self.ui, pname)
2075
self.patch(page.default_widget, 'grab_default',
2077
self.ui._set_current_page(page)
2078
self.assertEqual(self._called, ((), {}), msg % (bname, pname))
2079
self._called = False