Add tests for InlineSynthesis backend

This commit is contained in:
IRBorisov 2024-03-23 21:24:51 +03:00
parent b549580452
commit 8bae771e29
4 changed files with 92 additions and 7 deletions

View File

@ -194,12 +194,15 @@ class RSFormParseSerializer(serializers.ModelSerializer):
return data return data
class CstSubstituteSerializer(serializers.Serializer): class CstSubstituteSerializerBase(serializers.Serializer):
''' Serializer: Constituenta substitution. ''' ''' Serializer: Basic substitution. '''
original = PKField(many=False, queryset=Constituenta.objects.all()) original = PKField(many=False, queryset=Constituenta.objects.all())
substitution = PKField(many=False, queryset=Constituenta.objects.all()) substitution = PKField(many=False, queryset=Constituenta.objects.all())
transfer_term = serializers.BooleanField(required=False, default=False) transfer_term = serializers.BooleanField(required=False, default=False)
class CstSubstituteSerializer(CstSubstituteSerializerBase):
''' Serializer: Constituenta substitution. '''
def validate(self, attrs): def validate(self, attrs):
schema = cast(LibraryItem, self.context['schema']) schema = cast(LibraryItem, self.context['schema'])
original_cst = cast(Constituenta, attrs['original']) original_cst = cast(Constituenta, attrs['original'])
@ -216,9 +219,6 @@ class CstSubstituteSerializer(serializers.Serializer):
raise serializers.ValidationError({ raise serializers.ValidationError({
'substitution': msg.constituentaNotOwned(schema.title) 'substitution': msg.constituentaNotOwned(schema.title)
}) })
attrs['original'] = original_cst
attrs['substitution'] = substitution_cst
attrs['transfer_term'] = self.initial_data['transfer_term']
return attrs return attrs
@ -295,7 +295,7 @@ class InlineSynthesisSerializer(serializers.Serializer):
source = PKField(many=False, queryset=LibraryItem.objects.all()) # type: ignore source = PKField(many=False, queryset=LibraryItem.objects.all()) # type: ignore
items = PKField(many=True, queryset=Constituenta.objects.all()) items = PKField(many=True, queryset=Constituenta.objects.all())
substitutions = serializers.ListField( substitutions = serializers.ListField(
child=CstSubstituteSerializer() child=CstSubstituteSerializerBase()
) )
def validate(self, attrs): def validate(self, attrs):

View File

@ -1,6 +1,7 @@
''' Tests for REST API. ''' ''' Tests for REST API. '''
from .t_library import * from .t_library import *
from .t_constituents import * from .t_constituents import *
from .t_operations import *
from .t_rsforms import * from .t_rsforms import *
from .t_versions import * from .t_versions import *

View File

@ -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')

View File

@ -39,7 +39,7 @@ def inline_synthesis(request: Request):
else: else:
index = next(i for (i, cst) in enumerate(items) if cst == replacement) index = next(i for (i, cst) in enumerate(items) if cst == replacement)
replacement = new_items[index] replacement = new_items[index]
schema.substitute(original, replacement, serializer.validated_data['transfer_term']) schema.substitute(original, replacement, substitution['transfer_term'])
return Response( return Response(
status=c.HTTP_200_OK, status=c.HTTP_200_OK,
data=s.RSFormParseSerializer(schema.item).data data=s.RSFormParseSerializer(schema.item).data