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.by import By
from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.keys import Keys
from dav_base.tests.generic import ScreenshotTestCase
from dav_base.tests.generic import skip_unless_tag_option, ScreenshotTestCase
TEST_USERNAME = 'root@localhost' TEST_USERNAME = 'root@localhost'
TEST_PASSWORD = u'me||ön 2' TEST_PASSWORD = u'me||ön 2'
TEST_EMAIL = TEST_USERNAME TEST_EMAIL = TEST_USERNAME
@skip_unless_tag_option() @tag('screenshots', 'browser')
@tag('screenshots')
class TestCase(ScreenshotTestCase): class TestCase(ScreenshotTestCase):
screenshot_prefix = 'dav_auth-' screenshot_prefix = 'dav_auth-'

View File

@@ -5,11 +5,11 @@ from django.utils.translation import ugettext
from django.urls import reverse from django.urls import reverse
from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By 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 dav_base.tests.generic import SeleniumTestCase
from .generic import SeleniumAuthMixin
TEST_USERNAME = 'root@localhost' TEST_USERNAME = 'root@localhost'
TEST_PASSWORD = u'me||ön 2' TEST_PASSWORD = u'me||ön 2'
TEST_EMAIL = TEST_USERNAME TEST_EMAIL = TEST_USERNAME
@@ -26,7 +26,7 @@ class TemplatesTestCase(SimpleTestCase):
@tag('browser') @tag('browser')
class TestCase(SeleniumTestCase): class TestCase(SeleniumAuthMixin, SeleniumTestCase):
def setUp(self): def setUp(self):
super(TestCase, self).setUp() super(TestCase, self).setUp()
# Need a test user # Need a test user
@@ -35,19 +35,6 @@ class TestCase(SeleniumTestCase):
model = get_user_model() model = get_user_model()
self.user = model.objects.create_user(username=TEST_USERNAME, password=TEST_PASSWORD, email=TEST_EMAIL) 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): def test_login_button_in_root_page(self):
c = self.selenium c = self.selenium
c.get(self.complete_url('/')) c.get(self.complete_url('/'))
@@ -68,7 +55,7 @@ class TestCase(SeleniumTestCase):
self.assertEqual(field.get_attribute('required'), u'true') self.assertEqual(field.get_attribute('required'), u'true')
def test_required_fields_in_set_password_form(self): 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'))) c.get(self.complete_url(reverse('dav_auth:set_password')))
field = self.wait_on_presence(c, (By.ID, "id_new_password")) field = self.wait_on_presence(c, (By.ID, "id_new_password"))

View File

@@ -258,8 +258,7 @@ class ScreenshotTestCase(SeleniumTestCase):
if restore_size: if restore_size:
self.selenium.set_window_size(window_size['width'], window_size['height']) self.selenium.set_window_size(window_size['width'], window_size['height'])
@skip_unless_tag_option() @tag('screenshots', 'browser')
@tag('screenshots')
def test_screenshots(self): def test_screenshots(self):
for location in self.locations: for location in self.locations:
self.get(location) self.get(location)

View File

@@ -84,15 +84,18 @@
</p> </p>
</div> </div>
<div class="modal-footer"> <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; {% bootstrap_icon 'ok' %}&thinsp;
{% trans 'Facebook' %} {% trans 'Facebook' %}
</a> </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; {% bootstrap_icon 'ok' %}&thinsp;
{% trans 'Webseite' %} {% trans 'Webseite' %}
</a> </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; {% bootstrap_icon 'ok' %}&thinsp;
{% trans 'Überall' %} {% trans 'Überall' %}
</a> </a>
@@ -110,7 +113,7 @@
<div class="action-tabs"> <div class="action-tabs">
<div class="pull-right"> <div class="pull-right">
{% if has_permission_submit %} {% 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"> data-toggle="modal" data-target="#modal-submit-dialog">
{% if is_submitted %} {% if is_submitted %}
{% bootstrap_icon 'check' %}&thinsp; {% bootstrap_icon 'check' %}&thinsp;
@@ -142,7 +145,7 @@
{% trans 'Veröffentlichung bestätigen' %} {% trans 'Veröffentlichung bestätigen' %}
</a> </a>
{% endif %} {% endif %}
<a class="btn btn-primary" <a id="btn-clone" class="btn btn-primary"
href="{% url 'dav_events:create' %}?copy={{ event.pk }}" href="{% url 'dav_events:create' %}?copy={{ event.pk }}"
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}"> title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">
{% bootstrap_icon 'duplicate' %}&thinsp; {% bootstrap_icon 'duplicate' %}&thinsp;

View File

@@ -1,5 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime
import time import time
from django.apps import apps from django.apps import apps
from django.contrib.auth import get_user_model 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.common.keys import Keys
from selenium.webdriver.support.ui import Select 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_PASSWORD = u'me||ön 2'
TEST_EVENT_DATA_S = { TEST_EVENT_DATA_S = {
'mode': 'training', 'mode': 'training',
@@ -36,7 +36,7 @@ TEST_EVENT_DATA_S = {
'pre_meeting_1': '10.12.2019 18:35', 'pre_meeting_1': '10.12.2019 18:35',
'trainer_firstname': u'Trainer1 Ö.', 'trainer_firstname': u'Trainer1 Ö.',
'trainer_familyname': u'Ä. Tourenleiter', 'trainer_familyname': u'Ä. Tourenleiter',
'trainer_email': 'trainer@localhost', 'trainer_email': TEST_TRAINER_EMAIL,
'trainer_2_fullname': u'Trainer2 Überflieger', 'trainer_2_fullname': u'Trainer2 Überflieger',
'trainer_3_fullname': u'Trainer3 Weißalles', 'trainer_3_fullname': u'Trainer3 Weißalles',
'deadline': 'month', 'deadline': 'month',
@@ -88,11 +88,28 @@ TEST_EVENT_DATA_W = {
u' heinzel =u}', 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', 'browser')
@tag('screenshots') class TestCase(SeleniumAuthMixin, ScreenshotTestCase):
class TestCase(ScreenshotTestCase):
screenshot_prefix = 'dav_events-' screenshot_prefix = 'dav_events-'
def create_user_for_role(self, role_name, first_name, last_name): def create_user_for_role(self, role_name, first_name, last_name):
@@ -113,21 +130,6 @@ class TestCase(ScreenshotTestCase):
return user 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): def create_event(self, event_data, auth=False, screenshots=True):
data = event_data data = event_data
c = self.selenium c = self.selenium
@@ -300,18 +302,26 @@ class TestCase(ScreenshotTestCase):
if 'trainer_firstname' in data: if 'trainer_firstname' in data:
field = self.wait_on_presence(c, (By.ID, 'id_trainer_firstname')) field = self.wait_on_presence(c, (By.ID, 'id_trainer_firstname'))
if auth:
field.clear()
field.send_keys(data['trainer_firstname']) field.send_keys(data['trainer_firstname'])
if 'trainer_familyname' in data: if 'trainer_familyname' in data:
field = c.find_element_by_id('id_trainer_familyname') field = c.find_element_by_id('id_trainer_familyname')
if auth:
field.clear()
field.send_keys(data['trainer_familyname']) field.send_keys(data['trainer_familyname'])
if 'trainer_email' in data: if 'trainer_email' in data:
field = c.find_element_by_id('id_trainer_email') field = c.find_element_by_id('id_trainer_email')
if auth:
field.clear()
field.send_keys(data['trainer_email']) field.send_keys(data['trainer_email'])
if 'trainer_phone' in data: if 'trainer_phone' in data:
field = c.find_element_by_id('id_trainer_phone') field = c.find_element_by_id('id_trainer_phone')
if auth:
field.clear()
field.send_keys(data['trainer_phone']) field.send_keys(data['trainer_phone'])
if 'trainer_2_fullname' in data: if 'trainer_2_fullname' in data:
@@ -466,6 +476,61 @@ class TestCase(ScreenshotTestCase):
if screenshots: if screenshots:
self.save_screenshot('event_list_after', sequence=sequence_name) 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): def accept_event(self, title, screenshots=True):
c = self.selenium c = self.selenium
@@ -504,6 +569,44 @@ class TestCase(ScreenshotTestCase):
if screenshots: if screenshots:
self.save_screenshot('event_list_after', sequence=sequence_name) 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): def setUp(self):
super(TestCase, self).setUp() 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_S, auth=False)
self.create_event(TEST_EVENT_DATA_W, auth=True) 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 = c.find_element_by_link_text(TEST_EVENT_DATA_W['title'])
link.click() link.click()
self.wait_until_stale(c, link) self.wait_until_stale(c, link)
self.save_screenshot('owner_event_details') 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.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.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'])