mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-23 08:22:15 +00:00
Add an interaction test
Just one. Lol.
This commit is contained in:
@@ -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):
|
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)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class TrainingCategory(models.Model):
|
|||||||
name = models.CharField(max_length=50)
|
name = models.CharField(max_length=50)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{}. {}".format(self.reference_number, self.name)
|
return f"{self.reference_number}. {self.name}"
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name_plural = 'Training Categories'
|
verbose_name_plural = 'Training Categories'
|
||||||
@@ -59,10 +59,10 @@ class TrainingItem(models.Model):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def display_id(self):
|
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):
|
def __str__(self):
|
||||||
name = "{} {}".format(self.display_id, self.name)
|
name = f"{self.display_id} {self.name}"
|
||||||
if not self.active:
|
if not self.active:
|
||||||
name += " (inactive)"
|
name += " (inactive)"
|
||||||
return name
|
return name
|
||||||
|
|||||||
@@ -12,6 +12,23 @@ def trainee(db):
|
|||||||
trainee.delete()
|
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
|
@pytest.fixture
|
||||||
def level(db):
|
def level(db):
|
||||||
level = models.TrainingLevel.objects.create(description="There is no description.", level=models.TrainingLevel.TECHNICIAN)
|
level = models.TrainingLevel.objects.create(description="There is no description.", level=models.TrainingLevel.TECHNICIAN)
|
||||||
|
|||||||
@@ -8,10 +8,35 @@ from PyRIGS.tests.pages import BasePage, FormPage
|
|||||||
|
|
||||||
|
|
||||||
class TraineeDetail(BasePage):
|
class TraineeDetail(BasePage):
|
||||||
URL_TEMPLATE = 'trainee/{pk}'
|
URL_TEMPLATE = 'training/trainee/{pk}'
|
||||||
|
|
||||||
_name_selector = (By.XPATH, '//h2')
|
_name_selector = (By.XPATH, '//h2')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def page_name(self):
|
def page_name(self):
|
||||||
return self.find_element(*self._name_selector).text
|
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
|
||||||
|
|||||||
47
training/tests/test_interaction.py
Normal file
47
training/tests/test_interaction.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user