From 7509a80803999aa845b1fb060e1fd471ab196b7f Mon Sep 17 00:00:00 2001 From: "robinwilliam.hundt" <robinwilliam.hundt@stud.uni-goettingen.de> Date: Tue, 23 Oct 2018 19:59:59 +0200 Subject: [PATCH] Added factory-boy dependency and started writing more e2e test --- .../src/components/CorrectionStatistics.vue | 2 +- functional_tests/test_front_pages.py | 47 +++++++++ functional_tests/util.py | 23 +++++ requirements.dev.txt | 2 + util/factory_boys.py | 99 +++++++++++++++++++ 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 functional_tests/test_front_pages.py create mode 100644 util/factory_boys.py diff --git a/frontend/src/components/CorrectionStatistics.vue b/frontend/src/components/CorrectionStatistics.vue index ecd499f2..59a31183 100644 --- a/frontend/src/components/CorrectionStatistics.vue +++ b/frontend/src/components/CorrectionStatistics.vue @@ -1,5 +1,5 @@ <template> - <v-card class="py-2"> + <v-card class="py-2" id="correction-statistics"> <v-card-title> <span class="title">Statistics</span> </v-card-title> diff --git a/functional_tests/test_front_pages.py b/functional_tests/test_front_pages.py new file mode 100644 index 00000000..cb8f987b --- /dev/null +++ b/functional_tests/test_front_pages.py @@ -0,0 +1,47 @@ +import os +import time + +from django.test import LiveServerTestCase +from selenium import webdriver +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.firefox.options import Options + +from core.models import UserAccount +from functional_tests.util import get_frontend_url, login, create_browser +from util.factories import make_test_data +from util import factory_boys as fact + +LiveServerTestCase.port = int(os.environ.get('LIVE_SERVER_PORT', 0)) + + +class FrontPageTestsTutorReviewer: + def _login(self): + login(self.browser, self.live_server_url, self.username, self.password) + + def test_statistics_are_shown(self): + self._login() + statistics = self.browser.find_element_by_id('correction-statistics') + + +class FrontPageTestsTutor(LiveServerTestCase, FrontPageTestsTutorReviewer): + def setUp(self): + self.live_server_url = get_frontend_url(self.live_server_url) + self.browser = create_browser() + self.username = 'tutor' + self.password = 'p' + fact.UserAccountFactory(username=self.username, password=self.password) + + def tearDown(self): + self.browser.quit() + + +class FrontPageTestsReviewer(LiveServerTestCase, FrontPageTestsTutorReviewer): + def setUp(self): + self.live_server_url = get_frontend_url(self.live_server_url) + self.browser = create_browser() + self.username = 'reviewer' + self.password = 'p' + fact.UserAccountFactory(username=self.username, password=self.password) + + def tearDown(self): + self.browser.quit() diff --git a/functional_tests/util.py b/functional_tests/util.py index 2e67d9f0..178ddd25 100644 --- a/functional_tests/util.py +++ b/functional_tests/util.py @@ -1,5 +1,28 @@ import os +import time + +from selenium import webdriver +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.firefox.options import Options def get_frontend_url(live_server_url): return os.environ.get('FRONTEND_URL', live_server_url) + + +def create_browser(): + options = Options() + options.headless = bool(os.environ.get('HEADLESS_TESTS', False)) + browser = webdriver.Firefox(options=options) + browser.implicitly_wait(5) + return browser + + +def login(browser, live_server_url, username, password='p'): + browser.get(live_server_url) + username_input = browser.find_element_by_xpath('//input[@aria-label="Username"]') + username_input.send_keys(username) + password_input = browser.find_element_by_xpath('//input[@aria-label="Password"]') + password_input.send_keys(password) + browser.find_element_by_xpath('//button[@type="submit"]').send_keys(Keys.ENTER) + time.sleep(1) diff --git a/requirements.dev.txt b/requirements.dev.txt index c4009fe1..27871cf0 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -3,3 +3,5 @@ pre-commit~=1.4.1 pytest-cov~=2.5.1 pytest-django~=3.1.2 selenium~=3.14.1 +factory-boy~=2.11.1 +Faker~=0.9.2 diff --git a/util/factory_boys.py b/util/factory_boys.py new file mode 100644 index 00000000..38d21ed3 --- /dev/null +++ b/util/factory_boys.py @@ -0,0 +1,99 @@ +import factory +from factory.django import DjangoModelFactory +from faker import Faker +from core import models + +fake = Faker() +fake.seed(42) + + +class ExamTypeFactory(DjangoModelFactory): + class Meta: + model = models.ExamType + module_reference = 'B.Inf.4242 Test Module' + total_score = 90 + pass_score = 45 + pass_only = False + + +class SubmissionTypeFactory(DjangoModelFactory): + class Meta: + model = models.SubmissionType + name = factory.Sequence(lambda n: f"[${n}] Example submission type ") + full_score = 15 + description = '<h1>This</h1> is a <b>description</b> containing html' + solution = 'This usually contains commented code' + programming_language = models.SubmissionType.C + + +class UserAccountFactory(DjangoModelFactory): + class Meta: + model = models.UserAccount + + role = models.UserAccount.REVIEWER + fullname = fake.name() + username = fake.user_name() + password = factory.PostGenerationMethodCall('set_password', 'p') + + +class StudentInfoFactory(DjangoModelFactory): + class Meta: + model = models.StudentInfo + + exam = factory.SubFactory(ExamTypeFactory) + user = factory.SubFactory(UserAccountFactory) + + +class TestFactory(DjangoModelFactory): + class Meta: + model = models.Test + + name = 'EmptyTest' + label = 'Epmty' + annotation = 'This is an annotation' + + +class SubmissionFactory(DjangoModelFactory): + class Meta: + model = models.Submission + + text = """#include<stdio.h> + +int main() { + printf("Hello World\n"); + return 0; +} +""" + type = factory.SubFactory(SubmissionTypeFactory) + student = factory.SubFactory(StudentInfoFactory) + + +class FeedbackFactory(DjangoModelFactory): + class Meta: + model = models.Feedback + + of_submission = factory.SubFactory(SubmissionTypeFactory) + + +class FeedbackCommentFactory(DjangoModelFactory): + class Meta: + model = models.FeedbackComment + + text = 'Well, this is bad...' + of_tutor = factory.SubFactory(UserAccountFactory) + of_feedback = factory.SubFactory(FeedbackFactory) + + +class SubmissionSubscriptionFactory(DjangoModelFactory): + class Meta: + model = models.SubmissionSubscription + + owner = factory.SubFactory(UserAccountFactory) + + +class TutorSubmissionAssignmentFactory(DjangoModelFactory): + class Meta: + model = models.TutorSubmissionAssignment + + submission = factory.SubFactory(SubmissionFactory) + subscription = factory.SubFactory(SubmissionSubscriptionFactory) -- GitLab