refactor(Access): Update Functional Serializer to use PyTest for Entity Model

ref: #761 #730
This commit is contained in:
2025-05-16 02:17:21 +09:30
parent 97e37f34a1
commit 254cd02649

View File

@ -1,94 +1,171 @@
import django
import pytest import pytest
from django.test import TestCase from rest_framework.exceptions import ValidationError
from access.models.tenant import Tenant as Organization User = django.contrib.auth.get_user_model()
from access.serializers.entity import (
Entity,
ModelSerializer
)
class SerializerTestCases: class MockView:
kwargs_create_item: dict = {} _has_import: bool = False
""" Model kwargs to create item""" """User Permission
model = Entity get_permission_required() sets this to `True` when user has import permission.
"""Model to test""" """
create_model_serializer = ModelSerializer _has_purge: bool = False
"""Serializer to test""" """User Permission
valid_data: dict = {} get_permission_required() sets this to `True` when user has purge permission.
"""
_has_triage: bool = False
"""User Permission
get_permission_required() sets this to `True` when user has triage permission.
"""
class EntitySerializerTestCases:
parameterized_test_data: dict = {
"model_notes": {
'will_create': True,
}
}
valid_data: dict = {
'model_notes': 'model notes field'
}
"""Valid data used by serializer to create object""" """Valid data used by serializer to create object"""
@classmethod
def setUpTestData(self):
"""Setup Test"""
self.organization = Organization.objects.create(name='test_org') @pytest.fixture( scope = 'class')
def setup_data(self,
request,
model,
django_db_blocker,
organization_one,
):
self.kwargs_create_item.update({ with django_db_blocker.unblock():
'model_notes': 'model notes field'
})
self.valid_data.update({ request.cls.organization = organization_one
'organization': self.organization.pk,
'model_notes': 'model notes field'
})
self.item = self.model.objects.create( valid_data = {}
organization = self.organization,
**self.kwargs_create_item, for base in reversed(request.cls.__mro__):
)
if hasattr(base, 'valid_data'):
if base.valid_data is None:
continue
valid_data.update(**base.valid_data)
if len(valid_data) > 0:
request.cls.valid_data = valid_data
if 'organization' not in request.cls.valid_data:
request.cls.valid_data.update({
'organization': request.cls.organization.pk
})
request.cls.view_user = User.objects.create_user(username="cafs_test_user_view", password="password")
yield
with django_db_blocker.unblock():
request.cls.view_user.delete()
del request.cls.valid_data
def test_serializer_valid_data(self): @pytest.fixture( scope = 'class', autouse = True)
def class_setup(self,
setup_data,
):
pass
def test_serializer_valid_data(self, create_serializer):
"""Serializer Validation Check """Serializer Validation Check
Ensure that when creating an object with valid data, no validation Ensure that when creating an object with valid data, no validation
error occurs. error occurs.
""" """
serializer = self.create_model_serializer( view_set = MockView()
serializer = create_serializer(
context = {
'view': view_set,
},
data = self.valid_data data = self.valid_data
) )
assert serializer.is_valid(raise_exception = True) assert serializer.is_valid(raise_exception = True)
def test_serializer_validation_no_model_notes(self):
def test_serializer_valid_data_missing_field_is_valid(self, parameterized, param_key_test_data,
create_serializer,
param_value,
param_will_create,
):
"""Serializer Validation Check """Serializer Validation Check
Ensure that if creating and no model_notes is provided no validation Ensure that when creating an object with a user with import permission
error occurs and with valid data, no validation error occurs.
""" """
data = self.valid_data.copy() valid_data = self.valid_data.copy()
del data['model_notes'] del valid_data[param_value]
serializer = self.create_model_serializer( view_set = MockView()
data = data
view_set._has_import = True
serializer = create_serializer(
context = {
'view': view_set,
},
data = valid_data
) )
assert serializer.is_valid(raise_exception = True) is_valid = serializer.is_valid(raise_exception = False)
assert (
(
not param_will_create
and param_will_create == is_valid
)
or param_will_create == is_valid
)
class EntitySerializerInheritedCases( class EntitySerializerInheritedCases(
SerializerTestCases, EntitySerializerTestCases,
): ):
create_model_serializer = None parameterized_test_data: dict = None
"""Serializer to test"""
kwargs_create_item: dict = None
""" Model kwargs to create item"""
model = None model = None
"""Model to test""" """Model to test"""
@ -97,10 +174,40 @@ class EntitySerializerInheritedCases(
"""Valid data used by serializer to create object""" """Valid data used by serializer to create object"""
def test_serializer_valid_data_missing_field_raises_exception(self, parameterized, param_key_test_data,
create_serializer,
param_value,
param_exception_key,
):
"""Serializer Validation Check
class EntitySerializerTest( Ensure that when creating an object with a user with import permission
SerializerTestCases, and with valid data, no validation error occurs.
TestCase, """
valid_data = self.valid_data.copy()
del valid_data[param_value]
view_set = MockView()
with pytest.raises(ValidationError) as err:
serializer = create_serializer(
context = {
'view': view_set,
},
data = valid_data
)
is_valid = serializer.is_valid(raise_exception = True)
assert err.value.get_codes()[param_value][0] == param_exception_key
class EntitySerializerPyTest(
EntitySerializerTestCases,
): ):
pass parameterized_test_data: dict = None