From cd9f491dc6f669ed3c99e4d9d1a8f12f7af03e21 Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Fri, 8 Nov 2024 09:36:33 +0100 Subject: [PATCH] Remove coupling of tests to cui (#8389) * remove coupling of tests to cui * all testing for PUI absolute urls * remove overlapping test * refactor middleware check * move static things into global * factor out test target * re-add api exception * keep using settings.js for now --- src/backend/InvenTree/InvenTree/middleware.py | 35 +++++++++-------- .../InvenTree/InvenTree/test_middleware.py | 39 ++++++------------- src/backend/InvenTree/InvenTree/tests.py | 4 +- src/backend/InvenTree/InvenTree/urls.py | 4 +- src/backend/InvenTree/build/tests.py | 2 + src/backend/InvenTree/company/tests.py | 4 ++ src/backend/InvenTree/order/tests.py | 5 +++ src/backend/InvenTree/part/test_category.py | 4 ++ src/backend/InvenTree/part/test_part.py | 2 + .../barcodes/test_inventree_barcode.py | 8 ++++ src/backend/InvenTree/stock/tests.py | 3 ++ src/backend/InvenTree/users/tests.py | 4 +- 12 files changed, 63 insertions(+), 51 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/middleware.py b/src/backend/InvenTree/InvenTree/middleware.py index e528f4aa96..aeee3b2672 100644 --- a/src/backend/InvenTree/InvenTree/middleware.py +++ b/src/backend/InvenTree/InvenTree/middleware.py @@ -36,6 +36,24 @@ def get_token_from_request(request): return None +# List of target URL endpoints where *do not* want to redirect to +urls = [ + reverse_lazy('account_login'), + reverse_lazy('account_logout'), + reverse_lazy('admin:login'), + reverse_lazy('admin:logout'), +] + +# Do not redirect requests to any of these paths +paths_ignore = [ + '/api/', + '/auth/', + '/js/', # TODO - remove when CUI is removed + settings.MEDIA_URL, + settings.STATIC_URL, +] + + class AuthRequiredMiddleware: """Check for user to be authenticated.""" @@ -108,23 +126,6 @@ class AuthRequiredMiddleware: if not authorized: path = request.path_info - # List of URL endpoints we *do not* want to redirect to - urls = [ - reverse_lazy('account_login'), - reverse_lazy('account_logout'), - reverse_lazy('admin:login'), - reverse_lazy('admin:logout'), - ] - - # Do not redirect requests to any of these paths - paths_ignore = [ - '/api/', - '/auth/', - '/js/', - settings.MEDIA_URL, - settings.STATIC_URL, - ] - if path not in urls and not any( path.startswith(p) for p in paths_ignore ): diff --git a/src/backend/InvenTree/InvenTree/test_middleware.py b/src/backend/InvenTree/InvenTree/test_middleware.py index e00ea8a00f..d0e58f7258 100644 --- a/src/backend/InvenTree/InvenTree/test_middleware.py +++ b/src/backend/InvenTree/InvenTree/test_middleware.py @@ -2,7 +2,6 @@ from django.conf import settings from django.http import Http404 -from django.test import tag from django.urls import reverse from error_report.models import Error @@ -11,8 +10,6 @@ from InvenTree.exceptions import log_error from InvenTree.unit_test import InvenTreeTestCase -# TODO change test to not rely on CUI -@tag('cui') class MiddlewareTests(InvenTreeTestCase): """Test for middleware functions.""" @@ -32,25 +29,17 @@ class MiddlewareTests(InvenTreeTestCase): # logout self.client.logout() - # check that static files go through - # TODO @matmair re-enable this check - # self.check_path('/static/css/inventree.css', 302) - # check that account things go through self.check_path(reverse('account_login')) - # logout goes directly to login - self.check_path(reverse('account_logout')) - # check that frontend code is redirected to login - response = self.check_path(reverse('stats'), 302) - self.assertEqual(response.url, '/accounts/login/?next=/stats/') - - # check that a 401 is raised - self.check_path(reverse('settings.js'), 401) + response = self.check_path(reverse('index'), 302) + self.assertEqual(response.url, '/accounts/login/?next=/') def test_token_auth(self): """Test auth with token auth.""" + target = reverse('settings.js') # for PUI only use 'api-license' + # get token response = self.client.get(reverse('api-token'), format='json', data={}) token = response.data['token'] @@ -58,16 +47,17 @@ class MiddlewareTests(InvenTreeTestCase): # logout self.client.logout() # this should raise a 401 - self.check_path(reverse('settings.js'), 401) - # request with token - self.check_path(reverse('settings.js'), HTTP_Authorization=f'Token {token}') + self.check_path(target, 401) # Request with broken token - self.check_path(reverse('settings.js'), 401, HTTP_Authorization='Token abcd123') + self.check_path(target, 401, HTTP_Authorization='Token abcd123') # should still fail without token - self.check_path(reverse('settings.js'), 401) + self.check_path(target, 401) + + # request with token + self.check_path(target, HTTP_Authorization=f'Token {token}') def test_error_exceptions(self): """Test that ignored errors are not logged.""" @@ -80,7 +70,7 @@ class MiddlewareTests(InvenTreeTestCase): # Test normal setup check() - response = self.client.get(reverse('part-detail', kwargs={'pk': 9999})) + response = self.client.get(reverse('api-part-detail', kwargs={'pk': 9999})) self.assertEqual(response.status_code, 404) check() @@ -92,13 +82,8 @@ class MiddlewareTests(InvenTreeTestCase): # Test setup without ignored errors settings.IGNORED_ERRORS = [] - response = self.client.get(reverse('part-detail', kwargs={'pk': 9999})) - self.assertEqual(response.status_code, 404) - check(1) - - # Test manual logging try: raise Http404 except Http404: log_error('testpath') - check(2) + check(1) diff --git a/src/backend/InvenTree/InvenTree/tests.py b/src/backend/InvenTree/InvenTree/tests.py index 0672e4699d..0f17f9a3d4 100644 --- a/src/backend/InvenTree/InvenTree/tests.py +++ b/src/backend/InvenTree/InvenTree/tests.py @@ -11,7 +11,7 @@ from django.conf import settings from django.contrib.auth import get_user_model from django.core import mail from django.core.exceptions import ValidationError -from django.test import TestCase, override_settings, tag +from django.test import TestCase, override_settings from django.urls import reverse from django.utils import timezone @@ -1493,8 +1493,6 @@ class MagicLoginTest(InvenTreeTestCase): self.assertEqual(resp.wsgi_request.user, self.user) -# TODO - refactor to not use CUI -@tag('cui') class MaintenanceModeTest(InvenTreeTestCase): """Unit tests for maintenance mode.""" diff --git a/src/backend/InvenTree/InvenTree/urls.py b/src/backend/InvenTree/InvenTree/urls.py index 7f6d6c6b37..601c845731 100644 --- a/src/backend/InvenTree/InvenTree/urls.py +++ b/src/backend/InvenTree/InvenTree/urls.py @@ -477,7 +477,9 @@ if settings.ENABLE_PLATFORM_FRONTEND: frontendpatterns += [ path( 'accounts/login/', - RedirectView.as_view(url=settings.FRONTEND_URL_BASE, permanent=False), + RedirectView.as_view( + url=f'/{settings.FRONTEND_URL_BASE}', permanent=False + ), name='account_login', ) ] diff --git a/src/backend/InvenTree/build/tests.py b/src/backend/InvenTree/build/tests.py index 22d38cbeb8..01065d90aa 100644 --- a/src/backend/InvenTree/build/tests.py +++ b/src/backend/InvenTree/build/tests.py @@ -47,6 +47,8 @@ class BuildTestSimple(InvenTreeTestCase): b1 = Build.objects.get(pk=1) if settings.ENABLE_CLASSIC_FRONTEND: self.assertEqual(b1.get_absolute_url(), '/build/1/') + else: + self.assertEqual(b1.get_absolute_url(), '/platform/manufacturing/build-order/1') def test_is_complete(self): """Test build completion status""" diff --git a/src/backend/InvenTree/company/tests.py b/src/backend/InvenTree/company/tests.py index 351fee268d..6b41519169 100644 --- a/src/backend/InvenTree/company/tests.py +++ b/src/backend/InvenTree/company/tests.py @@ -62,6 +62,10 @@ class CompanySimpleTest(TestCase): c = Company.objects.get(pk=1) if settings.ENABLE_CLASSIC_FRONTEND: self.assertEqual(c.get_absolute_url(), '/company/1/') + else: + self.assertEqual( + c.get_absolute_url(), '/platform/purchasing/manufacturer/1' + ) def test_image_renamer(self): """Test the company image upload functionality.""" diff --git a/src/backend/InvenTree/order/tests.py b/src/backend/InvenTree/order/tests.py index 1963b586c9..78c617e014 100644 --- a/src/backend/InvenTree/order/tests.py +++ b/src/backend/InvenTree/order/tests.py @@ -46,6 +46,11 @@ class OrderTest(TestCase): self.assertEqual( order.get_absolute_url(), f'/order/purchase-order/{pk}/' ) + else: + self.assertEqual( + order.get_absolute_url(), + f'/platform/purchasing/purchase-order/{pk}', + ) self.assertEqual(order.reference, f'PO-{pk:04d}') diff --git a/src/backend/InvenTree/part/test_category.py b/src/backend/InvenTree/part/test_category.py index 94465d075d..593345cb6c 100644 --- a/src/backend/InvenTree/part/test_category.py +++ b/src/backend/InvenTree/part/test_category.py @@ -130,6 +130,10 @@ class CategoryTest(TestCase): """Test that the PartCategory URL works.""" if settings.ENABLE_CLASSIC_FRONTEND: self.assertEqual(self.capacitors.get_absolute_url(), '/part/category/3/') + else: + self.assertEqual( + self.capacitors.get_absolute_url(), '/platform/part/category/3' + ) def test_part_count(self): """Test that the Category part count works.""" diff --git a/src/backend/InvenTree/part/test_part.py b/src/backend/InvenTree/part/test_part.py index 04e89f4520..e2ac784d2e 100644 --- a/src/backend/InvenTree/part/test_part.py +++ b/src/backend/InvenTree/part/test_part.py @@ -246,6 +246,8 @@ class PartTest(TestCase): self.assertEqual(self.r1.name, 'R_2K2_0805') if settings.ENABLE_CLASSIC_FRONTEND: self.assertEqual(self.r1.get_absolute_url(), '/part/3/') + else: + self.assertEqual(self.r1.get_absolute_url(), '/platform/part/3') def test_category(self): """Test PartCategory path.""" diff --git a/src/backend/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py b/src/backend/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py index aab979d2db..d0b175b22e 100644 --- a/src/backend/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py +++ b/src/backend/InvenTree/plugin/builtin/barcodes/test_inventree_barcode.py @@ -289,6 +289,10 @@ class TestInvenTreeBarcode(InvenTreeAPITestCase): self.assertEqual( response.data['stocklocation']['web_url'], '/stock/location/5/' ) + else: + self.assertEqual( + response.data['stocklocation']['web_url'], '/platform/stock/location/5' + ) self.assertEqual(response.data['plugin'], 'InvenTreeBarcode') # Scan a Part object @@ -332,6 +336,10 @@ class TestInvenTreeBarcode(InvenTreeAPITestCase): self.assertEqual( response.data['stocklocation']['web_url'], '/stock/location/5/' ) + else: + self.assertEqual( + response.data['stocklocation']['web_url'], '/platform/stock/location/5' + ) self.assertEqual(response.data['plugin'], 'InvenTreeBarcode') # Scan a Part object diff --git a/src/backend/InvenTree/stock/tests.py b/src/backend/InvenTree/stock/tests.py index a7d065930e..27548c3806 100644 --- a/src/backend/InvenTree/stock/tests.py +++ b/src/backend/InvenTree/stock/tests.py @@ -266,6 +266,9 @@ class StockTest(StockTestBase): if settings.ENABLE_CLASSIC_FRONTEND: self.assertEqual(it.get_absolute_url(), '/stock/item/2/') self.assertEqual(self.home.get_absolute_url(), '/stock/location/1/') + else: + self.assertEqual(it.get_absolute_url(), '/platform/stock/item/2') + self.assertEqual(self.home.get_absolute_url(), '/platform/stock/location/1') def test_strings(self): """Test str function.""" diff --git a/src/backend/InvenTree/users/tests.py b/src/backend/InvenTree/users/tests.py index 9e123bb181..262e8dcd99 100644 --- a/src/backend/InvenTree/users/tests.py +++ b/src/backend/InvenTree/users/tests.py @@ -2,7 +2,7 @@ from django.apps import apps from django.contrib.auth.models import Group -from django.test import TestCase, tag +from django.test import TestCase from django.urls import reverse from common.settings import set_global_setting @@ -166,8 +166,6 @@ class OwnerModelTest(InvenTreeTestCase): self.assertEqual(response.status_code, status_code) return response.data - # TODO: Find out why this depends on CUI - @tag('cui') def test_owner(self): """Tests for the 'owner' model.""" # Check that owner was created for user