UPD: more and better tests.
This commit is contained in:
22
dav_auth/tests/generic.py
Normal file
22
dav_auth/tests/generic.py
Normal file
@@ -0,0 +1,22 @@
|
||||
from django.urls import reverse
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
|
||||
|
||||
class SeleniumAuthMixin(object):
|
||||
def login(self, driver, username, password):
|
||||
driver.get(self.complete_url(reverse('dav_auth:login')))
|
||||
username_field = self.wait_on_presence(driver, (By.ID, 'id_username'))
|
||||
username_field.clear()
|
||||
username_field.send_keys(username)
|
||||
password_field = driver.find_element_by_id('id_password')
|
||||
password_field.clear()
|
||||
password_field.send_keys(password)
|
||||
password_field.send_keys(Keys.RETURN)
|
||||
self.wait_on_presence(driver, (By.CSS_SELECTOR, "#messages .alert-success"))
|
||||
return driver
|
||||
|
||||
def logout(self, driver):
|
||||
driver.get(self.complete_url(reverse('dav_auth:logout')))
|
||||
self.wait_on_presence(driver, (By.CSS_SELECTOR, "#messages .alert-success"))
|
||||
return driver
|
||||
@@ -6,16 +6,14 @@ from django.utils.translation import ugettext
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
|
||||
|
||||
from dav_base.tests.generic import skip_unless_tag_option, ScreenshotTestCase
|
||||
from dav_base.tests.generic import ScreenshotTestCase
|
||||
|
||||
TEST_USERNAME = 'root@localhost'
|
||||
TEST_PASSWORD = u'me||ön 2'
|
||||
TEST_EMAIL = TEST_USERNAME
|
||||
|
||||
|
||||
@skip_unless_tag_option()
|
||||
@tag('screenshots')
|
||||
@tag('screenshots', 'browser')
|
||||
class TestCase(ScreenshotTestCase):
|
||||
screenshot_prefix = 'dav_auth-'
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@ from django.utils.translation import ugettext
|
||||
from django.urls import reverse
|
||||
from selenium.common.exceptions import NoSuchElementException
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from unittest import skip
|
||||
|
||||
from dav_base.tests.generic import SeleniumTestCase
|
||||
|
||||
from .generic import SeleniumAuthMixin
|
||||
|
||||
TEST_USERNAME = 'root@localhost'
|
||||
TEST_PASSWORD = u'me||ön 2'
|
||||
TEST_EMAIL = TEST_USERNAME
|
||||
@@ -26,7 +26,7 @@ class TemplatesTestCase(SimpleTestCase):
|
||||
|
||||
|
||||
@tag('browser')
|
||||
class TestCase(SeleniumTestCase):
|
||||
class TestCase(SeleniumAuthMixin, SeleniumTestCase):
|
||||
def setUp(self):
|
||||
super(TestCase, self).setUp()
|
||||
# Need a test user
|
||||
@@ -35,19 +35,6 @@ class TestCase(SeleniumTestCase):
|
||||
model = get_user_model()
|
||||
self.user = model.objects.create_user(username=TEST_USERNAME, password=TEST_PASSWORD, email=TEST_EMAIL)
|
||||
|
||||
def _login(self, driver):
|
||||
url = self.complete_url(reverse('dav_auth:login'))
|
||||
driver.get(url)
|
||||
username_field = self.wait_on_presence(driver, (By.ID, "id_username"))
|
||||
username_field.clear()
|
||||
username_field.send_keys(self.test_username)
|
||||
password_field = driver.find_element_by_id('id_password')
|
||||
password_field.clear()
|
||||
password_field.send_keys(self.test_password)
|
||||
password_field.send_keys(Keys.RETURN)
|
||||
self.wait_on_presence(driver, (By.CSS_SELECTOR, "#messages .alert-success"))
|
||||
return driver
|
||||
|
||||
def test_login_button_in_root_page(self):
|
||||
c = self.selenium
|
||||
c.get(self.complete_url('/'))
|
||||
@@ -68,7 +55,7 @@ class TestCase(SeleniumTestCase):
|
||||
self.assertEqual(field.get_attribute('required'), u'true')
|
||||
|
||||
def test_required_fields_in_set_password_form(self):
|
||||
c = self._login(self.selenium)
|
||||
c = self.login(self.selenium, self.test_username, self.test_password)
|
||||
|
||||
c.get(self.complete_url(reverse('dav_auth:set_password')))
|
||||
field = self.wait_on_presence(c, (By.ID, "id_new_password"))
|
||||
|
||||
@@ -258,8 +258,7 @@ class ScreenshotTestCase(SeleniumTestCase):
|
||||
if restore_size:
|
||||
self.selenium.set_window_size(window_size['width'], window_size['height'])
|
||||
|
||||
@skip_unless_tag_option()
|
||||
@tag('screenshots')
|
||||
@tag('screenshots', 'browser')
|
||||
def test_screenshots(self):
|
||||
for location in self.locations:
|
||||
self.get(location)
|
||||
|
||||
@@ -84,15 +84,18 @@
|
||||
</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a class="btn btn-info" href="{% url 'dav_events:updatestatus' event.pk 'publishing_facebook' %}">
|
||||
<a id="btn-confirmpublication-facebook" class="btn btn-info"
|
||||
href="{% url 'dav_events:updatestatus' event.pk 'publishing_facebook' %}">
|
||||
{% bootstrap_icon 'ok' %} 
|
||||
{% trans 'Facebook' %}
|
||||
</a>
|
||||
<a class="btn btn-primary" href="{% url 'dav_events:updatestatus' event.pk 'publishing_web' %}">
|
||||
<a id="btn-confirmpublication-web" class="btn btn-primary"
|
||||
href="{% url 'dav_events:updatestatus' event.pk 'publishing_web' %}">
|
||||
{% bootstrap_icon 'ok' %} 
|
||||
{% trans 'Webseite' %}
|
||||
</a>
|
||||
<a class="btn btn-success" href="{% url 'dav_events:updatestatus' event.pk 'publishing' %}">
|
||||
<a id="btn-confirmpublication-all" class="btn btn-success"
|
||||
href="{% url 'dav_events:updatestatus' event.pk 'publishing' %}">
|
||||
{% bootstrap_icon 'ok' %} 
|
||||
{% trans 'Überall' %}
|
||||
</a>
|
||||
@@ -110,7 +113,7 @@
|
||||
<div class="action-tabs">
|
||||
<div class="pull-right">
|
||||
{% if has_permission_submit %}
|
||||
<a class="btn {% if not is_submitted %}btn-success{% else %}btn-default disabled{% endif %}"
|
||||
<a id="btn-submit" class="btn {% if not is_submitted %}btn-success{% else %}btn-default disabled{% endif %}"
|
||||
data-toggle="modal" data-target="#modal-submit-dialog">
|
||||
{% if is_submitted %}
|
||||
{% bootstrap_icon 'check' %} 
|
||||
@@ -142,7 +145,7 @@
|
||||
{% trans 'Veröffentlichung bestätigen' %}
|
||||
</a>
|
||||
{% endif %}
|
||||
<a class="btn btn-primary"
|
||||
<a id="btn-clone" class="btn btn-primary"
|
||||
href="{% url 'dav_events:create' %}?copy={{ event.pk }}"
|
||||
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">
|
||||
{% bootstrap_icon 'duplicate' %} 
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import datetime
|
||||
import time
|
||||
from django.apps import apps
|
||||
from django.contrib.auth import get_user_model
|
||||
@@ -12,9 +11,10 @@ from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from selenium.webdriver.support.ui import Select
|
||||
|
||||
from dav_base.tests.generic import ScreenshotTestCase
|
||||
from dav_auth.tests.generic import SeleniumAuthMixin
|
||||
|
||||
from dav_base.tests.generic import skip_unless_tag_option, ScreenshotTestCase
|
||||
|
||||
TEST_TRAINER_EMAIL = 'trainer@localhost'
|
||||
TEST_PASSWORD = u'me||ön 2'
|
||||
TEST_EVENT_DATA_S = {
|
||||
'mode': 'training',
|
||||
@@ -36,7 +36,7 @@ TEST_EVENT_DATA_S = {
|
||||
'pre_meeting_1': '10.12.2019 18:35',
|
||||
'trainer_firstname': u'Trainer1 Ö.',
|
||||
'trainer_familyname': u'Ä. Tourenleiter',
|
||||
'trainer_email': 'trainer@localhost',
|
||||
'trainer_email': TEST_TRAINER_EMAIL,
|
||||
'trainer_2_fullname': u'Trainer2 Überflieger',
|
||||
'trainer_3_fullname': u'Trainer3 Weißalles',
|
||||
'deadline': 'month',
|
||||
@@ -88,11 +88,28 @@ TEST_EVENT_DATA_W = {
|
||||
u' heinzel =u}',
|
||||
],
|
||||
}
|
||||
TEST_EVENT_DATA_M = {
|
||||
'sport': 'M',
|
||||
'first_day': '21.6.2018',
|
||||
'trainer_firstname': u'Other',
|
||||
'trainer_familyname': u'Trainer',
|
||||
'trainer_email': 'other.trainer@localhost',
|
||||
'title': u'MTB-Zeitreise > 2018',
|
||||
'description': [
|
||||
u'Hier steht jetzt so allerhand Scheiß.',
|
||||
u'z.B. eine ÜRL: https://de.wikipedia.org (leider öhne Ümläüte)',
|
||||
u'& eine E-Mail-Ädresse: <heinzel@alpenverein-karlsruhe.de>'
|
||||
],
|
||||
'internal_note': [
|
||||
u'Automatisierter Software Test',
|
||||
u'Viele Grüße',
|
||||
u' heinzel =u}',
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@skip_unless_tag_option()
|
||||
@tag('screenshots')
|
||||
class TestCase(ScreenshotTestCase):
|
||||
@tag('screenshots', 'browser')
|
||||
class TestCase(SeleniumAuthMixin, ScreenshotTestCase):
|
||||
screenshot_prefix = 'dav_events-'
|
||||
|
||||
def create_user_for_role(self, role_name, first_name, last_name):
|
||||
@@ -113,21 +130,6 @@ class TestCase(ScreenshotTestCase):
|
||||
|
||||
return user
|
||||
|
||||
def login(self, username, password):
|
||||
self.get(reverse('dav_auth:login'))
|
||||
c = self.selenium
|
||||
username_field = self.wait_on_presence(c, (By.ID, 'id_username'))
|
||||
username_field.clear()
|
||||
username_field.send_keys(username)
|
||||
password_field = c.find_element_by_id('id_password')
|
||||
password_field.clear()
|
||||
password_field.send_keys(password)
|
||||
password_field.send_keys(Keys.RETURN)
|
||||
self.wait_until_stale(c, password_field)
|
||||
|
||||
def logout(self):
|
||||
self.get(reverse('dav_auth:logout'))
|
||||
|
||||
def create_event(self, event_data, auth=False, screenshots=True):
|
||||
data = event_data
|
||||
c = self.selenium
|
||||
@@ -300,18 +302,26 @@ class TestCase(ScreenshotTestCase):
|
||||
|
||||
if 'trainer_firstname' in data:
|
||||
field = self.wait_on_presence(c, (By.ID, 'id_trainer_firstname'))
|
||||
if auth:
|
||||
field.clear()
|
||||
field.send_keys(data['trainer_firstname'])
|
||||
|
||||
if 'trainer_familyname' in data:
|
||||
field = c.find_element_by_id('id_trainer_familyname')
|
||||
if auth:
|
||||
field.clear()
|
||||
field.send_keys(data['trainer_familyname'])
|
||||
|
||||
if 'trainer_email' in data:
|
||||
field = c.find_element_by_id('id_trainer_email')
|
||||
if auth:
|
||||
field.clear()
|
||||
field.send_keys(data['trainer_email'])
|
||||
|
||||
if 'trainer_phone' in data:
|
||||
field = c.find_element_by_id('id_trainer_phone')
|
||||
if auth:
|
||||
field.clear()
|
||||
field.send_keys(data['trainer_phone'])
|
||||
|
||||
if 'trainer_2_fullname' in data:
|
||||
@@ -466,6 +476,61 @@ class TestCase(ScreenshotTestCase):
|
||||
if screenshots:
|
||||
self.save_screenshot('event_list_after', sequence=sequence_name)
|
||||
|
||||
def clone_event(self, title, screenshots=True):
|
||||
c = self.selenium
|
||||
|
||||
sequence_name = 'clone_event'
|
||||
|
||||
c.get(self.complete_url(reverse('dav_events:root')))
|
||||
button = self.wait_on_presence(c, (By.ID, 'btn-events-list'))
|
||||
button.click()
|
||||
self.wait_until_stale(c, button)
|
||||
|
||||
if screenshots:
|
||||
self.save_screenshot('event_list_before', sequence=sequence_name)
|
||||
|
||||
link = c.find_element_by_link_text(title)
|
||||
link.click()
|
||||
self.wait_until_stale(c, link)
|
||||
|
||||
if screenshots:
|
||||
self.save_screenshot('event_details', sequence=sequence_name)
|
||||
|
||||
button = c.find_element_by_id('btn-clone')
|
||||
button.click()
|
||||
self.wait_until_stale(c, button)
|
||||
|
||||
for i in range(0, 11):
|
||||
try:
|
||||
button = c.find_element_by_id('btn-form-next')
|
||||
except NoSuchElementException:
|
||||
break
|
||||
|
||||
if screenshots:
|
||||
self.save_screenshot('form', sequence=sequence_name)
|
||||
|
||||
try:
|
||||
field = c.find_element_by_id('id_deadline')
|
||||
radio = field.find_element_by_css_selector('input[value=\'OTHER\']')
|
||||
radio.click()
|
||||
except NoSuchElementException:
|
||||
pass
|
||||
|
||||
button.click()
|
||||
self.wait_until_stale(c, button)
|
||||
else:
|
||||
self.fail('Too many sub forms')
|
||||
|
||||
if screenshots:
|
||||
self.save_screenshot('summary', sequence=sequence_name)
|
||||
|
||||
button = c.find_element_by_id('btn-form-submit')
|
||||
button.click()
|
||||
self.wait_until_stale(c, button)
|
||||
|
||||
if screenshots:
|
||||
self.save_screenshot('event-list-after', sequence=sequence_name)
|
||||
|
||||
def accept_event(self, title, screenshots=True):
|
||||
c = self.selenium
|
||||
|
||||
@@ -504,6 +569,44 @@ class TestCase(ScreenshotTestCase):
|
||||
if screenshots:
|
||||
self.save_screenshot('event_list_after', sequence=sequence_name)
|
||||
|
||||
def confirm_publication_event(self, title, channel='all', screenshots=True):
|
||||
c = self.selenium
|
||||
|
||||
sequence_name = 'confirm_publication'
|
||||
|
||||
c.get(self.complete_url(reverse('dav_events:root')))
|
||||
button = self.wait_on_presence(c, (By.ID, 'btn-events-list'))
|
||||
button.click()
|
||||
self.wait_until_stale(c, button)
|
||||
|
||||
if screenshots:
|
||||
self.save_screenshot('event_list_before', sequence=sequence_name)
|
||||
|
||||
link = c.find_element_by_link_text(title)
|
||||
link.click()
|
||||
self.wait_until_stale(c, link)
|
||||
|
||||
if screenshots:
|
||||
self.save_screenshot('event_details', sequence=sequence_name)
|
||||
|
||||
button = c.find_element_by_id('btn-confirmpublication')
|
||||
button.click()
|
||||
time.sleep(.5)
|
||||
if screenshots:
|
||||
self.save_screenshot('confirmpublication_modal', sequence=sequence_name)
|
||||
|
||||
button = c.find_element_by_css_selector('#btn-confirmpublication-{}'.format(channel))
|
||||
button.click()
|
||||
self.wait_until_stale(c, button)
|
||||
if screenshots:
|
||||
self.save_screenshot('confirmed_{}'.format(channel), sequence=sequence_name)
|
||||
|
||||
link = c.find_element_by_link_text(ugettext('Veranstaltungsliste'))
|
||||
link.click()
|
||||
self.wait_until_stale(c, link)
|
||||
if screenshots:
|
||||
self.save_screenshot('event_list_after', sequence=sequence_name)
|
||||
|
||||
def setUp(self):
|
||||
super(TestCase, self).setUp()
|
||||
|
||||
@@ -523,18 +626,38 @@ class TestCase(ScreenshotTestCase):
|
||||
|
||||
self.create_event(TEST_EVENT_DATA_S, auth=False)
|
||||
self.create_event(TEST_EVENT_DATA_W, auth=True)
|
||||
self.create_event(TEST_EVENT_DATA_M, auth=True)
|
||||
|
||||
link = c.find_element_by_link_text(TEST_EVENT_DATA_W['title'])
|
||||
link.click()
|
||||
self.wait_until_stale(c, link)
|
||||
self.save_screenshot('owner_event_details')
|
||||
|
||||
self.logout()
|
||||
self.logout(c)
|
||||
|
||||
self.login(self.manager_s.username, TEST_PASSWORD)
|
||||
self.login(c, self.manager_s.username, TEST_PASSWORD)
|
||||
self.accept_event(TEST_EVENT_DATA_S['title'])
|
||||
self.logout()
|
||||
self.logout(c)
|
||||
|
||||
self.login(self.manager_super.username, TEST_PASSWORD)
|
||||
self.login(c, self.manager_super.username, TEST_PASSWORD)
|
||||
self.accept_event(TEST_EVENT_DATA_W['title'])
|
||||
self.logout()
|
||||
self.logout(c)
|
||||
|
||||
self.login(c, self.publisher_web.username, TEST_PASSWORD)
|
||||
self.confirm_publication_event(TEST_EVENT_DATA_S['title'], channel='web')
|
||||
self.logout(c)
|
||||
|
||||
self.login(c, self.publisher_facebook.username, TEST_PASSWORD)
|
||||
self.confirm_publication_event(TEST_EVENT_DATA_S['title'], channel='facebook')
|
||||
self.logout(c)
|
||||
|
||||
self.login(c, self.publisher_facebook.username, TEST_PASSWORD)
|
||||
self.confirm_publication_event(TEST_EVENT_DATA_W['title'], channel='facebook')
|
||||
self.logout(c)
|
||||
|
||||
self.login(c, self.publisher_web.username, TEST_PASSWORD)
|
||||
self.confirm_publication_event(TEST_EVENT_DATA_W['title'], channel='web')
|
||||
self.logout(c)
|
||||
|
||||
self.login(c, TEST_TRAINER_EMAIL, TEST_PASSWORD)
|
||||
self.clone_event(TEST_EVENT_DATA_S['title'])
|
||||
|
||||
Reference in New Issue
Block a user