mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-03-11 14:38:24 +00:00
Further template refactoring
This commit is contained in:
@@ -32,7 +32,7 @@ class BaseTest(LiveServerTestCase):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUpClass()
|
super().setUpClass()
|
||||||
self.driver = create_browser()
|
self.driver = create_browser()
|
||||||
self.wait = WebDriverWait(self.driver, 5)
|
self.wait = WebDriverWait(self.driver, 15)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super().tearDown()
|
super().tearDown()
|
||||||
@@ -76,6 +76,3 @@ def screenshot_failure_cls(cls):
|
|||||||
def assert_times_equal(first_time, second_time):
|
def assert_times_equal(first_time, second_time):
|
||||||
assert first_time.replace(microsecond=0) == second_time.replace(microsecond=0)
|
assert first_time.replace(microsecond=0) == second_time.replace(microsecond=0)
|
||||||
|
|
||||||
|
|
||||||
def response_contains(response, needle):
|
|
||||||
return str(needle) in str(response.content)
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ from selenium.webdriver.common.keys import Keys
|
|||||||
from selenium.webdriver.support import expected_conditions
|
from selenium.webdriver.support import expected_conditions
|
||||||
from selenium.webdriver.support.select import Select
|
from selenium.webdriver.support.select import Select
|
||||||
|
|
||||||
|
|
||||||
def parse_bool_from_string(string):
|
def parse_bool_from_string(string):
|
||||||
# Used to convert from attribute strings to boolean values, written after I found this:
|
# Used to convert from attribute strings to boolean values, written after I found this:
|
||||||
# >>> bool("false")
|
# >>> bool("false")
|
||||||
@@ -75,8 +74,7 @@ class BootstrapSelectElement(Region):
|
|||||||
self.open()
|
self.open()
|
||||||
search_box.clear()
|
search_box.clear()
|
||||||
search_box.send_keys(query)
|
search_box.send_keys(query)
|
||||||
status_text = self.find_element(*self._status_locator)
|
self.wait.until(expected_conditions.invisibility_of_element_located(*self._status_locator))
|
||||||
self.wait.until(expected_conditions.invisibility_of_element_located(self._status_locator))
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def options(self):
|
def options(self):
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ class EventAuthorise(generic.UpdateView):
|
|||||||
self.template_name = self.success_template
|
self.template_name = self.success_template
|
||||||
messages.add_message(self.request, messages.SUCCESS,
|
messages.add_message(self.request, messages.SUCCESS,
|
||||||
'Success! Your event has been authorised. ' +
|
'Success! Your event has been authorised. ' +
|
||||||
'You will also receive email confirmation to %s.' % (self.object.email))
|
'You will also receive email confirmation to %s.' % self.object.email)
|
||||||
return self.render_to_response(self.get_context_data())
|
return self.render_to_response(self.get_context_data())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
from datetime import date
|
from datetime import date
|
||||||
|
|
||||||
|
import pytest
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core import mail, signing
|
from django.core import mail, signing
|
||||||
from django.http import HttpResponseBadRequest
|
from django.http import HttpResponseBadRequest
|
||||||
@@ -8,6 +9,7 @@ from django.test import TestCase
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from RIGS import models
|
from RIGS import models
|
||||||
|
from pytest_django.asserts import assertContains, assertNotContains
|
||||||
|
|
||||||
|
|
||||||
class BaseCase(TestCase):
|
class BaseCase(TestCase):
|
||||||
@@ -43,12 +45,32 @@ class TestEventValidation(BaseCase):
|
|||||||
def test_create(self):
|
def test_create(self):
|
||||||
url = reverse('event_create')
|
url = reverse('event_create')
|
||||||
# end time before start access after start
|
# end time before start access after start
|
||||||
response = self.client.post(url, {'start_date': datetime.date(2020, 1, 1), 'start_time': datetime.time(10, 00), 'end_time': datetime.time(9, 00), 'access_at': datetime.datetime(2020, 1, 5, 10)})
|
response = self.client.post(url, {'start_date': datetime.date(2020, 1, 1), 'start_time': datetime.time(10, 00),
|
||||||
self.assertFormError(response, 'form', 'end_time', "Unless you've invented time travel, the event can't finish before it has started.")
|
'end_time': datetime.time(9, 00),
|
||||||
self.assertFormError(response, 'form', 'access_at', "Regardless of what some clients might think, access time cannot be after the event has started.")
|
'access_at': datetime.datetime(2020, 1, 5, 10)})
|
||||||
|
self.assertFormError(response, 'form', 'end_time',
|
||||||
|
"Unless you've invented time travel, the event can't finish before it has started.")
|
||||||
|
self.assertFormError(response, 'form', 'access_at',
|
||||||
|
"Regardless of what some clients might think, access time cannot be after the event has started.")
|
||||||
|
|
||||||
|
|
||||||
class ClientEventAuthorisationTest(BaseCase):
|
def setup_event():
|
||||||
|
models.VatRate.objects.create(start_at='2014-03-05', rate=0.20, comment='test1')
|
||||||
|
venue = models.Venue.objects.create(name='Authorisation Test Venue')
|
||||||
|
client = models.Person.objects.create(name='Authorisation Test Person', email='authorisation@functional.test')
|
||||||
|
organisation = models.Organisation.objects.create(name='Authorisation Test Organisation', union_account=True)
|
||||||
|
return models.Event.objects.create(
|
||||||
|
name='Authorisation Test',
|
||||||
|
start_date=date.today(),
|
||||||
|
venue=venue,
|
||||||
|
person=client,
|
||||||
|
organisation=organisation,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def setup_mail(event, profile):
|
||||||
|
profile.email = "teccie@nottinghamtec.co.uk"
|
||||||
|
profile.save()
|
||||||
auth_data = {
|
auth_data = {
|
||||||
'name': 'Test ABC',
|
'name': 'Test ABC',
|
||||||
'po': '1234ABCZXY',
|
'po': '1234ABCZXY',
|
||||||
@@ -56,72 +78,78 @@ class ClientEventAuthorisationTest(BaseCase):
|
|||||||
'uni_id': 1234567890,
|
'uni_id': 1234567890,
|
||||||
'tos': True
|
'tos': True
|
||||||
}
|
}
|
||||||
|
hmac = signing.dumps({'pk': event.pk, 'email': 'authemail@function.test',
|
||||||
|
'sent_by': profile.pk})
|
||||||
|
url = reverse('event_authorise', kwargs={'pk': event.pk, 'hmac': hmac})
|
||||||
|
return auth_data, hmac, url
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super().setUp()
|
|
||||||
self.hmac = signing.dumps({'pk': self.event.pk, 'email': 'authemail@function.test',
|
|
||||||
'sent_by': self.profile.pk})
|
|
||||||
self.url = reverse('event_authorise', kwargs={'pk': self.event.pk, 'hmac': self.hmac})
|
|
||||||
|
|
||||||
def test_requires_valid_hmac(self):
|
def test_requires_valid_hmac(client, admin_user):
|
||||||
bad_hmac = self.hmac[:-1]
|
event = setup_event()
|
||||||
url = reverse('event_authorise', kwargs={'pk': self.event.pk, 'hmac': bad_hmac})
|
auth_data, hmac, url = setup_mail(event, admin_user)
|
||||||
response = self.client.get(url)
|
bad_hmac = hmac[:-1]
|
||||||
self.assertIsInstance(response, HttpResponseBadRequest)
|
url = reverse('event_authorise', kwargs={'pk': event.pk, 'hmac': bad_hmac})
|
||||||
# TODO: Add some form of sensbile user facing error
|
response = client.get(url)
|
||||||
|
assert isinstance(response, HttpResponseBadRequest)
|
||||||
|
# TODO: Add some form of sensible user facing error
|
||||||
# self.assertIn(response.content, "new URL") # check there is some level of sane instruction
|
# self.assertIn(response.content, "new URL") # check there is some level of sane instruction
|
||||||
|
# response = client.get(url)
|
||||||
|
# assertContains(response, event.organisation.name)
|
||||||
|
|
||||||
response = self.client.get(self.url)
|
|
||||||
self.assertContains(response, self.event.organisation.name)
|
|
||||||
|
|
||||||
def test_validation(self):
|
def test_validation(client, admin_user):
|
||||||
response = self.client.get(self.url)
|
event = setup_event()
|
||||||
self.assertContains(response, "Terms of Hire")
|
auth_data, hmac, url = setup_mail(event, admin_user)
|
||||||
self.assertContains(response, "Account code")
|
response = client.get(url)
|
||||||
self.assertContains(response, "University ID")
|
assertContains(response, "Terms of Hire")
|
||||||
|
assertContains(response, "Account code")
|
||||||
|
assertContains(response, "University ID")
|
||||||
|
|
||||||
response = self.client.post(self.url)
|
response = client.post(url)
|
||||||
self.assertContains(response, "This field is required.", 5)
|
assertContains(response, "This field is required.", 5)
|
||||||
|
|
||||||
data = self.auth_data
|
auth_data['amount'] = event.total + 1
|
||||||
data['amount'] = self.event.total + 1
|
|
||||||
|
|
||||||
response = self.client.post(self.url, data)
|
response = client.post(url, auth_data)
|
||||||
self.assertContains(response, "The amount authorised must equal the total for the event")
|
assertContains(response, "The amount authorised must equal the total for the event")
|
||||||
self.assertNotContains(response, "This field is required.")
|
assertNotContains(response, "This field is required.")
|
||||||
|
|
||||||
data['amount'] = self.event.total
|
auth_data['amount'] = event.total
|
||||||
response = self.client.post(self.url, data)
|
response = client.post(url, auth_data)
|
||||||
self.assertContains(response, "Your event has been authorised")
|
assertContains(response, "Your event has been authorised")
|
||||||
|
|
||||||
self.event.refresh_from_db()
|
event.refresh_from_db()
|
||||||
self.assertTrue(self.event.authorised)
|
assert event.authorised
|
||||||
self.assertEqual(self.event.authorisation.email, "authemail@function.test")
|
assert str(event.authorisation.email) == "authemail@function.test"
|
||||||
|
|
||||||
def test_duplicate_warning(self):
|
|
||||||
auth = models.EventAuthorisation.objects.create(event=self.event, name='Test ABC', email='dupe@functional.test',
|
def test_duplicate_warning(client, admin_user):
|
||||||
amount=self.event.total, sent_by=self.profile)
|
event = setup_event()
|
||||||
response = self.client.get(self.url)
|
auth_data, hmac, url = setup_mail(event, admin_user)
|
||||||
self.assertContains(response, 'This event has already been authorised.')
|
auth = models.EventAuthorisation.objects.create(event=event, name='Test ABC', email='dupe@functional.test',
|
||||||
|
amount=event.total, sent_by=admin_user)
|
||||||
|
response = client.get(url)
|
||||||
|
assertContains(response, 'This event has already been authorised.')
|
||||||
|
|
||||||
auth.amount += 1
|
auth.amount += 1
|
||||||
auth.save()
|
auth.save()
|
||||||
|
|
||||||
response = self.client.get(self.url)
|
response = client.get(url)
|
||||||
self.assertContains(response, 'amount has changed')
|
assertContains(response, 'amount has changed')
|
||||||
|
|
||||||
def test_email_sent(self):
|
|
||||||
mail.outbox = []
|
|
||||||
|
|
||||||
data = self.auth_data
|
@pytest.mark.django_db(transaction=True)
|
||||||
data['amount'] = self.event.total
|
def test_email_sent(admin_client, admin_user, mailoutbox):
|
||||||
|
event = setup_event()
|
||||||
|
auth_data, hmac, url = setup_mail(event, admin_user)
|
||||||
|
|
||||||
response = self.client.post(self.url, data)
|
data = auth_data
|
||||||
self.assertContains(response, "Your event has been authorised.")
|
data['amount'] = event.total
|
||||||
self.assertEqual(len(mail.outbox), 2)
|
response = admin_client.post(url, data)
|
||||||
|
assertContains(response, "Your event has been authorised.")
|
||||||
self.assertEqual(mail.outbox[0].to, ['authemail@function.test'])
|
assert len(mailoutbox) == 2
|
||||||
self.assertEqual(mail.outbox[1].to, [settings.AUTHORISATION_NOTIFICATION_ADDRESS])
|
assert mailoutbox[0].to == ['authemail@function.test']
|
||||||
|
assert mailoutbox[1].to == [settings.AUTHORISATION_NOTIFICATION_ADDRESS]
|
||||||
|
|
||||||
|
|
||||||
class TECEventAuthorisationTest(BaseCase):
|
class TECEventAuthorisationTest(BaseCase):
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ class TestEventCreate(BaseRigboardTest):
|
|||||||
# Double-check we don't lose data when swapping
|
# Double-check we don't lose data when swapping
|
||||||
self.page.select_event_type("Rig")
|
self.page.select_event_type("Rig")
|
||||||
self.wait.until(animation_is_finished())
|
self.wait.until(animation_is_finished())
|
||||||
self.assertEquals(self.page.name, rig_name)
|
self.assertEqual(self.page.name, rig_name)
|
||||||
self.wait.until(animation_is_finished())
|
self.wait.until(animation_is_finished())
|
||||||
self.page.select_event_type("Non-Rig")
|
self.page.select_event_type("Non-Rig")
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ from django.test import TestCase
|
|||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
from django.urls import reverse, reverse_lazy
|
from django.urls import reverse, reverse_lazy
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from pytest_django.asserts import assertRedirects
|
from pytest_django.asserts import assertRedirects, assertNotContains, assertContains
|
||||||
|
|
||||||
from PyRIGS.tests.base import assert_times_equal, response_contains
|
from PyRIGS.tests.base import assert_times_equal
|
||||||
from RIGS import models
|
from RIGS import models
|
||||||
|
|
||||||
|
|
||||||
@@ -360,8 +360,8 @@ def search(client, url, found, notfound, arguments):
|
|||||||
query = getattr(found, argument)
|
query = getattr(found, argument)
|
||||||
request_url = "%s?q=%s" % (reverse_lazy(url), query)
|
request_url = "%s?q=%s" % (reverse_lazy(url), query)
|
||||||
response = client.get(request_url, follow=True)
|
response = client.get(request_url, follow=True)
|
||||||
assert response_contains(response, getattr(found, 'name'))
|
assertContains(response, getattr(found, 'name'))
|
||||||
assert not response_contains(response, getattr(notfound, 'name'))
|
assertNotContains(response, getattr(notfound, 'name'))
|
||||||
|
|
||||||
|
|
||||||
def test_search(admin_client):
|
def test_search(admin_client):
|
||||||
@@ -428,17 +428,17 @@ def test_list(admin_client):
|
|||||||
venue, events = setup_for_hs()
|
venue, events = setup_for_hs()
|
||||||
request_url = reverse('hs_list')
|
request_url = reverse('hs_list')
|
||||||
response = admin_client.get(request_url, follow=True)
|
response = admin_client.get(request_url, follow=True)
|
||||||
assert response_contains(response, events[1].name)
|
assertContains(response, events[1].name)
|
||||||
assert response_contains(response, events[2].name)
|
assertContains(response, events[2].name)
|
||||||
assert response_contains(response, 'Create')
|
assertContains(response, 'Create')
|
||||||
|
|
||||||
|
|
||||||
def review(client, profile, obj, request_url):
|
def review(client, profile, obj, request_url):
|
||||||
time = timezone.now()
|
time = timezone.now()
|
||||||
response = client.get(reverse(request_url, kwargs={'pk': obj.pk}), follow=True)
|
response = client.get(reverse(request_url, kwargs={'pk': obj.pk}), follow=True)
|
||||||
obj.refresh_from_db()
|
obj.refresh_from_db()
|
||||||
assert response_contains(response, 'Reviewed by')
|
assertContains(response, 'Reviewed by')
|
||||||
assert response_contains(response, profile.name)
|
assertContains(response, profile.name)
|
||||||
assert_times_equal(time, obj.reviewed_at)
|
assert_times_equal(time, obj.reviewed_at)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -190,10 +190,10 @@ class AssetAuditList(AssetList):
|
|||||||
def query(self):
|
def query(self):
|
||||||
return self.find_element(*self._search_text_locator).text
|
return self.find_element(*self._search_text_locator).text
|
||||||
|
|
||||||
def set_query(self, queryString):
|
def set_query(self, query):
|
||||||
element = self.find_element(*self._search_text_locator)
|
element = self.find_element(*self._search_text_locator)
|
||||||
element.clear()
|
element.clear()
|
||||||
element.send_keys(queryString)
|
element.send_keys(query)
|
||||||
|
|
||||||
def search(self):
|
def search(self):
|
||||||
self.find_element(*self._go_button_locator).click()
|
self.find_element(*self._go_button_locator).click()
|
||||||
@@ -206,7 +206,7 @@ class AssetAuditList(AssetList):
|
|||||||
except NoSuchElementException:
|
except NoSuchElementException:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
class AssetAuditModal(Region):
|
class AssetAuditModal(regions.Modal):
|
||||||
_errors_selector = (By.CLASS_NAME, "alert-danger")
|
_errors_selector = (By.CLASS_NAME, "alert-danger")
|
||||||
# Don't use the usual success selector - that tries and fails to hit the '10m long cable' helper button...
|
# Don't use the usual success selector - that tries and fails to hit the '10m long cable' helper button...
|
||||||
_submit_locator = (By.ID, "id_mark_audited")
|
_submit_locator = (By.ID, "id_mark_audited")
|
||||||
@@ -238,11 +238,6 @@ class AssetAuditList(AssetList):
|
|||||||
except NoSuchElementException:
|
except NoSuchElementException:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def submit(self):
|
|
||||||
self.root.find_element(*self._submit_locator).click()
|
|
||||||
# self.wait.until(lambda x: not self.is_displayed) TODO
|
|
||||||
self.wait.until(expected_conditions.invisibility_of_element_located((By.ID, 'modal')))
|
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.page.find_element(*self._close_selector).click()
|
self.page.find_element(*self._close_selector).click()
|
||||||
self.wait.until(expected_conditions.invisibility_of_element_located((By.ID, 'modal')))
|
self.wait.until(expected_conditions.invisibility_of_element_located((By.ID, 'modal')))
|
||||||
@@ -250,19 +245,3 @@ class AssetAuditList(AssetList):
|
|||||||
def remove_all_required(self):
|
def remove_all_required(self):
|
||||||
self.driver.execute_script("Array.from(document.getElementsByTagName(\"input\")).forEach(function (el, ind, arr) { el.removeAttribute(\"required\")});")
|
self.driver.execute_script("Array.from(document.getElementsByTagName(\"input\")).forEach(function (el, ind, arr) { el.removeAttribute(\"required\")});")
|
||||||
self.driver.execute_script("Array.from(document.getElementsByTagName(\"select\")).forEach(function (el, ind, arr) { el.removeAttribute(\"required\")});")
|
self.driver.execute_script("Array.from(document.getElementsByTagName(\"select\")).forEach(function (el, ind, arr) { el.removeAttribute(\"required\")});")
|
||||||
|
|
||||||
def __getattr__(self, name):
|
|
||||||
if name in self.form_items:
|
|
||||||
element = self.form_items[name]
|
|
||||||
form_element = element[0](self, self.find_element(*element[1]))
|
|
||||||
return form_element.value
|
|
||||||
else:
|
|
||||||
return super().__getattribute__(name)
|
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
|
||||||
if name in self.form_items:
|
|
||||||
element = self.form_items[name]
|
|
||||||
form_element = element[0](self, self.find_element(*element[1]))
|
|
||||||
form_element.set_value(value)
|
|
||||||
else:
|
|
||||||
self.__dict__[name] = value
|
|
||||||
|
|||||||
@@ -21,10 +21,14 @@ class TestAssetList(AutoLoginTest):
|
|||||||
working = models.AssetStatus.objects.create(name="Working", should_show=True)
|
working = models.AssetStatus.objects.create(name="Working", should_show=True)
|
||||||
broken = models.AssetStatus.objects.create(name="Broken", should_show=False)
|
broken = models.AssetStatus.objects.create(name="Broken", should_show=False)
|
||||||
|
|
||||||
models.Asset.objects.create(asset_id="1", description="Broken XLR", status=broken, category=sound, date_acquired=datetime.date(2020, 2, 1))
|
models.Asset.objects.create(asset_id="1", description="Broken XLR", status=broken, category=sound,
|
||||||
models.Asset.objects.create(asset_id="10", description="Working Mic", status=working, category=sound, date_acquired=datetime.date(2020, 2, 1))
|
date_acquired=datetime.date(2020, 2, 1))
|
||||||
models.Asset.objects.create(asset_id="2", description="A light", status=working, category=lighting, date_acquired=datetime.date(2020, 2, 1))
|
models.Asset.objects.create(asset_id="10", description="Working Mic", status=working, category=sound,
|
||||||
models.Asset.objects.create(asset_id="C1", description="The pearl", status=broken, category=lighting, date_acquired=datetime.date(2020, 2, 1))
|
date_acquired=datetime.date(2020, 2, 1))
|
||||||
|
models.Asset.objects.create(asset_id="2", description="A light", status=working, category=lighting,
|
||||||
|
date_acquired=datetime.date(2020, 2, 1))
|
||||||
|
models.Asset.objects.create(asset_id="C1", description="The pearl", status=broken, category=lighting,
|
||||||
|
date_acquired=datetime.date(2020, 2, 1))
|
||||||
self.page = pages.AssetList(self.driver, self.live_server_url).open()
|
self.page = pages.AssetList(self.driver, self.live_server_url).open()
|
||||||
|
|
||||||
def test_default_statuses_applied(self):
|
def test_default_statuses_applied(self):
|
||||||
@@ -96,9 +100,12 @@ class TestAssetForm(AutoLoginTest):
|
|||||||
self.category = models.AssetCategory.objects.create(name="Health & Safety")
|
self.category = models.AssetCategory.objects.create(name="Health & Safety")
|
||||||
self.status = models.AssetStatus.objects.create(name="O.K.", should_show=True)
|
self.status = models.AssetStatus.objects.create(name="O.K.", should_show=True)
|
||||||
self.supplier = models.Supplier.objects.create(name="Fullmetal Heavy Industry")
|
self.supplier = models.Supplier.objects.create(name="Fullmetal Heavy Industry")
|
||||||
self.parent = models.Asset.objects.create(asset_id="9000", description="Shelf", status=self.status, category=self.category, date_acquired=datetime.date(2000, 1, 1))
|
self.parent = models.Asset.objects.create(asset_id="9000", description="Shelf", status=self.status,
|
||||||
self.connector = models.Connector.objects.create(description="IEC", current_rating=10, voltage_rating=240, num_pins=3)
|
category=self.category, date_acquired=datetime.date(2000, 1, 1))
|
||||||
self.cable_type = models.CableType.objects.create(plug=self.connector, socket=self.connector, circuits=1, cores=3)
|
self.connector = models.Connector.objects.create(description="IEC", current_rating=10, voltage_rating=240,
|
||||||
|
num_pins=3)
|
||||||
|
self.cable_type = models.CableType.objects.create(plug=self.connector, socket=self.connector, circuits=1,
|
||||||
|
cores=3)
|
||||||
self.page = pages.AssetCreate(self.driver, self.live_server_url).open()
|
self.page = pages.AssetCreate(self.driver, self.live_server_url).open()
|
||||||
|
|
||||||
def test_asset_create(self):
|
def test_asset_create(self):
|
||||||
@@ -109,7 +116,8 @@ class TestAssetForm(AutoLoginTest):
|
|||||||
self.page.asset_id = "XX$X"
|
self.page.asset_id = "XX$X"
|
||||||
self.page.submit()
|
self.page.submit()
|
||||||
self.assertFalse(self.page.success)
|
self.assertFalse(self.page.success)
|
||||||
self.assertIn("An Asset ID can only consist of letters and numbers, with a final number", self.page.errors["Asset id"])
|
self.assertIn("An Asset ID can only consist of letters and numbers, with a final number",
|
||||||
|
self.page.errors["Asset id"])
|
||||||
self.assertIn("This field is required.", self.page.errors["Description"])
|
self.assertIn("This field is required.", self.page.errors["Description"])
|
||||||
|
|
||||||
self.page.open()
|
self.page.open()
|
||||||
@@ -271,11 +279,16 @@ class TestAssetAudit(AutoLoginTest):
|
|||||||
self.category = models.AssetCategory.objects.create(name="Haulage")
|
self.category = models.AssetCategory.objects.create(name="Haulage")
|
||||||
self.status = models.AssetStatus.objects.create(name="Probably Fine", should_show=True)
|
self.status = models.AssetStatus.objects.create(name="Probably Fine", should_show=True)
|
||||||
self.supplier = models.Supplier.objects.create(name="The Bazaar")
|
self.supplier = models.Supplier.objects.create(name="The Bazaar")
|
||||||
self.connector = models.Connector.objects.create(description="Trailer Socket", current_rating=1, voltage_rating=40, num_pins=13)
|
self.connector = models.Connector.objects.create(description="Trailer Socket", current_rating=1,
|
||||||
models.Asset.objects.create(asset_id="1", description="Trailer Cable", status=self.status, category=self.category, date_acquired=datetime.date(2020, 2, 1))
|
voltage_rating=40, num_pins=13)
|
||||||
models.Asset.objects.create(asset_id="11", description="Trailerboard", status=self.status, category=self.category, date_acquired=datetime.date(2020, 2, 1))
|
models.Asset.objects.create(asset_id="1", description="Trailer Cable", status=self.status,
|
||||||
models.Asset.objects.create(asset_id="111", description="Erms", status=self.status, category=self.category, date_acquired=datetime.date(2020, 2, 1))
|
category=self.category, date_acquired=datetime.date(2020, 2, 1))
|
||||||
models.Asset.objects.create(asset_id="1111", description="A hammer", status=self.status, category=self.category, date_acquired=datetime.date(2020, 2, 1))
|
models.Asset.objects.create(asset_id="11", description="Trailerboard", status=self.status,
|
||||||
|
category=self.category, date_acquired=datetime.date(2020, 2, 1))
|
||||||
|
models.Asset.objects.create(asset_id="111", description="Erms", status=self.status, category=self.category,
|
||||||
|
date_acquired=datetime.date(2020, 2, 1))
|
||||||
|
models.Asset.objects.create(asset_id="1111", description="A hammer", status=self.status, category=self.category,
|
||||||
|
date_acquired=datetime.date(2020, 2, 1))
|
||||||
self.page = pages.AssetAuditList(self.driver, self.live_server_url).open()
|
self.page = pages.AssetAuditList(self.driver, self.live_server_url).open()
|
||||||
self.wait = WebDriverWait(self.driver, 20)
|
self.wait = WebDriverWait(self.driver, 20)
|
||||||
|
|
||||||
@@ -288,12 +301,13 @@ class TestAssetAudit(AutoLoginTest):
|
|||||||
self.page.modal.remove_all_required()
|
self.page.modal.remove_all_required()
|
||||||
self.page.modal.description = ""
|
self.page.modal.description = ""
|
||||||
self.page.modal.submit()
|
self.page.modal.submit()
|
||||||
|
self.wait.until(animation_is_finished())
|
||||||
self.assertIn("This field is required.", self.page.modal.errors["Description"])
|
self.assertIn("This field is required.", self.page.modal.errors["Description"])
|
||||||
# Now do it properly
|
# Now do it properly
|
||||||
self.page.modal.description = new_desc = "A BIG hammer"
|
self.page.modal.description = new_desc = "A BIG hammer"
|
||||||
self.page.modal.submit()
|
self.page.modal.submit()
|
||||||
|
self.wait.until(animation_is_finished())
|
||||||
submit_time = timezone.now()
|
submit_time = timezone.now()
|
||||||
self.assertFalse(self.driver.find_element_by_id('modal').is_displayed())
|
|
||||||
# Check data is correct
|
# Check data is correct
|
||||||
audited = models.Asset.objects.get(asset_id=asset_id)
|
audited = models.Asset.objects.get(asset_id=asset_id)
|
||||||
self.assertEqual(audited.description, new_desc)
|
self.assertEqual(audited.description, new_desc)
|
||||||
|
|||||||
@@ -4,9 +4,8 @@ import pytest
|
|||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from pytest_django.asserts import assertFormError, assertRedirects
|
from pytest_django.asserts import assertFormError, assertRedirects, assertContains, assertNotContains
|
||||||
|
|
||||||
from PyRIGS.tests.base import response_contains
|
|
||||||
from assets import models, urls
|
from assets import models, urls
|
||||||
|
|
||||||
pytestmark = pytest.mark.django_db # TODO
|
pytestmark = pytest.mark.django_db # TODO
|
||||||
@@ -107,17 +106,17 @@ def test_oembed(client):
|
|||||||
# Test the meta tag is in place
|
# Test the meta tag is in place
|
||||||
response = client.get(asset_url, follow=True, HTTP_HOST='example.com')
|
response = client.get(asset_url, follow=True, HTTP_HOST='example.com')
|
||||||
assert '<link rel="alternate" type="application/json+oembed"' in str(response.content)
|
assert '<link rel="alternate" type="application/json+oembed"' in str(response.content)
|
||||||
assert oembed_url in str(response.content)
|
assertContains(response, oembed_url)
|
||||||
|
|
||||||
# Test that the JSON exists
|
# Test that the JSON exists
|
||||||
response = client.get(oembed_url, follow=True, HTTP_HOST='example.com')
|
response = client.get(oembed_url, follow=True, HTTP_HOST='example.com')
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert asset_embed_url in str(response.content)
|
assertContains(response, asset_embed_url)
|
||||||
|
|
||||||
# Should also work for non-existant
|
# Should also work for non-existant
|
||||||
response = client.get(alt_oembed_url, follow=True, HTTP_HOST='example.com')
|
response = client.get(alt_oembed_url, follow=True, HTTP_HOST='example.com')
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert alt_asset_embed_url in str(response.content)
|
assertContains(response, alt_asset_embed_url)
|
||||||
|
|
||||||
|
|
||||||
@override_settings(DEBUG=True)
|
@override_settings(DEBUG=True)
|
||||||
@@ -228,7 +227,7 @@ def test_unauthenticated(client):
|
|||||||
if request_url:
|
if request_url:
|
||||||
response = client.get(request_url, follow=True, HTTP_HOST='example.com')
|
response = client.get(request_url, follow=True, HTTP_HOST='example.com')
|
||||||
# TODO Check the URL here
|
# TODO Check the URL here
|
||||||
assert response_contains(response, 'Login')
|
assertContains(response, 'Login')
|
||||||
|
|
||||||
|
|
||||||
def test_basic_access(client):
|
def test_basic_access(client):
|
||||||
@@ -238,13 +237,13 @@ def test_basic_access(client):
|
|||||||
url = reverse('asset_list')
|
url = reverse('asset_list')
|
||||||
response = client.get(url)
|
response = client.get(url)
|
||||||
# Check edit and duplicate buttons NOT shown in list
|
# Check edit and duplicate buttons NOT shown in list
|
||||||
assert not response_contains(response, 'Edit')
|
assertNotContains(response, 'Edit')
|
||||||
assert not response_contains(response, 'Duplicate')
|
assertNotContains(response, 'Duplicate')
|
||||||
|
|
||||||
url = reverse('asset_detail', kwargs={'pk': "9000"})
|
url = reverse('asset_detail', kwargs={'pk': "9000"})
|
||||||
response = client.get(url)
|
response = client.get(url)
|
||||||
assert not response_contains(response, 'Purchase Details')
|
assertNotContains(response, 'Purchase Details')
|
||||||
assert not response_contains(response, 'View Revision History')
|
assertNotContains(response, 'View Revision History')
|
||||||
|
|
||||||
urls = {'asset_history', 'asset_update', 'asset_duplicate'}
|
urls = {'asset_history', 'asset_update', 'asset_duplicate'}
|
||||||
for url_name in urls:
|
for url_name in urls:
|
||||||
@@ -268,13 +267,13 @@ def test_keyholder_access(client):
|
|||||||
url = reverse('asset_list')
|
url = reverse('asset_list')
|
||||||
response = client.get(url)
|
response = client.get(url)
|
||||||
# Check edit and duplicate buttons shown in list
|
# Check edit and duplicate buttons shown in list
|
||||||
assert response_contains(response, 'Edit')
|
assertContains(response, 'Edit')
|
||||||
assert response_contains(response, 'Duplicate')
|
assertContains(response, 'Duplicate')
|
||||||
|
|
||||||
url = reverse('asset_detail', kwargs={'pk': "9000"})
|
url = reverse('asset_detail', kwargs={'pk': "9000"})
|
||||||
response = client.get(url)
|
response = client.get(url)
|
||||||
assert response_contains(response, 'Purchase Details')
|
assertContains(response, 'Purchase Details')
|
||||||
assert response_contains(response, 'View Revision History')
|
assertContains(response, 'View Revision History')
|
||||||
|
|
||||||
|
|
||||||
def test_page_titles(admin_client):
|
def test_page_titles(admin_client):
|
||||||
@@ -287,4 +286,4 @@ def test_page_titles(admin_client):
|
|||||||
response = admin_client.get(request_url)
|
response = admin_client.get(request_url)
|
||||||
if hasattr(response, "context_data") and "page_title" in response.context_data:
|
if hasattr(response, "context_data") and "page_title" in response.context_data:
|
||||||
expected_title = response.context_data["page_title"]
|
expected_title = response.context_data["page_title"]
|
||||||
assert response_contains(response, '<title>{} | Rig Information Gathering System</title>'.format(expected_title))
|
assertContains(response, '<title>{} | Rig Information Gathering System</title>'.format(expected_title))
|
||||||
|
|||||||
8
conftest.py
Normal file
8
conftest.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
from django.conf import settings
|
||||||
|
import django
|
||||||
|
|
||||||
|
def pytest_configure():
|
||||||
|
settings.PASSWORD_HASHERS = (
|
||||||
|
'django.contrib.auth.hashers.MD5PasswordHasher',
|
||||||
|
)
|
||||||
|
django.setup()
|
||||||
Reference in New Issue
Block a user