From 883ef4ed8bcfa86e31145d5277c3e3a52adbbea8 Mon Sep 17 00:00:00 2001 From: Arona Jones Date: Wed, 27 Jan 2021 19:36:42 +0000 Subject: [PATCH] Bah, codestyle --- PyRIGS/views.py | 3 +++ RIGS/urls.py | 8 ++++---- assets/tests/test_unit.py | 25 ++++++++++++++++++++++--- assets/views.py | 1 + 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/PyRIGS/views.py b/PyRIGS/views.py index 3d835dcd..ef36d8ee 100644 --- a/PyRIGS/views.py +++ b/PyRIGS/views.py @@ -23,10 +23,13 @@ from functools import reduce from django.views.decorators.cache import never_cache, cache_page from django.utils.decorators import method_decorator + def is_ajax(request): return request.headers.get('x-requested-with') == 'XMLHttpRequest' # Displays the current rig count along with a few other bits and pieces + + class Index(generic.TemplateView): template_name = 'index.html' diff --git a/RIGS/urls.py b/RIGS/urls.py index bef63083..ac8ad749 100644 --- a/RIGS/urls.py +++ b/RIGS/urls.py @@ -46,9 +46,9 @@ urlpatterns = [ path('rigboard/calendar/', login_required()(rigboard.WebCalendar.as_view()), name='web_calendar'), re_path(r'^rigboard/calendar/(?P(month|week|day))/$', - login_required()(rigboard.WebCalendar.as_view()), name='web_calendar'), + login_required()(rigboard.WebCalendar.as_view()), name='web_calendar'), re_path(r'^rigboard/calendar/(?P(month|week|day))/(?P(\d{4}-\d{2}-\d{2}))/$', - login_required()(rigboard.WebCalendar.as_view()), name='web_calendar'), + login_required()(rigboard.WebCalendar.as_view()), name='web_calendar'), path('rigboard/archive/', RedirectView.as_view(permanent=True, pattern_name='event_archive')), @@ -131,11 +131,11 @@ urlpatterns = [ permission_required_with_403('RIGS.change_event')(rigboard.EventAuthoriseRequestEmailPreview.as_view()), name='event_authorise_preview'), re_path(r'^event/(?P\d+)/(?P[-:\w]+)/$', rigboard.EventAuthorise.as_view(), - name='event_authorise'), + name='event_authorise'), # ICS Calendar - API key authentication re_path(r'^ical/(?P\d+)/(?P\w+)/rigs.ics$', api_key_required(ical.CalendarICS()), - name="ics_calendar"), + name="ics_calendar"), # Legacy URLs diff --git a/assets/tests/test_unit.py b/assets/tests/test_unit.py index f5e7fa22..5e221df9 100644 --- a/assets/tests/test_unit.py +++ b/assets/tests/test_unit.py @@ -11,23 +11,27 @@ from django.test import tag import pytest from pytest_django.asserts import assertFormError, assertRedirects -pytestmark = pytest.mark.django_db # TODO +pytestmark = pytest.mark.django_db # TODO + def response_contains(response, needle): return needle in str(response.content) + def login(client, django_user_model): pwd = 'testuser' usr = "TestUser" profile = django_user_model.objects.create_user(username=usr, email="TestUser@test.com", password=pwd, is_superuser=True, is_active=True, is_staff=True) assert client.login(username=usr, password=pwd) + def create_test_asset(): working = models.AssetStatus.objects.create(name="Working", should_show=True) lighting = models.AssetCategory.objects.create(name="Lighting") asset = models.Asset.objects.create(asset_id="1991", description="Spaceflower", status=working, category=lighting, date_acquired=datetime.date(1991, 12, 26)) return asset + def create_test_cable(): category = models.AssetCategory.objects.create(name="Sound") status = models.AssetStatus.objects.create(name="Broken", should_show=True) @@ -35,12 +39,14 @@ def create_test_cable(): cable_type = models.CableType.objects.create(circuits=11, cores=3, plug=connector, socket=connector) return models.Asset.objects.create(asset_id="666", description="125A -> Jack", comments="The cable from Hell...", status=status, category=category, date_acquired=datetime.date(2006, 6, 6), is_cable=True, cable_type=cable_type, length=10, csa="1.5") + def test_supplier_create(client, django_user_model): login(client, django_user_model) url = reverse('supplier_create') response = client.post(url) assertFormError(response, 'form', 'name', 'This field is required.') + def test_supplier_edit(client, django_user_model): login(client, django_user_model) supplier = models.Supplier.objects.create(name="Gadgetron Corporation") @@ -48,6 +54,7 @@ def test_supplier_edit(client, django_user_model): response = client.post(url, {'name': ""}) assertFormError(response, 'form', 'name', 'This field is required.') + def test_404(client, django_user_model): login(client, django_user_model) urls = {'asset_detail', 'asset_update', 'asset_duplicate', 'supplier_detail', 'supplier_update'} @@ -72,11 +79,13 @@ def test_embed_login_redirect(client, django_user_model): response = client.get(request_url, follow=True) assert len(response.redirect_chain) == 0 + def test_login_cookie_warning(client, django_user_model): login_url = reverse('login_embed') response = client.post(login_url, follow=True) assert "Cookies do not seem to be enabled" in str(response.content) + def test_x_frame_headers(client, django_user_model): asset_url = reverse('asset_embed', kwargs={'pk': create_test_asset().asset_id}) login_url = reverse('login_embed') @@ -116,8 +125,8 @@ def test_oembed(client): assert response.status_code == 200 assert alt_asset_embed_url in str(response.content) -@override_settings(DEBUG=True) +@override_settings(DEBUG=True) def test_generate_sample_data(client): # Run the management command and check there are no exceptions call_command('generateSampleAssetsData') @@ -126,8 +135,8 @@ def test_generate_sample_data(client): assert models.Asset.objects.all().count() > 50 assert models.Supplier.objects.all().count() > 50 -@override_settings(DEBUG=True) +@override_settings(DEBUG=True) def test_delete_sample_data(client): call_command('deleteSampleData') @@ -166,6 +175,8 @@ def test_cable_create(client, django_user_model): assertFormError(response, 'form', 'csa', 'The CSA of a cable must be more than 0') # Given that validation is done at model level it *shouldn't* need retesting...gonna do it anyway! + + def test_asset_edit(client, django_user_model): login(client, django_user_model) url = reverse('asset_update', kwargs={'pk': create_test_asset().asset_id}) @@ -178,6 +189,7 @@ def test_asset_edit(client, django_user_model): assertFormError(response, 'form', 'purchase_price', 'A price cannot be negative') assertFormError(response, 'form', 'salvage_value', 'A price cannot be negative') + def test_cable_edit(client, django_user_model): login(client, django_user_model) url = reverse('asset_update', kwargs={'pk': create_test_cable().asset_id}) @@ -189,6 +201,7 @@ def test_cable_edit(client, django_user_model): assertFormError(response, 'form', 'length', 'The length of a cable must be more than 0') assertFormError(response, 'form', 'csa', 'The CSA of a cable must be more than 0') + def test_asset_duplicate(client, django_user_model): login(client, django_user_model) url = reverse('asset_duplicate', kwargs={'pk': create_test_cable().asset_id}) @@ -197,6 +210,7 @@ def test_asset_duplicate(client, django_user_model): assertFormError(response, 'form', 'length', 'The length of a cable must be more than 0') assertFormError(response, 'form', 'csa', 'The CSA of a cable must be more than 0') + @override_settings(DEBUG=True) def create_asset_one(): # Shortcut to create the levels - bonus side effect of testing the command (hopefully) matches production @@ -207,6 +221,8 @@ def create_asset_one(): return models.Asset.objects.create(asset_id="1", description="Half Price Fish", status=status, category=category, date_acquired=datetime.date(2020, 2, 1)) # Nothing should be available to the unauthenticated + + def test_unauthenticated(client): for url in filter(lambda url: url.name is not None and "json" not in str(url), urls.urlpatterns): pattern = str(url.pattern) @@ -220,6 +236,7 @@ def test_unauthenticated(client): # TODO Check the URL here assert response_contains(response, 'Login') + def test_basic_access(client): create_asset_one() client.login(username="basic", password="basic") @@ -249,6 +266,7 @@ def test_basic_access(client): response = client.get(request_url, follow=True) assert response.status_code == 403 + def test_keyholder_access(client): create_asset_one() client.login(username="keyholder", password="keyholder") @@ -264,6 +282,7 @@ def test_keyholder_access(client): assert response_contains(response, 'Purchase Details') assert response_contains(response, 'View Revision History') + def test_page_titles(admin_client): for url in filter(lambda url: url.name is not None and not any(s in url.name for s in ["json", "embed"]), urls.urlpatterns): request_url = "" diff --git a/assets/views.py b/assets/views.py index d5b61999..993148df 100644 --- a/assets/views.py +++ b/assets/views.py @@ -17,6 +17,7 @@ from versioning import versioning from PyRIGS.views import GenericListView, GenericDetailView, GenericUpdateView, GenericCreateView, ModalURLMixin, is_ajax from itertools import chain + @method_decorator(csrf_exempt, name='dispatch') class AssetList(LoginRequiredMixin, generic.ListView): model = models.Asset