From 1b2ce89c421c27376723194f6fa3550790226535 Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Fri, 17 Oct 2025 02:35:57 +0200 Subject: [PATCH] Add generic test for serializer --- .../InvenTree/InvenTree/test_serializers.py | 79 +++++++++++++++++++ src/backend/InvenTree/InvenTree/urls.py | 13 +-- 2 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 src/backend/InvenTree/InvenTree/test_serializers.py diff --git a/src/backend/InvenTree/InvenTree/test_serializers.py b/src/backend/InvenTree/InvenTree/test_serializers.py new file mode 100644 index 0000000000..259eadc764 --- /dev/null +++ b/src/backend/InvenTree/InvenTree/test_serializers.py @@ -0,0 +1,79 @@ +"""Low level tests for serializers.""" + +from django.contrib import admin +from django.contrib.auth.models import User +from django.urls import path, reverse + +from rest_framework.serializers import SerializerMethodField + +import InvenTree.serializers +from InvenTree.mixins import ListCreateAPI, OutputOptionsMixin +from InvenTree.unit_test import InvenTreeAPITestCase +from InvenTree.urls import third_backendpatterns + + +class SampleSerializer( + InvenTree.serializers.FilterableSerializerMixin, + InvenTree.serializers.InvenTreeModelSerializer, +): + """Sample serializer for testing FilterableSerializerMixin.""" + + class Meta: + """Meta options.""" + + model = User + fields = ['field_a', 'field_b', 'field_c', 'field_d', 'id'] + + field_a = SerializerMethodField(method_name='sample') + field_b = InvenTree.serializers.enable_filter( + InvenTree.serializers.FilterableSerializerMethodField(method_name='sample') + ) + field_c = InvenTree.serializers.enable_filter( + InvenTree.serializers.FilterableSerializerMethodField(method_name='sample'), + True, + filter_name='crazy_name', + ) + field_d = InvenTree.serializers.enable_filter( + InvenTree.serializers.FilterableSerializerMethodField(method_name='sample'), + True, + filter_name='crazy_name', + ) + + def sample(self, obj): + """Sample method field.""" + return 'sample' + + +class SampleList(OutputOptionsMixin, ListCreateAPI): + """List endpoint sample.""" + + serializer_class = SampleSerializer + queryset = User.objects.all() + permission_classes = [] + + +urlpatterns = [ + path('', SampleList.as_view(), name='sample-list'), + path('admin/', admin.site.urls, name='inventree-admin'), +] +urlpatterns += third_backendpatterns + + +class FilteredSerializers(InvenTreeAPITestCase): + """Tests for functionality of FilteredSerializerMixin / adjacent functions.""" + + def test_basic_setup(self): + """Test simple sample setup.""" + with self.settings( + ROOT_URLCONF=__name__, + CSRF_TRUSTED_ORIGINS=['http://testserver'], + SITE_URL='http://testserver', + ): + url = reverse('sample-list', urlconf=__name__) + + # Default request (no filters) + response = self.client.get(url) + self.assertContains(response, 'field_a') + self.assertNotContains(response, 'field_b') + self.assertContains(response, 'field_c') + self.assertContains(response, 'field_d') diff --git a/src/backend/InvenTree/InvenTree/urls.py b/src/backend/InvenTree/InvenTree/urls.py index db4edd1e0c..d2f581a8c3 100644 --- a/src/backend/InvenTree/InvenTree/urls.py +++ b/src/backend/InvenTree/InvenTree/urls.py @@ -126,7 +126,7 @@ apipatterns = [ ] -backendpatterns = [ +third_backendpatterns = [ path( 'auth/', include('rest_framework.urls', namespace='rest_framework') ), # Used for (DRF) browsable API auth @@ -139,10 +139,7 @@ backendpatterns = [ RedirectView.as_view(url=f'/{settings.FRONTEND_URL_BASE}', permanent=False), name='account_login', ), # Add a redirect for login views - path('api/', include(apipatterns)), - path('api-doc/', SpectacularRedocView.as_view(url_name='schema'), name='api-doc'), - # Emails - path('anymail/', include('anymail.urls')), + path('anymail/', include('anymail.urls')), # Emails ] urlpatterns = [] @@ -156,7 +153,11 @@ if settings.INVENTREE_ADMIN_ENABLED: path(f'{admin_url}/', admin.site.urls, name='inventree-admin'), ] -urlpatterns += backendpatterns +urlpatterns += third_backendpatterns +urlpatterns += [ # API URLs + path('api/', include(apipatterns)), + path('api-doc/', SpectacularRedocView.as_view(url_name='schema'), name='api-doc'), +] urlpatterns += platform_urls # Append custom plugin URLs (if custom plugin support is enabled)