UPD: more and better tests.

This commit is contained in:
2019-03-22 17:32:08 +01:00
parent dc37c110df
commit e20f536b1b
6 changed files with 187 additions and 55 deletions

22
dav_auth/tests/generic.py Normal file
View 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

View File

@@ -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-'

View File

@@ -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"))

View File

@@ -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)

View File

@@ -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' %}&thinsp;
{% 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' %}&thinsp;
{% 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' %}&thinsp;
{% 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' %}&thinsp;
@@ -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' %}&thinsp;

View File

@@ -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'])