Port a few more tests to pytest proper

Having two distinct test flavours is giving me a headache
This commit is contained in:
2025-10-05 22:38:41 +01:00
parent 7d9185e155
commit b9f37555c2
4 changed files with 55 additions and 72 deletions

View File

@@ -52,3 +52,10 @@ def test_asset_2(db, category, test_status_2):
asset, created = models.Asset.objects.get_or_create(asset_id="10", description="Working Mic", status=test_status_2, category=category, date_acquired=datetime.date(2001, 10, 20), replacement_cost=1000) asset, created = models.Asset.objects.get_or_create(asset_id="10", description="Working Mic", status=test_status_2, category=category, date_acquired=datetime.date(2001, 10, 20), replacement_cost=1000)
yield asset yield asset
asset.delete() asset.delete()
@pytest.fixture
def test_supplier(db):
supplier, created = models.Supplier.objects.get_or_create(name="Fullmetal Heavy Industry")
yield supplier
supplier.delete()

View File

@@ -7,13 +7,12 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from PyRIGS.tests.base import AutoLoginTest, screenshot_failure_cls, assert_times_almost_equal from PyRIGS.tests.base import AutoLoginTest, assert_times_almost_equal
from PyRIGS.tests.pages import animation_is_finished from PyRIGS.tests.pages import animation_is_finished
from assets import models from assets import models
from . import pages from . import pages
@screenshot_failure_cls
class TestAssetList(AutoLoginTest): class TestAssetList(AutoLoginTest):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -144,7 +143,6 @@ def test_asset_duplicate(logged_in_browser, admin_user, live_server, test_asset)
assert models.Asset.objects.last().description == test_asset.description assert models.Asset.objects.last().description == test_asset.description
@screenshot_failure_cls
class TestAssetForm(AutoLoginTest): class TestAssetForm(AutoLoginTest):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -211,7 +209,6 @@ class TestAssetForm(AutoLoginTest):
self.assertEqual(asset.date_acquired, acquired) self.assertEqual(asset.date_acquired, acquired)
@screenshot_failure_cls
class TestSupplierList(AutoLoginTest): class TestSupplierList(AutoLoginTest):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -247,37 +244,32 @@ class TestSupplierList(AutoLoginTest):
time.sleep(1) time.sleep(1)
self.assertTrue(len(self.page.suppliers) == 7) self.assertTrue(len(self.page.suppliers) == 7)
self.page.set_query("This is not a supplier") self.page.set_query("NOTFOUND")
self.page.search() self.page.search()
self.assertTrue(len(self.page.suppliers) == 0) self.assertTrue(len(self.page.suppliers) == 0)
@screenshot_failure_cls def test_supplier_create(logged_in_browser, live_server):
class TestSupplierCreateAndEdit(AutoLoginTest): page = pages.SupplierCreate(logged_in_browser.driver, live_server.url).open()
def setUp(self):
super().setUp()
self.supplier = models.Supplier.objects.create(name="Fullmetal Heavy Industry")
def test_supplier_create(self): page.remove_all_required()
self.page = pages.SupplierCreate(self.driver, self.live_server_url).open() page.submit()
assert !self.page.success
assert "This field is required." in self.page.errors["Name"]
self.page.remove_all_required() page.name = "Optican Health Supplies"
self.page.submit() page.submit()
self.assertFalse(self.page.success) assert page.success
self.assertIn("This field is required.", self.page.errors["Name"])
self.page.name = "Optican Health Supplies"
self.page.submit()
self.assertTrue(self.page.success)
def test_supplier_edit(self): def test_supplier_edit(logged_in_browser, live_server, test_supplier):
self.page = pages.SupplierEdit(self.driver, self.live_server_url, supplier_id=self.supplier.pk).open() page = pages.SupplierEdit(logged_in_browser.driver, live_server.url, supplier_id=test_supplier.pk).open()
self.assertEqual("Fullmetal Heavy Industry", self.page.name) assert test_supplier.name == page.name
new_name = "Cyberdyne Systems" new_name = "Cyberdyne Systems"
self.page.name = new_name page.name = new_name
self.page.submit() page.submit()
self.assertTrue(self.page.success) assert page.success
def test_audit_search(logged_in_browser, live_server, test_asset): def test_audit_search(logged_in_browser, live_server, test_asset):
@@ -312,47 +304,30 @@ def test_audit_success(logged_in_browser, admin_user, live_server, test_asset):
assert test_asset.asset_id not in page.assets assert test_asset.asset_id not in page.assets
@screenshot_failure_cls def test_audit_fail(logged_in_browser, admin_user, live_server, test_asset):
class TestAssetAudit(AutoLoginTest): page = pages.AssetAuditList(logged_in_browser.driver, live_server.url).open()
def setUp(self): wait = WebDriverWait(logged_in_browser.driver, 20)
super().setUp() page.set_query(test_asset.asset_id)
self.category = models.AssetCategory.objects.create(name="Haulage") page.search()
self.status = models.AssetStatus.objects.create(name="Probably Fine", should_show=True) wait.until(ec.visibility_of_element_located((By.ID, 'modal')))
self.supplier = models.Supplier.objects.create(name="The Bazaar") # Do it wrong on purpose to check error display
self.connector = models.Connector.objects.create(description="Trailer Socket", current_rating=1, page.modal.remove_all_required()
voltage_rating=40, num_pins=13) page.modal.description = ""
models.Asset.objects.create(asset_id="1", description="Trailer Cable", status=self.status, page.modal.submit()
category=self.category, date_acquired=datetime.date(2020, 2, 1), replacement_cost=10) wait.until(animation_is_finished())
models.Asset.objects.create(asset_id="11", description="Trailerboard", status=self.status, assert "This field is required." in self.page.modal.errors["Description"]
category=self.category, date_acquired=datetime.date(2020, 2, 1), replacement_cost=10)
models.Asset.objects.create(asset_id="111", description="Erms", status=self.status, category=self.category,
date_acquired=datetime.date(2020, 2, 1), replacement_cost=10)
self.asset = models.Asset.objects.create(asset_id="1111", description="A hammer", status=self.status,
category=self.category,
date_acquired=datetime.date(2020, 2, 1), replacement_cost=10)
self.page = pages.AssetAuditList(self.driver, self.live_server_url).open()
self.wait = WebDriverWait(self.driver, 20)
def test_audit_fail(self):
self.page.set_query(self.asset.asset_id)
self.page.search()
self.wait.until(ec.visibility_of_element_located((By.ID, 'modal')))
# Do it wrong on purpose to check error display
self.page.modal.remove_all_required()
self.page.modal.description = ""
self.page.modal.submit()
self.wait.until(animation_is_finished())
self.driver.implicitly_wait(4)
self.assertIn("This field is required.", self.page.modal.errors["Description"])
def test_audit_list(self): def test_audit_list(logged_in_browser, admin_user, live_server, test_asset):
self.assertEqual(models.Asset.objects.filter(last_audited_at=None).count(), len(self.page.assets)) page = pages.AssetAuditList(logged_in_browser.driver, live_server.url).open()
asset_row = self.page.assets[0] wait = WebDriverWait(logged_in_browser.driver, 20)
self.driver.find_element(By.XPATH, "//a[contains(@class,'btn') and contains(., 'Audit')]").click() assert models.Asset.objects.filter(last_audited_at=None).count() == len(self.page.assets)
self.wait.until(ec.visibility_of_element_located((By.ID, 'modal'))) asset_row = page.assets[0]
self.assertEqual(self.page.modal.asset_id, asset_row.id) logged_in_browser.driver.find_element(By.XPATH, "//a[contains(@class,'btn') and contains(., 'Audit')]").click()
self.page.modal.close() wait.until(ec.visibility_of_element_located((By.ID, 'modal')))
self.assertFalse(self.driver.find_element(By.ID, 'modal').is_displayed()) assert self.page.modal.asset_id == asset_row.id
# Make sure audit log was NOT filled out page.modal.close()
audited = models.Asset.objects.get(asset_id=asset_row.id) assert !logged_in_browser.driver.find_element(By.ID, 'modal').is_displayed()
assert audited.last_audited_by is None # Make sure audit log was NOT filled out
audited = models.Asset.objects.get(asset_id=asset_row.id)
assert audited.last_audited_by is None

View File

@@ -1,5 +1,6 @@
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.views import LoginView from django.contrib.auth.views import LoginView
from django.contrib.auth import get_user_model
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views import generic from django.views import generic
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
@@ -27,7 +28,7 @@ class LoginEmbed(LoginView):
class ProfileDetail(generic.DetailView): class ProfileDetail(generic.DetailView):
template_name = "profile_detail.html" template_name = "profile_detail.html"
model = settings.AUTH_USER_MODEL model = get_user_model()
def get_queryset(self): def get_queryset(self):
try: try:
@@ -47,7 +48,7 @@ class ProfileDetail(generic.DetailView):
class ProfileUpdateSelf(generic.UpdateView): class ProfileUpdateSelf(generic.UpdateView):
template_name = "profile_form.html" template_name = "profile_form.html"
model = settings.AUTH_USER_MODEL model = get_user_model()
fields = ['first_name', 'last_name', 'email', 'initials', 'phone', 'dark_theme'] fields = ['first_name', 'last_name', 'email', 'initials', 'phone', 'dark_theme']
def get_queryset(self): def get_queryset(self):

4
uv.lock generated
View File

@@ -856,7 +856,6 @@ source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "ansicolors" }, { name = "ansicolors" },
{ name = "asgiref" }, { name = "asgiref" },
{ name = "autopep8" },
{ name = "beautifulsoup4" }, { name = "beautifulsoup4" },
{ name = "brotli" }, { name = "brotli" },
{ name = "cachetools" }, { name = "cachetools" },
@@ -925,6 +924,7 @@ dependencies = [
[package.dev-dependencies] [package.dev-dependencies]
dev = [ dev = [
{ name = "autopep8" },
{ name = "coveralls" }, { name = "coveralls" },
{ name = "django-coverage-plugin" }, { name = "django-coverage-plugin" },
{ name = "pluggy" }, { name = "pluggy" },
@@ -942,7 +942,6 @@ dev = [
requires-dist = [ requires-dist = [
{ name = "ansicolors" }, { name = "ansicolors" },
{ name = "asgiref" }, { name = "asgiref" },
{ name = "autopep8", specifier = ">=2.3.2" },
{ name = "beautifulsoup4" }, { name = "beautifulsoup4" },
{ name = "brotli" }, { name = "brotli" },
{ name = "cachetools" }, { name = "cachetools" },
@@ -1011,6 +1010,7 @@ requires-dist = [
[package.metadata.requires-dev] [package.metadata.requires-dev]
dev = [ dev = [
{ name = "autopep8", specifier = ">=2.3.2" },
{ name = "coveralls" }, { name = "coveralls" },
{ name = "django-coverage-plugin" }, { name = "django-coverage-plugin" },
{ name = "pluggy", specifier = "~=1.2.0" }, { name = "pluggy", specifier = "~=1.2.0" },