This repository has been archived on 2026-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
RepApp/rc_hip/repapp/live_tests.py

204 lines
8 KiB
Python
Raw Normal View History

2023-04-25 09:06:31 +00:00
import time
import os
2023-04-27 09:09:41 +00:00
import datetime
import random
2023-04-25 09:06:31 +00:00
from pathlib import Path
2023-04-27 09:09:41 +00:00
from hashlib import sha256
2023-04-25 09:06:31 +00:00
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium.webdriver.common.by import By
2023-04-28 09:54:13 +00:00
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver import ActionChains, Keys
from .models import CustomUser, OneTimeLogin
2023-04-25 09:06:31 +00:00
class WorkflowTests(StaticLiveServerTestCase):
2023-04-27 09:09:41 +00:00
"""
Tests for workflows.
"""
2023-04-25 09:06:31 +00:00
fixtures = ["cafe-data.json"]
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.selenium = WebDriver()
2023-04-28 09:54:13 +00:00
cls.selenium.implicitly_wait(50)
cls.selenium.maximize_window()
2023-04-25 09:06:31 +00:00
@classmethod
def tearDownClass(cls):
cls.selenium.quit()
super().tearDownClass()
2023-04-27 09:09:41 +00:00
def setUp(self):
super().setUp()
2023-04-28 09:54:13 +00:00
self.action_chains = ActionChains(self.selenium)
2023-04-27 09:09:41 +00:00
self.password = "ATestPassword"
user = CustomUser.objects.get(pk=3)
user.set_password(self.password)
user.save()
self.user = user
print(f'Password of user {user.email} updated to {self.password}.')
url = "/guest/profile/"
secret = sha256(
f'{user.email}{url}{datetime.datetime.now()}{random.randint(0,9999999)}'.encode(
'utf-8')
).hexdigest()
self.secret = secret
secret_hash = sha256(secret.encode('utf-8')).hexdigest()
one_time_login = OneTimeLogin(
secret=secret_hash,
user=user,
url=url,
)
one_time_login.save()
self.one_time_login = one_time_login
2023-04-25 09:06:31 +00:00
def test_register_device(self):
2023-04-27 09:09:41 +00:00
"""
Test device registration flows.
"""
2023-04-25 09:06:31 +00:00
# Open landing page
self.selenium.get(f"{self.live_server_url}/")
# Click on a register link
self.selenium.find_element(By.CLASS_NAME, "register_link").click()
2023-04-28 09:54:13 +00:00
time.sleep(2)
2023-04-25 09:06:31 +00:00
# Enter new device
# Enter guest mail address
mail = self.selenium.find_element(By.NAME, "mail")
mail.send_keys("guest@example.com")
# Enter device
device = self.selenium.find_element(By.NAME, "device")
device.send_keys("A Test Device")
# Enter manufacturer
manufacturer = self.selenium.find_element(By.NAME, "manufacturer")
manufacturer.send_keys("A Test Manufacturer")
# Enter a error description
error = self.selenium.find_element(By.NAME, "error")
error.send_keys("A description of the issue\nof the device.")
2023-04-28 09:54:13 +00:00
# Scroll to the bottom of the page
self.selenium.find_element(
By.TAG_NAME, "body").send_keys(Keys.CONTROL, Keys.END)
time.sleep(1)
2023-04-25 09:06:31 +00:00
# Skip device picture and device type plate
# No follow up repair
# Accept repair conditions
self.selenium.find_element(By.NAME, "confirm_repair").click()
# Accept data protection notice
self.selenium.find_element(By.NAME, "confirm_data").click()
time.sleep(1)
# Send form
self.selenium.find_element(By.CLASS_NAME, 'submit_button').click()
time.sleep(1)
# Register new guest
# Enter guest name
name = self.selenium.find_element(By.NAME, "name")
name.send_keys("A Guest")
# Enter guest phone
phone = self.selenium.find_element(By.NAME, "phone")
phone.send_keys("0911 123 456")
# Enter guest residence
residence = self.selenium.find_element(By.NAME, "residence")
residence.send_keys("Musterstadt")
time.sleep(1)
# Send form
self.selenium.find_element(By.CLASS_NAME, 'submit_button').click()
time.sleep(1)
self.assertTrue("confirm" in self.selenium.current_url)
self.assertTrue("Anmeldung erfolgreich!" in self.selenium.page_source)
# Register second device
# Open landing page again
self.selenium.get(f"{self.live_server_url}/")
# Click on a register link
self.selenium.find_element(By.CLASS_NAME, "register_link").click()
time.sleep(1)
# Enter new device
# Enter guest mail address
mail = self.selenium.find_element(By.NAME, "mail")
mail.send_keys("guest@example.com")
# Enter device
device = self.selenium.find_element(By.NAME, "device")
device.send_keys("Another Test Device")
# Enter manufacturer
manufacturer = self.selenium.find_element(By.NAME, "manufacturer")
manufacturer.send_keys("Another Test Manufacturer")
# Enter a error description
error = self.selenium.find_element(By.NAME, "error")
error.send_keys("Another issue description.")
2023-04-28 09:54:13 +00:00
# Scroll to the bottom of the page
self.selenium.find_element(
By.TAG_NAME, "body").send_keys(Keys.CONTROL, Keys.END)
time.sleep(1)
2023-04-25 09:06:31 +00:00
# Add device picture
test_script_folder = Path(__file__).resolve().parent
fixtures_folder = os.path.join(test_script_folder, "fixtures")
device_picture_file = os.path.join(fixtures_folder, "Hummingbird.jpg")
device_picture = self.selenium.find_element(By.NAME, "device_picture")
device_picture.send_keys(device_picture_file)
print(f"Using device picture {device_picture_file}")
# Add type plate picture
type_plate_picture_file = os.path.join(fixtures_folder, "Nut.jpg")
type_plate_picture = self.selenium.find_element(
By.NAME, "type_plate_picture")
type_plate_picture.send_keys(type_plate_picture_file)
print(f"Using type plate picture {type_plate_picture_file}")
# Select as follow up repair
self.selenium.find_element(By.NAME, "follow_up").click()
# Accept repair conditions
self.selenium.find_element(By.NAME, "confirm_repair").click()
# Accept data protection notice
self.selenium.find_element(By.NAME, "confirm_data").click()
time.sleep(1)
# Send form
self.selenium.find_element(By.CLASS_NAME, 'submit_button').click()
time.sleep(1)
# Guest is known, no guest registration needed.
self.assertTrue("confirm" in self.selenium.current_url)
self.assertTrue("Anmeldung erfolgreich!" in self.selenium.page_source)
2023-04-27 09:09:41 +00:00
def test_login_and_view_profile(self):
"""
Test login and profile page.
"""
# Open login form
self.selenium.get(f"{self.live_server_url}/accounts/login/")
# Enter login data
# Enter guest mail address
username = self.selenium.find_element(By.NAME, "username")
username.send_keys(self.user.email)
# Enter password
password = self.selenium.find_element(By.NAME, "password")
password.send_keys(self.password)
time.sleep(1)
# Submit form
self.selenium.find_element(
By.XPATH, '//button[@type="submit"]').click()
time.sleep(1)
self.selenium.get(f"{self.live_server_url}/guest/profile/")
time.sleep(1)
self.assertTrue(self.user.email in self.selenium.page_source)
self.assertTrue("/guest/profile/" in self.selenium.current_url)
time.sleep(1)
def test_one_time_login_and_view_device(self):
"""
Test one time login and device page.
"""
# Open login form
self.selenium.get(
f"{self.live_server_url}/onetimelogin/{self.secret}/")
time.sleep(1)
self.assertTrue(self.user.email in self.selenium.page_source)
self.assertTrue("Login erfolgreich" in self.selenium.page_source)
self.assertTrue("/guest/profile/" in self.selenium.current_url)
time.sleep(1)
self.selenium.get(
f"{self.live_server_url}/device/5f3d413409ca9c90c99540fd5677cc1147156f100d7bd29d3a1c1940e5f2c6ac/")
time.sleep(1)
self.assertTrue("Test Gerät" in self.selenium.page_source)
self.assertTrue("Test Hersteller" in self.selenium.page_source)
self.assertTrue("/device/" in self.selenium.current_url)
time.sleep(1)