diff --git a/.travis.yml b/.travis.yml index dbd20b52a..e58767a9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,3 +14,8 @@ script: - coverage run manage.py test after_success: - coveralls +addons: + sauce_connect: + username: "tixl" + access_key: + secure: "a0NUwGs2jHci0hIg3jySZLkfljv6FP33fZxAyi2gKeaxcVC+a/AailSnUgDoyVWxPr0JnkLvdFcxzDBgrQ1TLsgpRDSXnc1nIGsaHjgvVGSJ1hKACYtO/9QH+dgaaHEsIsHHbvGdnjwjrX8AZtDnkcRk1T3Skj8kUCniaU39w38=" diff --git a/src/requirements.txt b/src/requirements.txt index c880ade6b..401637a53 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -25,4 +25,7 @@ pep8-naming flake8 coveralls coverage - +selenium +PyVirtualDisplay +-e git+https://github.com/tixl/sauceclient.git@master#egg=sauceclient +travis diff --git a/src/tixlbase/tests/__init__.py b/src/tixlbase/tests/__init__.py index e69de29bb..f0930b90e 100644 --- a/src/tixlbase/tests/__init__.py +++ b/src/tixlbase/tests/__init__.py @@ -0,0 +1,97 @@ +import os +import sys + +from django.test import LiveServerTestCase +from selenium import webdriver + +RUN_LOCAL = ('SAUCE_USERNAME' in os.environ) + +if RUN_LOCAL: + # could add Chrome, PhantomJS etc... here + BROWSERS = ['Chrome'] +else: + from sauceclient import SauceClient + USERNAME = os.environ.get('SAUCE_USERNAME') + ACCESS_KEY = os.environ.get('SAUCE_ACCESS_KEY') + sauce = SauceClient(USERNAME, ACCESS_KEY) + + BROWSERS = [ + {"platform": "Mac OS X 10.9", + "browserName": "chrome", + "version": "35"}, + {"platform": "Windows 8.1", + "browserName": "internet explorer", + "version": "11"}, + {"platform": "Linux", + "browserName": "firefox", + "version": "29"}] + + +def on_platforms(): + if RUN_LOCAL: + def decorator(base_class): + module = sys.modules[base_class.__module__].__dict__ + for i, platform in enumerate(BROWSERS): + d = dict(base_class.__dict__) + d['browser'] = platform + name = "%s_%s" % (base_class.__name__, i + 1) + module[name] = type(name, (base_class,), d) + pass + return decorator + + def decorator(base_class): + module = sys.modules[base_class.__module__].__dict__ + for i, platform in enumerate(BROWSERS): + d = dict(base_class.__dict__) + d['desired_capabilities'] = platform + name = "%s_%s" % (base_class.__name__, i + 1) + module[name] = type(name, (base_class,), d) + return decorator + + +class BrowserTest(LiveServerTestCase): + + def setUp(self): + if RUN_LOCAL: + self.setUpLocal() + else: + self.setUpSauce() + + def tearDown(self): + if RUN_LOCAL: + self.tearDownLocal() + else: + self.tearDownSauce() + + def setUpSauce(self): + self.desired_capabilities['tunnel-identifier'] = \ + os.environ['TRAVIS_JOB_NUMBER'] + self.desired_capabilities['build'] = os.environ['TRAVIS_BUILD_NUMBER'] + self.desired_capabilities['tags'] = \ + [os.environ['TRAVIS_PYTHON_VERSION'], 'CI'] + self.desired_capabilities['name'] = self.id() + + sauce_url = "http://%s:%s@ondemand.saucelabs.com:80/wd/hub" + self.driver = webdriver.Remote( + desired_capabilities=self.desired_capabilities, + command_executor=sauce_url % (USERNAME, ACCESS_KEY) + ) + self.driver.implicitly_wait(5) + + def setUpLocal(self): + self.driver = getattr(webdriver, self.browser)() + self.driver.implicitly_wait(3) + + def tearDownLocal(self): + self.driver.quit() + + def tearDownSauce(self): + print("\nLink to your job: \n " + "https://saucelabs.com/jobs/%s \n" % self.driver.session_id) + try: + if sys.exc_info() == (None, None, None): + sauce.jobs.update_job(self.driver.session_id, passed=True) + else: + sauce.jobs.update_job(self.driver.session_id, passed=False) + finally: + self.driver.quit() diff --git a/src/tixlcontrol/tests/test_auth.py b/src/tixlcontrol/tests/test_auth.py index 677eb9a5e..d7c5ae219 100644 --- a/src/tixlcontrol/tests/test_auth.py +++ b/src/tixlcontrol/tests/test_auth.py @@ -1,6 +1,26 @@ -from django.test import TestCase, Client +from django.test import TestCase, Client, LiveServerTestCase +from selenium import webdriver from tixlbase.models import User +from tixlbase.tests import BrowserTest, on_platforms + + +@on_platforms() +class LoginFormBrowserTest(BrowserTest): + + def setUp(self): + super().setUp() + self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy@dummy.dummy', 'dummy') + + def test_login(self): + self.driver.implicitly_wait(10) + self.driver.get('%s%s' % (self.live_server_url, '/control/login')) + username_input = self.driver.find_element_by_name("email") + username_input.send_keys('dummy@dummy.dummy') + password_input = self.driver.find_element_by_name("password") + password_input.send_keys('dummy') + self.driver.find_element_by_css_selector('button[type="submit"]').click() + self.driver.find_element_by_class_name("navbar-right") class LoginFormTest(TestCase):