Files
django-dav-events/dav_events/tests/test_screenshots.py
2019-03-21 20:28:46 +01:00

541 lines
20 KiB
Python

# -*- coding: utf-8 -*-
import datetime
import time
from django.apps import apps
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.test import tag
from django.urls import reverse
from django.utils.translation import ugettext
from selenium.common.exceptions import NoSuchElementException
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 skip_unless_tag_option, ScreenshotTestCase
TEST_PASSWORD = u'me||ön 2'
TEST_EVENT_DATA_S = {
'mode': 'training',
'sport': 'S',
'ski_lift': True,
'first_day': '24.12.2019',
'last_day': '26.12.2019',
'country': 'CH',
'location': u'St. Antönien',
'transport_other': 'Helikopter & SUV',
'meeting_point': 'dav',
'meeting_time': '10:29',
'return_arrival_time': '20:14',
'arrival_previous_day': True,
'basecamp': u'Grand Hôtel Belvedere',
'accommodation': 'NONE',
'meals_other': u'Fünf-Sterne-Küche per Zimmerservice und Minibar',
'requirements_add': u'<Fußnoten>: https://de.wikipedia.org/wiki/Heliskiing',
'pre_meeting_1': '10.12.2019 18:35',
'trainer_firstname': u'Trainer1 Ö.',
'trainer_familyname': u'Ä. Tourenleiter',
'trainer_email': 'trainer@localhost',
'trainer_2_fullname': u'Trainer2 Überflieger',
'trainer_3_fullname': u'Trainer3 Weißalles',
'deadline': 'month',
'charge': '1800',
'additional_costs': None,
'course_topic_1': u'Grundkentnisse in der neusten Willy-Bögner-Kollektion',
'course_topic_2': u'Ein- & Aussteigen am Heliköpter',
'course_topic_3': u'Cocktailkunde für dekadentes Après-Ski',
'course_topic_4': u'Und vieles möhr',
'course_goal_1': [
u'"Gut" aussehen',
u'Lässig sein',
u'Geld scheißen',
],
'title': u'Heli-Skiing-Kurs für Snobs',
'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}',
],
}
TEST_EVENT_DATA_W = {
'level': 'advanced',
'first_day': '21.6.2019',
'alt_first_day': '22.06.2019',
'terrain': 'flats',
'location': u'Karlsruhe (Schloßpark)',
'transport': 'public',
'meeting_point_other': u'Bahnhof der Schloßgartenbahn',
'departure_time': '07:00',
'departure_ride': u'Schloßgartenbahn in Richtung "Schloßgartenbahnbahnhof"',
'return_departure_time': '19',
'return_arrival_time': '19:10',
'trainer_phone': u'+555 666 AB (Büro)',
'title': u'Wanderung durch den Karlsruher Schloßpark',
'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):
screenshot_prefix = 'dav_events-'
def create_user_for_role(self, role_name, first_name, last_name):
group = Group(name=role_name)
group.save()
user_model = get_user_model()
email = '{}@localhost'.format(role_name)
user_name = email
password = TEST_PASSWORD
user = user_model.objects.create_user(username=user_name, password=password, email=user_name,
first_name=first_name, last_name=last_name)
user.groups.add(group)
setting_name = 'groups_{}'.format(role_name)
app_config = apps.get_app_config('dav_events')
setattr(app_config.settings, setting_name, [role_name])
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
c.get(self.complete_url(reverse('dav_events:root')))
if auth:
sequence_name = 'create_event_auth'
button = self.wait_on_presence(c, (By.ID, 'btn-events-list'))
button.click()
button = self.wait_on_presence(c, (By.ID, 'btn-event-create'))
if screenshots:
self.save_screenshot('event_list_before', sequence=sequence_name)
else:
sequence_name = 'create_event_unauth'
button = self.wait_on_presence(c, (By.ID, 'btn-event-create'))
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('mode_form', sequence=sequence_name)
if 'mode' in data:
field = c.find_element_by_id('id_mode')
radio = field.find_element_by_css_selector('input[value=\'{}\']'.format(data['mode']))
radio.click()
if 'sport' in data:
field = c.find_element_by_id('id_sport')
radio = field.find_element_by_css_selector('input[value=\'{}\']'.format(data['sport']))
radio.click()
if 'level' in data:
field = c.find_element_by_id('id_level')
radio = field.find_element_by_css_selector('input[value=\'{}\']'.format(data['level']))
radio.click()
if 'ski_lift' in data and data['ski_lift']:
field = c.find_element_by_id('id_ski_lift')
field.click()
field = c.find_element_by_css_selector('input#id_first_day_widget')
field.send_keys(data['first_day'])
td = c.find_element_by_css_selector('div.datetimepicker-days td.active')
td.click()
field = c.find_element_by_css_selector('input#id_last_day_widget')
field.click()
if screenshots:
self.save_screenshot('last_date_widget', sequence=sequence_name)
if 'last_day' in data:
field.send_keys(data['last_day'])
if 'alt_first_day' in data:
field = c.find_element_by_css_selector('input#id_alt_first_day_widget')
field.send_keys(data['alt_first_day'])
if 'alt_last_day' in data:
field = c.find_element_by_css_selector('input#id_alt_last_day_widget')
field.send_keys(data['alt_last_day'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('location_form', sequence=sequence_name)
if 'country' in data:
field = c.find_element_by_id('id_country')
Select(field).select_by_value(data['country'])
if 'terrain' in data:
field = c.find_element_by_id('id_terrain')
Select(field).select_by_value(data['terrain'])
if 'location' in data:
field = c.find_element_by_id('id_location')
field.send_keys(data['location'])
if 'transport_other' in data:
field = c.find_element_by_id('id_transport_other')
field.send_keys(data['transport_other'])
if 'transport' in data:
field = c.find_element_by_id('id_transport')
Select(field).select_by_value(data['transport'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('journey_form', sequence=sequence_name)
if 'meeting_point_other' in data:
field = c.find_element_by_id('id_meeting_point_other')
field.send_keys(data['meeting_point_other'])
if 'meeting_point' in data:
field = c.find_element_by_id('id_meeting_point')
Select(field).select_by_value(data['meeting_point'])
if 'meeting_time' in data:
field = c.find_element_by_css_selector('input#id_meeting_time_widget')
field.send_keys(data['meeting_time'])
if 'departure_time' in data:
field = c.find_element_by_css_selector('input#id_departure_time_widget')
field.send_keys(data['departure_time'])
if 'departure_ride' in data:
field = c.find_element_by_id('id_departure_ride')
field.send_keys(data['departure_ride'])
if 'return_departure_time' in data:
field = c.find_element_by_css_selector('input#id_return_departure_time_widget')
field.send_keys(data['return_departure_time'])
if 'return_arrival_time' in data:
field = c.find_element_by_css_selector('input#id_return_arrival_time_widget')
field.send_keys(data['return_arrival_time'])
if 'arrival_previous_day' in data and data['arrival_previous_day']:
field = c.find_element_by_id('id_arrival_previous_day')
field.click()
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if 'last_day' in data:
if screenshots:
self.save_screenshot('accommodation_form', sequence=sequence_name)
if 'basecamp' in data:
field = c.find_element_by_id('id_basecamp')
field.send_keys(data['basecamp'])
if 'accommodation' in data:
field = c.find_element_by_id('id_accommodation')
Select(field).select_by_value(data['accommodation'])
if 'meals_other' in data:
field = c.find_element_by_id('id_meals_other')
field.send_keys(data['meals_other'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('requirements_form', sequence=sequence_name)
if 'requirements_add' in data:
field = c.find_element_by_id('id_requirements')
field.send_keys(Keys.RETURN)
if isinstance(data['requirements_add'], list):
field.send_keys(Keys.RETURN.join(data['requirements_add']))
else:
field.send_keys(data['requirements_add'])
if 'pre_meeting_1' in data:
field = c.find_element_by_css_selector('input#id_pre_meeting_1_widget')
field.send_keys(data['pre_meeting_1'])
if 'pre_meeting_2' in data:
field = c.find_element_by_css_selector('input#id_pre_meeting_2_widget')
field.send_keys(data['pre_meeting_2'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('trainer_form', sequence=sequence_name)
if 'trainer_firstname' in data:
field = self.wait_on_presence(c, (By.ID, 'id_trainer_firstname'))
field.send_keys(data['trainer_firstname'])
if 'trainer_familyname' in data:
field = c.find_element_by_id('id_trainer_familyname')
field.send_keys(data['trainer_familyname'])
if 'trainer_email' in data:
field = c.find_element_by_id('id_trainer_email')
field.send_keys(data['trainer_email'])
if 'trainer_phone' in data:
field = c.find_element_by_id('id_trainer_phone')
field.send_keys(data['trainer_phone'])
if 'trainer_2_fullname' in data:
field = c.find_element_by_id('id_trainer_2_fullname')
field.send_keys(data['trainer_2_fullname'])
if 'trainer_3_fullname' in data:
field = c.find_element_by_id('id_trainer_3_fullname')
field.send_keys(data['trainer_3_fullname'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('registration_form', sequence=sequence_name)
if 'deadline' in data:
field = c.find_element_by_id('id_deadline')
radio = field.find_element_by_css_selector('input[value=\'{}\']'.format(data['deadline']))
radio.click()
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('charges_form', sequence=sequence_name)
if 'charge' in data:
field = c.find_element_by_id('id_charge')
field.clear()
field.send_keys(data['charge'])
if 'additional_costs' in data:
field = c.find_element_by_id('id_additional_costs')
field.clear()
if data['additional_costs'] is not None:
field.send_keys(data['additional_costs'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if 'mode' in data and data['mode'] == 'training':
if screenshots:
self.save_screenshot('training_form', sequence=sequence_name)
field = c.find_element_by_id('id_course_topic_1')
if isinstance(data['course_topic_1'], list):
field.send_keys(Keys.RETURN.join(data['course_topic_1']))
else:
field.send_keys(data['course_topic_1'])
if 'course_topic_2' in data:
field = c.find_element_by_id('id_course_topic_2')
field.send_keys(data['course_topic_2'])
if 'course_topic_3' in data:
button = c.find_element_by_id('btn-topic-add')
button.click()
field = c.find_element_by_id('id_course_topic_3')
field.send_keys(data['course_topic_3'])
if 'course_topic_4' in data:
button.click()
field = c.find_element_by_id('id_course_topic_4')
field.send_keys(data['course_topic_4'])
field = c.find_element_by_id('id_course_goal_1')
if isinstance(data['course_goal_1'], list):
field.send_keys(Keys.RETURN.join(data['course_goal_1']))
else:
field.send_keys(data['course_goal_1'])
if 'course_goal_2' in data:
field = c.find_element_by_id('id_course_goal_2')
field.send_keys(data['course_goal_2'])
if 'course_goal_3' in data:
button = c.find_element_by_id('btn-goal-add')
button.click()
field = c.find_element_by_id('id_course_goal_3')
field.send_keys(data['course_goal_3'])
if 'course_goal_4' in data:
button.click()
field = c.find_element_by_id('id_course_goal_4')
field.send_keys(data['course_goal_4'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('description_form', sequence=sequence_name)
if 'title' in data:
field = c.find_element_by_id('id_title')
field.clear()
field.send_keys(data['title'])
field = c.find_element_by_id('id_description')
if isinstance(data['description'], list):
field.send_keys(Keys.RETURN.join(data['description']))
else:
field.send_keys(data['description'])
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('summary_form', sequence=sequence_name)
button = c.find_element_by_id('btn-form-back')
button.click()
self.wait_until_stale(c, button)
for i in range(0, 11):
try:
button = c.find_element_by_id('btn-form-next')
button.click()
self.wait_until_stale(c, button)
except NoSuchElementException:
break
else:
self.fail('Too many sub forms')
if 'internal_note' in data:
field = c.find_element_by_id('id_internal_note')
if isinstance(data['internal_note'], list):
field.send_keys(Keys.RETURN.join(data['internal_note']))
else:
field.send_keys(data['internal_note'])
button = c.find_element_by_id('btn-form-submit')
button.click()
self.wait_until_stale(c, button)
if not auth:
if screenshots:
self.save_screenshot('user_and_event_created_set_password', sequence=sequence_name)
field = c.find_element_by_id('id_new_password')
field.send_keys(TEST_PASSWORD)
field = c.find_element_by_id('id_new_password_repeat')
field.send_keys(TEST_PASSWORD)
field.send_keys(Keys.RETURN)
self.wait_until_stale(c, field)
if screenshots:
self.save_screenshot('finished', sequence=sequence_name)
else:
if screenshots:
self.save_screenshot('event_list_after', sequence=sequence_name)
def accept_event(self, title, screenshots=True):
c = self.selenium
sequence_name = 'accept_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-accept')
button.click()
time.sleep(.5)
if screenshots:
self.save_screenshot('accept_modal', sequence=sequence_name)
button = c.find_element_by_css_selector('#modal-accept-dialog a.btn-success')
button.click()
self.wait_until_stale(c, button)
if screenshots:
self.save_screenshot('accepted', 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()
self.manager_super = self.create_user_for_role('manager_super', 'Manager Super', 'Tourenreferent')
self.manager_w = self.create_user_for_role('manager_w', 'Manager W', 'BereichsleiterWandern')
self.manager_s = self.create_user_for_role('manager_s', 'Manager S', 'BereichsleiterSki')
self.publisher_print = self.create_user_for_role('publisher_print', 'Publisher Print', 'RedaktionPrint')
self.publisher_web = self.create_user_for_role('publisher_web', 'Publisher Web', 'RedaktionWeb')
self.publisher_facebook = self.create_user_for_role('publisher_facebook', 'Publisher Facebook', 'RedaktionFacebook')
def test_screenshots(self):
#self.quit_selenium = False
c = self.selenium
self.get(reverse('dav_events:root'))
self.save_screenshot('home')
self.create_event(TEST_EVENT_DATA_S, auth=False)
self.create_event(TEST_EVENT_DATA_W, 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.login(self.manager_s.username, TEST_PASSWORD)
self.accept_event(TEST_EVENT_DATA_S['title'])
self.logout()
self.login(self.manager_super.username, TEST_PASSWORD)
self.accept_event(TEST_EVENT_DATA_W['title'])
self.logout()