From 8bae771e2959234b699e4e45111b51972bd7db81 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:24:51 +0300 Subject: [PATCH] Add tests for InlineSynthesis backend --- .../apps/rsform/serializers/data_access.py | 12 +-- .../apps/rsform/tests/s_views/__init__.py | 1 + .../apps/rsform/tests/s_views/t_operations.py | 84 +++++++++++++++++++ .../backend/apps/rsform/views/operations.py | 2 +- 4 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 rsconcept/backend/apps/rsform/tests/s_views/t_operations.py diff --git a/rsconcept/backend/apps/rsform/serializers/data_access.py b/rsconcept/backend/apps/rsform/serializers/data_access.py index 346cedf0..307b5d7c 100644 --- a/rsconcept/backend/apps/rsform/serializers/data_access.py +++ b/rsconcept/backend/apps/rsform/serializers/data_access.py @@ -194,12 +194,15 @@ class RSFormParseSerializer(serializers.ModelSerializer): return data -class CstSubstituteSerializer(serializers.Serializer): - ''' Serializer: Constituenta substitution. ''' +class CstSubstituteSerializerBase(serializers.Serializer): + ''' Serializer: Basic substitution. ''' original = PKField(many=False, queryset=Constituenta.objects.all()) substitution = PKField(many=False, queryset=Constituenta.objects.all()) transfer_term = serializers.BooleanField(required=False, default=False) + +class CstSubstituteSerializer(CstSubstituteSerializerBase): + ''' Serializer: Constituenta substitution. ''' def validate(self, attrs): schema = cast(LibraryItem, self.context['schema']) original_cst = cast(Constituenta, attrs['original']) @@ -216,9 +219,6 @@ class CstSubstituteSerializer(serializers.Serializer): raise serializers.ValidationError({ 'substitution': msg.constituentaNotOwned(schema.title) }) - attrs['original'] = original_cst - attrs['substitution'] = substitution_cst - attrs['transfer_term'] = self.initial_data['transfer_term'] return attrs @@ -295,7 +295,7 @@ class InlineSynthesisSerializer(serializers.Serializer): source = PKField(many=False, queryset=LibraryItem.objects.all()) # type: ignore items = PKField(many=True, queryset=Constituenta.objects.all()) substitutions = serializers.ListField( - child=CstSubstituteSerializer() + child=CstSubstituteSerializerBase() ) def validate(self, attrs): diff --git a/rsconcept/backend/apps/rsform/tests/s_views/__init__.py b/rsconcept/backend/apps/rsform/tests/s_views/__init__.py index 0f1091fc..376add39 100644 --- a/rsconcept/backend/apps/rsform/tests/s_views/__init__.py +++ b/rsconcept/backend/apps/rsform/tests/s_views/__init__.py @@ -1,6 +1,7 @@ ''' Tests for REST API. ''' from .t_library import * from .t_constituents import * +from .t_operations import * from .t_rsforms import * from .t_versions import * diff --git a/rsconcept/backend/apps/rsform/tests/s_views/t_operations.py b/rsconcept/backend/apps/rsform/tests/s_views/t_operations.py new file mode 100644 index 00000000..ea3ae5a5 --- /dev/null +++ b/rsconcept/backend/apps/rsform/tests/s_views/t_operations.py @@ -0,0 +1,84 @@ +''' Testing API: Operations. ''' +from rest_framework import status +from .EndpointTester import decl_endpoint, EndpointTester + +from apps.rsform.models import ( + RSForm, + Constituenta, + CstType +) + + +class TestInlineSynthesis(EndpointTester): + ''' Testing Operations endpoints. ''' + + @decl_endpoint('/api/operations/inline-synthesis', method='patch') + def setUp(self): + super().setUp() + self.schema1 = RSForm.create(title='Test1', alias='T1', owner=self.user) + self.schema2 = RSForm.create(title='Test2', alias='T2', owner=self.user) + self.unowned = RSForm.create(title='Test3', alias='T3') + + def test_inline_synthesis_inputs(self): + invalid_id = 1338 + data = { + 'receiver': self.unowned.item.id, + 'source': self.schema1.item.id, + 'items': [], + 'substitutions': [] + } + self.assertForbidden(data) + + data['receiver'] = invalid_id + self.assertBadData(data) + + data['receiver'] = self.schema1.item.id + data['source'] = invalid_id + self.assertBadData(data) + + data['source'] = self.schema1.item.id + self.assertOK(data) + + data['items'] = [invalid_id] + self.assertBadData(data) + + def test_inline_synthesis(self): + ks1_x1 = self.schema1.insert_new('X1', term_raw='KS1X1') # -> delete + ks1_x2 = self.schema1.insert_new('X2', term_raw='KS1X2') # -> X2 + ks1_s1 = self.schema1.insert_new('S1', definition_formal='X2', term_raw='KS1S1') # -> S1 + ks1_d1 = self.schema1.insert_new('D1', definition_formal='S1\X1\X2') # -> D1 + ks2_x1 = self.schema2.insert_new('X1', term_raw='KS2X1') # -> delete + ks2_x2 = self.schema2.insert_new('X2', term_raw='KS2X2') # -> X4 + ks2_s1 = self.schema2.insert_new('S1', definition_formal='X2×X2', term_raw='KS2S1') # -> S2 + ks2_d1 = self.schema2.insert_new('D1', definition_formal='S1\X1\X2') # -> D2 + ks2_a1 = self.schema2.insert_new('A1', definition_formal='1=1') # -> not included in items + + data = { + 'receiver': self.schema1.item.id, + 'source': self.schema2.item.id, + 'items': [ks2_x1.pk, ks2_x2.pk, ks2_s1.pk, ks2_d1.pk], + 'substitutions': [ + { + 'original': ks1_x1.pk, + 'substitution': ks2_s1.pk, + 'transfer_term': False + }, + { + 'original': ks2_x1.pk, + 'substitution': ks1_s1.pk, + 'transfer_term': True + } + ] + } + response = self.execute(data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + result = {item['alias']: item for item in response.data['items']} + self.assertEqual(len(result), 6) + self.assertEqual(result['X2']['term_raw'], ks1_x2.term_raw) + self.assertEqual(result['X4']['term_raw'], ks2_x2.term_raw) + self.assertEqual(result['S1']['term_raw'], ks2_x1.term_raw) + self.assertEqual(result['S2']['term_raw'], ks2_s1.term_raw) + self.assertEqual(result['S1']['definition_formal'], 'X2') + self.assertEqual(result['S2']['definition_formal'], 'X4×X4') + self.assertEqual(result['D1']['definition_formal'], 'S1\S2\X2') + self.assertEqual(result['D2']['definition_formal'], 'S2\S1\X4') diff --git a/rsconcept/backend/apps/rsform/views/operations.py b/rsconcept/backend/apps/rsform/views/operations.py index 34ae2542..74db122a 100644 --- a/rsconcept/backend/apps/rsform/views/operations.py +++ b/rsconcept/backend/apps/rsform/views/operations.py @@ -39,7 +39,7 @@ def inline_synthesis(request: Request): else: index = next(i for (i, cst) in enumerate(items) if cst == replacement) replacement = new_items[index] - schema.substitute(original, replacement, serializer.validated_data['transfer_term']) + schema.substitute(original, replacement, substitution['transfer_term']) return Response( status=c.HTTP_200_OK, data=s.RSFormParseSerializer(schema.item).data