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