diff options
| -rw-r--r-- | src/leap/crypto/leapkeyring.py | 1 | ||||
| -rw-r--r-- | src/leap/eip/tests/test_eipconnection.py | 5 | ||||
| -rw-r--r-- | src/leap/gui/__init__.py | 3 | ||||
| -rw-r--r-- | src/leap/gui/firstrun/__init__.py | 2 | ||||
| -rwxr-xr-x | src/leap/gui/firstrun/wizard.py | 56 | ||||
| -rw-r--r-- | src/leap/gui/tests/test_firstrun_wizard.py | 138 | ||||
| -rw-r--r-- | src/leap/util/web.py | 1 | 
7 files changed, 185 insertions, 21 deletions
| diff --git a/src/leap/crypto/leapkeyring.py b/src/leap/crypto/leapkeyring.py index d4be7bf9..c241d0bc 100644 --- a/src/leap/crypto/leapkeyring.py +++ b/src/leap/crypto/leapkeyring.py @@ -53,6 +53,7 @@ class LeapCryptedFileKeyring(keyring.backend.CryptedFileKeyring):  def leap_set_password(key, value, seed="xxx"): +    key, value = map(unicode, (key, value))      keyring.set_keyring(LeapCryptedFileKeyring(seed=seed))      keyring.set_password('leap', key, value) diff --git a/src/leap/eip/tests/test_eipconnection.py b/src/leap/eip/tests/test_eipconnection.py index 4ee5ae30..1f1605ed 100644 --- a/src/leap/eip/tests/test_eipconnection.py +++ b/src/leap/eip/tests/test_eipconnection.py @@ -66,6 +66,11 @@ class EIPConductorTest(BaseLeapTest):          self.manager = Mock(name="openvpnmanager_mock")          self.con = MockedEIPConnection()          self.con.provider = self.provider + +        # XXX watch out. This sometimes is throwing the following error: +        # NoSuchProcess: process no longer exists (pid=6571) +        # because of a bad implementation of _check_if_running_instance +          self.con.run_openvpn_checks()      def tearDown(self): diff --git a/src/leap/gui/__init__.py b/src/leap/gui/__init__.py index 9b8f8746..804bfbc1 100644 --- a/src/leap/gui/__init__.py +++ b/src/leap/gui/__init__.py @@ -6,5 +6,6 @@ except ValueError:      pass  import firstrun +import firstrun.wizard -__all__ = ['firstrun'] +__all__ = ['firstrun', 'firstrun.wizard'] diff --git a/src/leap/gui/firstrun/__init__.py b/src/leap/gui/firstrun/__init__.py index 8a70d90e..a2ca704d 100644 --- a/src/leap/gui/firstrun/__init__.py +++ b/src/leap/gui/firstrun/__init__.py @@ -26,4 +26,4 @@ __all__ = [      'providerselect',      'providersetup',      'register', -    'regvalidation'] +    'regvalidation']  # ,'wizard'] diff --git a/src/leap/gui/firstrun/wizard.py b/src/leap/gui/firstrun/wizard.py index 9b77b877..bd3fe903 100755 --- a/src/leap/gui/firstrun/wizard.py +++ b/src/leap/gui/firstrun/wizard.py @@ -2,8 +2,11 @@  import logging  import sip -sip.setapi('QString', 2) -sip.setapi('QVariant', 2) +try: +    sip.setapi('QString', 2) +    sip.setapi('QVariant', 2) +except ValueError: +    pass  from PyQt4 import QtCore  from PyQt4 import QtGui @@ -146,6 +149,10 @@ class FirstRunWizard(QtGui.QWizard):          # TODO: set style for MAC / windows ...          #self.setWizardStyle() +    # +    # setup pages in wizard +    # +      def add_pages_from_dict(self, pages_dict):          """          @param pages_dict: the dictionary with pages, where @@ -168,6 +175,10 @@ class FirstRunWizard(QtGui.QWizard):          """          return self.pages_dict.keys().index(page_name) +    # +    # validation errors +    # +      def set_validation_error(self, pagename, error):          self.validation_errors[pagename] = error @@ -179,20 +190,6 @@ class FirstRunWizard(QtGui.QWizard):      def get_validation_error(self, pagename):          return self.validation_errors.get(pagename, None) -    def set_providerconfig(self, providerconfig): -        self.providerconfig = providerconfig - -    def setWindowFlags(self, flags): -        logger.debug('setting window flags') -        QtGui.QWizard.setWindowFlags(self, flags) - -    def focusOutEvent(self, event): -        # needed ? -        self.setFocus(True) -        self.activateWindow() -        self.raise_() -        self.show() -      def accept(self):          """          final step in the wizard. @@ -246,11 +243,14 @@ class FirstRunWizard(QtGui.QWizard):          if cb and callable(cb):              self.success_cb() -    def get_provider_by_index(self): -        provider = self.field('provider_index') -        return self.providers[provider] +    # misc helpers      def get_random_str(self, n): +        """ +        returns a random string +        :param n: the length of the desired string +        :rvalue: str +        """          from string import (ascii_uppercase, ascii_lowercase, digits)          from random import choice          return ''.join(choice( @@ -258,6 +258,24 @@ class FirstRunWizard(QtGui.QWizard):              ascii_lowercase +              digits) for x in range(n)) +    def set_providerconfig(self, providerconfig): +        """ +        sets a providerconfig attribute +        used when we fetch and parse a json configuration +        """ +        self.providerconfig = providerconfig + +    def get_provider_by_index(self):  # pragma: no cover +        """ +        returns the value of a provider given its index. +        this was used in the select provider page, +        in the case where we were preseeding providers in a combobox +        """ +        # Leaving it here for the moment when we go back at the +        # option of preseeding with known provider values. +        provider = self.field('provider_index') +        return self.providers[provider] +  if __name__ == '__main__':      # standalone test diff --git a/src/leap/gui/tests/test_firstrun_wizard.py b/src/leap/gui/tests/test_firstrun_wizard.py new file mode 100644 index 00000000..c63781fc --- /dev/null +++ b/src/leap/gui/tests/test_firstrun_wizard.py @@ -0,0 +1,138 @@ +import sys +import unittest + +import mock + +from leap.testing import qunittest +from leap.testing import pyqt + +from PyQt4 import QtGui +#from PyQt4 import QtCore +import PyQt4.QtCore  # some weirdness with mock module + +from PyQt4.QtTest import QTest +#from PyQt4.QtCore import Qt + +from leap.gui import firstrun + + +class TestWizard(firstrun.wizard.FirstRunWizard): +    pass + + +PAGES_DICT = dict(( +    ('intro', firstrun.intro.IntroPage), +    ('providerselection', +        firstrun.providerselect.SelectProviderPage), +    ('login', firstrun.login.LogInPage), +    ('providerinfo', firstrun.providerinfo.ProviderInfoPage), +    ('providersetupvalidation', +        firstrun.providersetup.ProviderSetupValidationPage), +    ('signup', firstrun.register.RegisterUserPage), +    ('signupvalidation', +        firstrun.regvalidation.RegisterUserValidationPage), +    ('connecting', firstrun.connect.ConnectingPage), +    ('lastpage', firstrun.last.LastPage) +)) + + +mockQSettings = mock.MagicMock() +mockQSettings().setValue.return_value = True + +#PyQt4.QtCore.QSettings = mockQSettings + + +class FirstRunWizardTestCase(qunittest.TestCase): + +    # XXX can spy on signal connections + +    def setUp(self): +        self.app = QtGui.QApplication(sys.argv) +        QtGui.qApp = self.app +        self.wizard = TestWizard(None) + +    def tearDown(self): +        QtGui.qApp = None +        self.app = None +        self.wizard = None + +    def test_defaults(self): +        self.assertEqual(self.wizard.pages_dict, PAGES_DICT) + +    @mock.patch('PyQt4.QtCore.QSettings', mockQSettings) +    def test_accept(self): +        """ +        test the main accept method +        that gets called when user has gone +        thru all the wizard and click on finish button +        """ + +        self.wizard.success_cb = mock.Mock() +        self.wizard.success_cb.return_value = True + +        # dummy values; we inject them in the field +        # mocks (where wizard gets them) and then +        # we check that they are passed to QSettings.setValue +        field_returns = ["testuser", "1234", "testprovider", True] + +        def field_side_effects(*args): +            return field_returns.pop(0) + +        self.wizard.field = mock.Mock(side_effect=field_side_effects) +        self.wizard.get_random_str = mock.Mock() +        RANDOMSTR = "thisisarandomstringTM" +        self.wizard.get_random_str.return_value = RANDOMSTR + +        # mocked settings (see decorator on this method) +        mqs = PyQt4.QtCore.QSettings + +        # go! call accept... +        self.wizard.accept() + +        # did settings().setValue get called with the proper +        # arguments? +        call = mock.call +        calls = [call("FirstRunWizardDone", True), +                 call("provider_domain", "testprovider"), +                 call("remember_user_and_pass", True), +                 call("eip_username", "testuser@testprovider"), +                 call("testprovider_seed", RANDOMSTR)] +        mqs().setValue.assert_has_calls(calls, any_order=True) + +        # assert success callback is success oh boy +        self.wizard.success_cb.assert_called_with() + +    def test_random_str(self): +        r = self.wizard.get_random_str(42) +        self.assertTrue(len(r) == 42) + +    def test_page_index(self): +        """ +        we test both the get_page_index function +        and the correct ordering of names +        """ +        # remember it's implemented as an ordered dict + +        pagenames = ('intro', 'providerselection', 'login', 'providerinfo', +                     'providersetupvalidation', 'signup', 'signupvalidation', +                     'connecting', 'lastpage') +        eq = self.assertEqual +        w = self.wizard +        for index, name in enumerate(pagenames): +            eq(w.get_page_index(name), index) + +    def test_validation_errors(self): +        """ +        tests getters and setters for validation errors +        """ +        page = "testpage" +        eq = self.assertEqual +        w = self.wizard +        eq(w.get_validation_error(page), None) +        w.set_validation_error(page, "error") +        eq(w.get_validation_error(page), "error") +        w.clean_validation_error(page) +        eq(w.get_validation_error(page), None) + +if __name__ == "__main__": +    unittest.main() diff --git a/src/leap/util/web.py b/src/leap/util/web.py index b2aef058..15de0561 100644 --- a/src/leap/util/web.py +++ b/src/leap/util/web.py @@ -13,6 +13,7 @@ def get_https_domain_and_port(full_domain):      from a full_domain string that can      contain a colon      """ +    full_domain = unicode(full_domain)      if full_domain is None:          return None, None | 
