mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-16 21:12:13 +00:00
Create the training database (#463)
Co-authored-by: josephjboyden <josephjboyden@gmail.com>
This commit is contained in:
37
training/tests/conftest.py
Normal file
37
training/tests/conftest.py
Normal file
@@ -0,0 +1,37 @@
|
||||
import pytest
|
||||
from training import models
|
||||
from RIGS.models import Profile
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def trainee(db):
|
||||
trainee = Profile.objects.create(username="trainee", first_name="Train", last_name="EE",
|
||||
initials="TRN",
|
||||
email="trainee@example.com", is_active=True, is_approved=True)
|
||||
yield trainee
|
||||
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)
|
||||
yield level
|
||||
level.delete()
|
||||
42
training/tests/pages.py
Normal file
42
training/tests/pages.py
Normal file
@@ -0,0 +1,42 @@
|
||||
from django.urls import reverse
|
||||
from pypom import Region
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
|
||||
from PyRIGS.tests import regions
|
||||
from PyRIGS.tests.pages import BasePage, FormPage
|
||||
|
||||
|
||||
class TraineeDetail(BasePage):
|
||||
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
|
||||
46
training/tests/test_interaction.py
Normal file
46
training/tests/test_interaction.py
Normal file
@@ -0,0 +1,46 @@
|
||||
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
|
||||
38
training/tests/test_unit.py
Normal file
38
training/tests/test_unit.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import datetime
|
||||
import pytest
|
||||
|
||||
from django.utils import timezone
|
||||
from django.urls import reverse
|
||||
|
||||
from pytest_django.asserts import assertFormError, assertRedirects, assertContains, assertNotContains
|
||||
|
||||
from training import models
|
||||
|
||||
|
||||
def test_add_qualification(admin_client, trainee, admin_user):
|
||||
url = reverse('add_qualification', kwargs={'pk': trainee.pk})
|
||||
date = (timezone.now() + datetime.timedelta(days=3)).strftime("%Y-%m-%d")
|
||||
response = admin_client.post(url, {'date': date, 'trainee': trainee.pk, 'supervisor': trainee.pk})
|
||||
assertFormError(response, 'form', 'date', 'Qualification date may not be in the future')
|
||||
assertFormError(response, 'form', 'supervisor', 'One may not supervise oneself...')
|
||||
response = admin_client.post(url, {'date': date, 'trainee': trainee.pk, 'supervisor': admin_user.pk})
|
||||
assertFormError(response, 'form', 'supervisor', 'Selected supervisor must actually *be* a supervisor...')
|
||||
|
||||
|
||||
def test_add_requirement(admin_client, level):
|
||||
url = reverse('add_requirement', kwargs={'pk': level.pk})
|
||||
response = admin_client.post(url)
|
||||
assertContains(response, level.pk)
|
||||
|
||||
|
||||
def test_trainee_detail(admin_client, trainee, admin_user):
|
||||
url = reverse('trainee_detail', kwargs={'pk': admin_user.pk})
|
||||
response = admin_client.get(url)
|
||||
assertContains(response, "Your Training Record")
|
||||
assertContains(response, "No qualifications in any levels")
|
||||
|
||||
url = reverse('trainee_detail', kwargs={'pk': trainee.pk})
|
||||
response = admin_client.get(url)
|
||||
assertNotContains(response, "Your")
|
||||
name = trainee.first_name + " " + trainee.last_name
|
||||
assertContains(response, f"{name}'s Training Record")
|
||||
Reference in New Issue
Block a user