From 7aba26218fc93da1700208d8eda1994ca6b7e4bd Mon Sep 17 00:00:00 2001 From: FreneticScribbler Date: Wed, 12 Jan 2022 20:24:35 +0000 Subject: [PATCH] Add an interaction test Just one. Lol. --- training/decorators.py | 2 +- training/models.py | 6 ++-- training/tests/conftest.py | 17 +++++++++++ training/tests/pages.py | 27 ++++++++++++++++- training/tests/test_interaction.py | 47 ++++++++++++++++++++++++++++++ 5 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 training/tests/test_interaction.py diff --git a/training/decorators.py b/training/decorators.py index 070eb29c..d232f4da 100644 --- a/training/decorators.py +++ b/training/decorators.py @@ -2,4 +2,4 @@ from PyRIGS.decorators import user_passes_test_with_403 def has_perm_or_supervisor(perm, login_url=None, oembed_view=None): - return user_passes_test_with_403(lambda u: u.is_supervisor or u.has_perm(perm), login_url=login_url, oembed_view=oembed_view) + return user_passes_test_with_403(lambda u: (hasattr(u, 'is_supervisor') and u.is_supervisor) or u.has_perm(perm), login_url=login_url, oembed_view=oembed_view) diff --git a/training/models.py b/training/models.py index 558277fc..1733ed05 100644 --- a/training/models.py +++ b/training/models.py @@ -44,7 +44,7 @@ class TrainingCategory(models.Model): name = models.CharField(max_length=50) def __str__(self): - return "{}. {}".format(self.reference_number, self.name) + return f"{self.reference_number}. {self.name}" class Meta: verbose_name_plural = 'Training Categories' @@ -59,10 +59,10 @@ class TrainingItem(models.Model): @property def display_id(self): - return "{}.{}".format(self.category.reference_number, self.reference_number) + return f"{self.category.reference_number}.{self.reference_number}" def __str__(self): - name = "{} {}".format(self.display_id, self.name) + name = f"{self.display_id} {self.name}" if not self.active: name += " (inactive)" return name diff --git a/training/tests/conftest.py b/training/tests/conftest.py index fd13cfad..fde8e601 100644 --- a/training/tests/conftest.py +++ b/training/tests/conftest.py @@ -12,6 +12,23 @@ def trainee(db): trainee.delete() +@pytest.fixture +def supervisor(db): + supervisor = Profile.objects.create(username="supervisor", first_name="Super", last_name="Visor", + initials="SV", + email="supervisor@example.com", is_supervisor=True, is_active=True, is_approved=True) + yield supervisor + supervisor.delete() + + +@pytest.fixture +def training_item(db): + training_category = models.TrainingCategory.objects.create(reference_number=1, name="The Basics") + training_item = models.TrainingItem.objects.create(category=training_category, reference_number=1, name="How Not To Die") + yield training_item + training_category.delete() + training_item.delete() + @pytest.fixture def level(db): level = models.TrainingLevel.objects.create(description="There is no description.", level=models.TrainingLevel.TECHNICIAN) diff --git a/training/tests/pages.py b/training/tests/pages.py index bbae5f95..44e898d6 100644 --- a/training/tests/pages.py +++ b/training/tests/pages.py @@ -8,10 +8,35 @@ from PyRIGS.tests.pages import BasePage, FormPage class TraineeDetail(BasePage): - URL_TEMPLATE = 'trainee/{pk}' + URL_TEMPLATE = 'training/trainee/{pk}' _name_selector = (By.XPATH, '//h2') @property def page_name(self): return self.find_element(*self._name_selector).text + + +class AddQualification(FormPage): + URL_TEMPLATE = 'training/trainee/{pk}/add_qualification/' + + _item_selector = (By.XPATH, '//div[1]/form/div[1]/div') + _supervisor_selector = (By.XPATH, '//div[1]/form/div[3]/div') + + form_items = { + 'depth': (regions.SingleSelectPicker, (By.ID, 'id_depth')), + 'date': (regions.DatePicker, (By.ID, 'id_date')), + 'notes': (regions.TextBox, (By.ID, 'id_notes')), + } + + @property + def item_selector(self): + return regions.BootstrapSelectElement(self, self.find_element(*self._item_selector)) + + @property + def supervisor_selector(self): + return regions.BootstrapSelectElement(self, self.find_element(*self._supervisor_selector)) + + @property + def success(self): + return 'add' not in self.driver.current_url diff --git a/training/tests/test_interaction.py b/training/tests/test_interaction.py new file mode 100644 index 00000000..c734785d --- /dev/null +++ b/training/tests/test_interaction.py @@ -0,0 +1,47 @@ +import datetime +import time + +from django.utils import timezone +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as ec +from selenium.webdriver.support.ui import WebDriverWait + +from PyRIGS.tests.base import AutoLoginTest, screenshot_failure_cls, assert_times_almost_equal +from PyRIGS.tests.pages import animation_is_finished +from training import models +from training.tests import pages + + + +def test_add_qualification(logged_in_browser, live_server, trainee, supervisor, training_item): + page = pages.AddQualification(logged_in_browser.driver, live_server.url, pk=trainee.pk).open() + # assert page.name in str(trainee) + + page.depth = "Training Started" + page.date = date = datetime.date(1984, 1, 1) + page.notes = "A note" + + time.sleep(2) # Slow down for javascript + + page.item_selector.toggle() + assert page.item_selector.is_open + page.item_selector.search(training_item.name) + time.sleep(2) # Slow down for javascript + page.item_selector.set_option(training_item.name, True) + assert page.item_selector.options[0].selected + page.item_selector.toggle() + + page.supervisor_selector.toggle() + assert page.supervisor_selector.is_open + page.supervisor_selector.search(supervisor.name[:-6]) + time.sleep(2) # Slow down for javascript + assert page.supervisor_selector.options[0].selected + page.supervisor_selector.toggle() + + page.submit() + assert page.success + qualification = models.TrainingItemQualification.objects.get(trainee=trainee, item=training_item) + assert qualification.supervisor.pk == supervisor.pk + assert qualification.date == date + assert qualification.notes == "A note" + assert qualification.depth == models.TrainingItemQualification.STARTED