Skip to content
Snippets Groups Projects
Commit 9c17d435 authored by robinwilliam.hundt's avatar robinwilliam.hundt
Browse files

# This is a combination of 3 commits.

# The first commit's message is:
Added tests for Frontpages

# The 2nd commit message will be skipped:

#	Added tests for Frontpages

# The 3rd commit message will be skipped:

#	Fixed tests failing in ci
#
#	Possibly due to weak password, since CI tests use live settings
parent 83ff19ab
No related branches found
No related tags found
1 merge request!128Merge improve testing
...@@ -30,6 +30,9 @@ install: ...@@ -30,6 +30,9 @@ install:
test: test:
DJANGO_SETTINGS_MODULE=grady.settings pytest DJANGO_SETTINGS_MODULE=grady.settings pytest
teste2e:
cd frontend && yarn build && cp dist/index.html ../core/templates && cd .. && python util/format_index.py && python manage.py collectstatic --no-input && HEADLESS_TESTS=$(headless) pytest --ds=grady.settings $(path); git checkout core/templates/index.html
coverage: coverage:
DJANGO_SETTINGS_MODULE=grady.settings pytest --cov DJANGO_SETTINGS_MODULE=grady.settings pytest --cov
coverage html coverage html
......
<template> <template>
<v-card> <v-card name='subscription-list'>
<v-toolbar color="teal" :dense="sidebar"> <v-toolbar color="teal" :dense="sidebar">
<v-toolbar-side-icon><v-icon>assignment</v-icon></v-toolbar-side-icon> <v-toolbar-side-icon><v-icon>assignment</v-icon></v-toolbar-side-icon>
<v-toolbar-title v-if="showDetail" style="min-width: fit-content;"> <v-toolbar-title v-if="showDetail" style="min-width: fit-content;">
......
import os import time
from typing import Sequence
from django.test import LiveServerTestCase from django.test import LiveServerTestCase
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.remote.webelement import WebElement
from functional_tests.util import get_frontend_url, login, create_browser from core import models
from core.models import UserAccount
from functional_tests.util import login, create_browser, extract_hrefs_hashes
from util import factory_boys as fact from util import factory_boys as fact
LiveServerTestCase.port = int(os.environ.get('LIVE_SERVER_PORT', 0))
class UntestedParent:
class FrontPageTestsTutorReviewer(): class FrontPageTestsTutorReviewer(LiveServerTestCase):
def __init__(self): browser: webdriver.Firefox = None
self.browser: webdriver.Firefox = None username = None
password = None
def _login(self): role = None
login(self.browser, self.live_server_url, self.username, self.password)
def setUp(self):
def test_statistics_are_shown(self): fact.SubmissionFactory.create_batch(4)
self._login()
statistcs = self.browser.find_element_by_id('correction-statistics') def _login(self):
title = statistcs.find_element_by_class_name('title') login(self.browser, self.live_server_url, self.username, self.password)
self.assertEqual('Statistics', title.text)
def test_statistics_are_shown(self):
self._login()
class FrontPageTestsTutor(LiveServerTestCase, FrontPageTestsTutorReviewer): statistics = self.browser.find_element_by_id('correction-statistics')
title = statistics.find_element_by_class_name('title')
self.assertEqual('Statistics', title.text)
def test_available_tasks_are_shown(self):
self._login()
tasks = self.browser.find_element_by_name('subscription-list')
title = tasks.find_element_by_class_name('v-toolbar__title')
self.assertEqual('Tasks', title.text)
time.sleep(8)
subscription_links = extract_hrefs_hashes(
tasks.find_elements_by_tag_name('a')
)
subscriptions = models.SubmissionSubscription.objects.filter(
owner__username=self.username,
deactivated=False,
feedback_stage=models.SubmissionSubscription.FEEDBACK_CREATION
).exclude(query_type=models.SubmissionSubscription.RANDOM)
for sub in subscriptions:
self.assertIn(f'/subscription/{sub.pk}', subscription_links)
class FrontPageTestsTutor(UntestedParent.FrontPageTestsTutorReviewer):
def setUp(self): def setUp(self):
self.live_server_url = get_frontend_url(self.live_server_url) super().setUp()
self.browser = create_browser() self.browser = create_browser()
self.username = 'tutor' self.username = 'tutor'
self.password = 'p' self.password = 'p'
fact.UserAccountFactory(username=self.username, password=self.password) self.role = UserAccount.TUTOR
fact.SubmissionFactory() fact.UserAccountFactory(
username=self.username,
password=self.password
)
def tearDown(self): def tearDown(self):
self.browser.quit() self.browser.quit()
...@@ -40,8 +64,9 @@ class FrontPageTestsTutor(LiveServerTestCase, FrontPageTestsTutorReviewer): ...@@ -40,8 +64,9 @@ class FrontPageTestsTutor(LiveServerTestCase, FrontPageTestsTutorReviewer):
def test_side_bar_contains_correct_items(self): def test_side_bar_contains_correct_items(self):
self._login() self._login()
drawer = self.browser.find_element_by_class_name('v-navigation-drawer') drawer = self.browser.find_element_by_class_name('v-navigation-drawer')
links = extract_hrefs(drawer.find_elements_by_tag_name('a')) links = extract_hrefs_hashes(drawer.find_elements_by_tag_name('a'))
self.assertTrue(all(link in links for link in ['#/home', '#/feedback'])) print(links)
self.assertTrue(all(link in links for link in ['/home', '/feedback']))
task_title = drawer.find_element_by_class_name('v-toolbar__title') task_title = drawer.find_element_by_class_name('v-toolbar__title')
self.assertEqual('Tasks', task_title.text) self.assertEqual('Tasks', task_title.text)
footer = drawer.find_element_by_class_name('sidebar-footer') footer = drawer.find_element_by_class_name('sidebar-footer')
...@@ -51,13 +76,19 @@ class FrontPageTestsTutor(LiveServerTestCase, FrontPageTestsTutorReviewer): ...@@ -51,13 +76,19 @@ class FrontPageTestsTutor(LiveServerTestCase, FrontPageTestsTutorReviewer):
feedback_link.get_attribute('href')) feedback_link.get_attribute('href'))
class FrontPageTestsReviewer(LiveServerTestCase, FrontPageTestsTutorReviewer): class FrontPageTestsReviewer(UntestedParent.FrontPageTestsTutorReviewer):
def setUp(self): def setUp(self):
self.live_server_url = get_frontend_url(self.live_server_url) super().setUp()
self.browser = create_browser()
self.browser = create_browser() self.browser = create_browser()
self.username = 'reviewer' self.username = 'reviewer'
self.password = 'p' self.password = 'p'
fact.UserAccountFactory(username=self.username, password=self.password) self.role = UserAccount.REVIEWER
fact.UserAccountFactory(
username=self.username,
password=self.password,
role=self.role
)
def tearDown(self): def tearDown(self):
self.browser.quit() self.browser.quit()
...@@ -65,9 +96,9 @@ class FrontPageTestsReviewer(LiveServerTestCase, FrontPageTestsTutorReviewer): ...@@ -65,9 +96,9 @@ class FrontPageTestsReviewer(LiveServerTestCase, FrontPageTestsTutorReviewer):
def test_side_bar_contains_correct_items(self): def test_side_bar_contains_correct_items(self):
self._login() self._login()
drawer = self.browser.find_element_by_class_name('v-navigation-drawer') drawer = self.browser.find_element_by_class_name('v-navigation-drawer')
links = extract_hrefs(drawer.find_elements_by_tag_name('a')) links = extract_hrefs_hashes(drawer.find_elements_by_tag_name('a'))
self.assertTrue(all(link in links for link in self.assertTrue(all(link in links for link in
['#/home', '#/feedback', '#/student-overview', '#/tutor-overview'])) ['/home', '/feedback', '/student-overview', '/tutor-overview']))
task_title = drawer.find_element_by_class_name('v-toolbar__title') task_title = drawer.find_element_by_class_name('v-toolbar__title')
self.assertEqual('Tasks', task_title.text) self.assertEqual('Tasks', task_title.text)
footer = drawer.find_element_by_class_name('sidebar-footer') footer = drawer.find_element_by_class_name('sidebar-footer')
...@@ -75,7 +106,3 @@ class FrontPageTestsReviewer(LiveServerTestCase, FrontPageTestsTutorReviewer): ...@@ -75,7 +106,3 @@ class FrontPageTestsReviewer(LiveServerTestCase, FrontPageTestsTutorReviewer):
self.assertEqual('Give us Feedback!', feedback_link.text) self.assertEqual('Give us Feedback!', feedback_link.text)
self.assertEqual('https://gitlab.gwdg.de/j.michal/grady/issues', self.assertEqual('https://gitlab.gwdg.de/j.michal/grady/issues',
feedback_link.get_attribute('href')) feedback_link.get_attribute('href'))
def extract_hrefs(web_elements: Sequence[WebElement]):
return [el.get_attribute('href') for el in web_elements]
...@@ -7,7 +7,6 @@ from selenium.webdriver.common.keys import Keys ...@@ -7,7 +7,6 @@ from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options from selenium.webdriver.firefox.options import Options
from core.models import UserAccount from core.models import UserAccount
from functional_tests.util import get_frontend_url
from util.factories import make_test_data from util.factories import make_test_data
...@@ -16,7 +15,6 @@ LiveServerTestCase.port = int(os.environ.get('LIVE_SERVER_PORT', 0)) ...@@ -16,7 +15,6 @@ LiveServerTestCase.port = int(os.environ.get('LIVE_SERVER_PORT', 0))
class LoginPageTest(LiveServerTestCase): class LoginPageTest(LiveServerTestCase):
def setUp(self): def setUp(self):
self.live_server_url = get_frontend_url(self.live_server_url)
options = Options() options = Options()
# funnily the method is marked deprecated but the alternative setter is not working... # funnily the method is marked deprecated but the alternative setter is not working...
options.headless = bool(os.environ.get('HEADLESS_TESTS', False)) options.headless = bool(os.environ.get('HEADLESS_TESTS', False))
...@@ -134,4 +132,3 @@ class LoginPageTest(LiveServerTestCase): ...@@ -134,4 +132,3 @@ class LoginPageTest(LiveServerTestCase):
tutor = UserAccount.objects.get(username=username) tutor = UserAccount.objects.get(username=username)
self.assertEqual(UserAccount.TUTOR, tutor.role) self.assertEqual(UserAccount.TUTOR, tutor.role)
self.assertFalse(tutor.is_active, "Tutors should be inactive after registered") self.assertFalse(tutor.is_active, "Tutors should be inactive after registered")
import os import os
import time import time
from itertools import islice
from typing import Sequence
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options from selenium.webdriver.firefox.options import Options
from selenium.webdriver.remote.webelement import WebElement
def get_frontend_url(live_server_url):
return os.environ.get('FRONTEND_URL', live_server_url)
def create_browser(): def create_browser():
...@@ -26,3 +25,13 @@ def login(browser, live_server_url, username, password='p'): ...@@ -26,3 +25,13 @@ def login(browser, live_server_url, username, password='p'):
password_input.send_keys(password) password_input.send_keys(password)
browser.find_element_by_xpath('//button[@type="submit"]').send_keys(Keys.ENTER) browser.find_element_by_xpath('//button[@type="submit"]').send_keys(Keys.ENTER)
time.sleep(1) time.sleep(1)
def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(islice(iterable, n, None), default)
def extract_hrefs_hashes(web_elements: Sequence[WebElement]):
return [nth(el.get_attribute('href').split('#'), 1, '')
for el in web_elements if el.get_attribute('href')]
...@@ -10,6 +10,8 @@ fake.seed(42) ...@@ -10,6 +10,8 @@ fake.seed(42)
class ExamTypeFactory(DjangoModelFactory): class ExamTypeFactory(DjangoModelFactory):
class Meta: class Meta:
model = models.ExamType model = models.ExamType
django_get_or_create = ('module_reference',)
module_reference = 'B.Inf.4242 Test Module' module_reference = 'B.Inf.4242 Test Module'
total_score = 90 total_score = 90
pass_score = 45 pass_score = 45
...@@ -29,11 +31,12 @@ class SubmissionTypeFactory(DjangoModelFactory): ...@@ -29,11 +31,12 @@ class SubmissionTypeFactory(DjangoModelFactory):
class UserAccountFactory(DjangoModelFactory): class UserAccountFactory(DjangoModelFactory):
class Meta: class Meta:
model = models.UserAccount model = models.UserAccount
django_get_or_create = ('username',)
role = models.UserAccount.REVIEWER role = models.UserAccount.TUTOR
fullname = fake.name() fullname = fake.name
username = fake.user_name() username = fake.user_name
password = factory.PostGenerationMethodCall('set_password', 'p') password = factory.PostGenerationMethodCall('set_password', 'redrum-is-murder-reversed')
class StudentInfoFactory(DjangoModelFactory): class StudentInfoFactory(DjangoModelFactory):
...@@ -49,7 +52,7 @@ class TestFactory(DjangoModelFactory): ...@@ -49,7 +52,7 @@ class TestFactory(DjangoModelFactory):
model = models.Test model = models.Test
name = 'EmptyTest' name = 'EmptyTest'
label = 'Epmty' label = 'Empty'
annotation = 'This is an annotation' annotation = 'This is an annotation'
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment