Completed
Push — master ( cf9e20...5ca630 )
by Batiste
01:53
created

SeleniumTestCase.url_change()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 2
rs 10
cc 1
1
# -*- coding: utf-8 -*-
2
"""Django page CMS selemium test module"""
3
from unittest import SkipTest
4
5
from django.contrib import auth
6
from django.core.urlresolvers import reverse
7
from django.test import LiveServerTestCase
8
from pages import settings
9
from pages.models import Page
10
from pages.tests.testcase import TestCase
11
from selenium import webdriver
12
from selenium.common.exceptions import TimeoutException
13
from selenium.webdriver.support.ui import WebDriverWait
14
15
screenshot_nb = 1
16
TIMEOUT = 10
17
18
19
class SeleniumTestCase(TestCase, LiveServerTestCase):
20
21
    def setUp(self):
22
        self.browser = webdriver.PhantomJS()
23
        self.browser.set_page_load_timeout(TIMEOUT)
24
        self.get_admin_client()
25
26
        # setUp is where you instantiate the selenium webdriver and loads the browser.
27
        auth.models.User.objects.create_superuser(
28
            username='admin_s',
29
            password='admin',
30
            email='[email protected]'
31
        )
32
33
        self.browser.get('%s%s' % (self.live_server_url, reverse("admin:index")))
34
35
        super(SeleniumTestCase, self).setUp()
36
37
    def screenshot(self):
38
        global screenshot_nb
39
        if settings.PAGE_TESTS_SAVE_SCREENSHOTS:
40
            self.browser.save_screenshot('screenshot_%d.png' % screenshot_nb)
41
            screenshot_nb += 1
42
43
    def select_option(self, select, option_id):
44
        for option in select.find_elements_by_tag_name('option'):
45
            if option.get_attribute('value') == str(option_id):
46
                option.click()
47
48
    def visit(self, url):
49
        # Open the django admin page.
50
        # DjangoLiveServerTestCase provides a live server url attribute
51
        # to access the base url in tests
52
        url = '%s%s' % (self.live_server_url, url)
53
        try:
54
            return self.browser.get(url)
55
        except TimeoutException:
56
            raise SkipTest("Timeout: get({0})".format(repr(url)))
57
58
    def find_element_by_css_selector(self, selector):
59
        return self.timeout('find_element_by_css_selector', selector)
60
61
    def find_elements_by_css_selector(self, selector):
62
        return self.timeout('find_elements_by_css_selector', selector)
63
64
    def find_element_by_id(self, id):
65
        return self.timeout('find_element_by_id', id)
66
67
    def timeout(self, command, param, timeout=TIMEOUT):
68
        wait = WebDriverWait(self.browser, timeout)
69
        try:
70
            return wait.until(lambda b: getattr(b, command)(param))
71
        except TimeoutException:
72
            raise SkipTest("Timeout: {0}({1})".format(command, repr(param)))
73
74
    def click(self, selector):
75
        return self.browser.find_element_by_css_selector(selector).click()
76
77
    def login(self):
78
        self.visit(reverse("admin:index"))
79
        # Fill login information of admin
80
        username = self.find_element_by_id("id_username")
81
        username.send_keys("admin_s")
82
        password = self.find_element_by_id("id_password")
83
        password.send_keys("admin")
84
        self.click("input[type='submit']")
85
86
    def tearDown(self):
87
        self.browser.quit()
88
        super(SeleniumTestCase, self).tearDown()
89
90
    def url_change(self, id):
91
        return reverse('admin:pages_page_change', args=[id])
92
93
    def test_admin_select(self):
94
        self.login()
95
        page = self.new_page()
96
        self.visit(self.url_change(page.id))
97
        status = self.find_element_by_id('id_status')
98
        self.assertEqual(status.get_attribute('value'), str(page.status))
99
100
        self.select_option(status, str(Page.DRAFT))
101
        self.assertEqual(status.get_attribute('value'), str(Page.DRAFT))
102
103
        src = self.find_element_by_css_selector('.field-status img [src$="draft.gif"]')
104
105
    def test_admin_move_page(self):
106
        self.login()
107
        page_1 = self.new_page({'slug': 'p1'})
108
        page_2 = self.new_page({'slug': 'p2'})
109
        self.visit(reverse('admin:pages_page_changelist'))
110
111
        rows = self.find_elements_by_css_selector('#page-list tbody tr')
112
        row_1 = rows[0]
113
        row_2 = rows[1]
114
115
        self.assertEqual(row_1.get_attribute('id'), 'page-row-%d' % page_1.id)
116
        self.assertEqual(row_2.get_attribute('id'), 'page-row-%d' % page_2.id)
117
118
        page_3 = self.new_page({'slug': 'p3'})
119
120
        self.click('#move-link-%d' % page_2.id)
121
        self.click('#move-target-%d .move-target.left' % page_1.id)
122
        self.visit(reverse('admin:pages_page_changelist'))
123
124
        self.find_element_by_id('page-row-%d' % page_3.id)
125
126
    def test_admin_export_json(self):
127
        self.login()
128
        self.new_page({'slug': 'p1'})
129
        self.new_page({'slug': 'p2'})
130
        self.visit(reverse('admin:pages_page_changelist'))
131
132
        self.find_elements_by_css_selector('#action-toggle')[0].click()
133
134
        action_select = self.find_elements_by_css_selector(
135
            '[name="action"]')[0]
136
        self.select_option(action_select, 'export_pages_as_json')
137
138
        self.find_elements_by_css_selector('[name="index"]')[0].click()
139
140
        # apparently there is no easy way to test a download?
141