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

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

View File

@ -1,161 +1,88 @@
import pytest import pytest
from django.test import TestCase
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from access.serializers.entity_person import (
Person,
ModelSerializer
)
from access.tests.functional.entity.test_functional_entity_serializer import ( from access.tests.functional.entity.test_functional_entity_serializer import (
MockView,
EntitySerializerInheritedCases EntitySerializerInheritedCases
) )
class SerializerTestCases( class PersonSerializerTestCases(
EntitySerializerInheritedCases, EntitySerializerInheritedCases
): ):
create_model_serializer = ModelSerializer
"""Serializer to test"""
duplicate_f_name_l_name_dob: dict = { parameterized_test_data: dict = {
'f_name': 'fred', "model_notes": {
'm_name': 'D', 'will_create': True,
'l_name': 'Flinstone', },
'dob': '2025-04-08', "f_name": {
'will_create': False,
'exception_key': 'required'
},
"m_name": {
'will_create': True,
},
"l_name": {
'will_create': False,
'exception_key': 'required'
},
"dob": {
'will_create': True,
}
} }
kwargs_create_item_duplicate_f_name_l_name_dob: dict = { valid_data: dict = {
'f_name': 'fred',
'm_name': 'D',
'l_name': 'Flinstone',
'dob': '2025-04-08',
}
kwargs_create_item: dict = {
'f_name': 'Ian', 'f_name': 'Ian',
'm_name': 'Peter', 'm_name': 'Peter',
'l_name': 'Funny', 'l_name': 'Funny',
'dob': '2025-04-08', 'dob': '2025-04-08',
} }
"""Valid data used by serializer to create object"""
model = Person
"""Model to test"""
valid_data: dict = {
'f_name': 'Ian',
'm_name': 'Peter',
'l_name': 'Strange',
'dob': '2025-04-08',
}
def test_serializer_validation_duplicate_f_name_l_name_dob(self, model, create_serializer):
def test_serializer_validation_no_f_name_exception(self):
"""Serializer Validation Check
Ensure that when creating with valid data and field f_name is missing
a validation error occurs.
"""
data = self.valid_data.copy()
del data['f_name']
with pytest.raises(ValidationError) as err:
serializer = self.create_model_serializer(
data = data
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['f_name'][0] == 'required'
def test_serializer_validation_no_m_name(self):
"""Serializer Validation Check
Ensure that when creating with valid data and field f_name is missing
no validation error occurs.
"""
data = self.valid_data.copy()
del data['m_name']
serializer = self.create_model_serializer(
data = data
)
assert serializer.is_valid(raise_exception = True)
def test_serializer_validation_no_l_name_exception(self):
"""Serializer Validation Check
Ensure that when creating with valid data and field l_name is missing
a validation error occurs.
"""
data = self.valid_data.copy()
del data['l_name']
with pytest.raises(ValidationError) as err:
serializer = self.create_model_serializer(
data = data
)
serializer.is_valid(raise_exception = True)
assert err.value.get_codes()['l_name'][0] == 'required'
def test_serializer_validation_no_dob(self):
"""Serializer Validation Check
Ensure that when creating with valid data and field dob is missing
no validation error occurs.
"""
data = self.valid_data.copy()
del data['dob']
serializer = self.create_model_serializer(
data = data
)
assert serializer.is_valid(raise_exception = True)
def test_serializer_validation_duplicate_f_name_l_name_dob(self):
"""Serializer Validation Check """Serializer Validation Check
Ensure that when creating with valid data and fields f_name, l_name and Ensure that when creating with valid data and fields f_name, l_name and
dob already exists in the db a validation error occurs. dob already exists in the db a validation error occurs.
""" """
self.model.objects.create( valid_data = self.valid_data.copy()
organization = self.organization,
**self.kwargs_create_item_duplicate_f_name_l_name_dob valid_data['f_name'] = 'duplicate'
valid_data['organization'] = self.organization
obj = model.objects.create(
**valid_data
) )
data = self.duplicate_f_name_l_name_dob.copy() valid_data['organization'] = self.organization.id
if 'email' in valid_data: # Contact Entity
valid_data['email'] = 'abc@xyz.qwe'
if 'name' in valid_data: # Company Entity
valid_data['name'] = 'diff'
if 'employee_number' in valid_data: # Employee Entity
valid_data['employee_number'] = 13579
view_set = MockView()
with pytest.raises(ValidationError) as err: with pytest.raises(ValidationError) as err:
serializer = self.create_model_serializer( serializer = create_serializer(
data = data context = {
'view': view_set,
},
data = valid_data
) )
serializer.is_valid(raise_exception = True) serializer.is_valid(raise_exception = True)
@ -167,64 +94,18 @@ class SerializerTestCases(
class PersonSerializerInheritedCases( class PersonSerializerInheritedCases(
SerializerTestCases, PersonSerializerTestCases,
): ):
create_model_serializer = None parameterized_test_data: dict = None
"""Serializer to test"""
duplicate_f_name_l_name_dob: dict = None
""" Duplicate model serializer dict
used for testing for duplicate f_name, l_name and dob fields.
"""
kwargs_create_item: dict = None
""" Model kwargs to create item"""
kwargs_create_item_duplicate_f_name_l_name_dob: dict = None
"""model kwargs to create object
**None:** Ensure that the fields of sub-model to person do not match
`self.duplicate_f_name_l_name_dob`. if they do the wrong exception will be thrown.
used for testing for duplicate f_name, l_name and dob fields.
"""
model = None
"""Model to test"""
valid_data: dict = None valid_data: dict = None
"""Valid data used by serializer to create object""" """Valid data used by serializer to create object"""
@classmethod
def setUpTestData(self):
"""Setup Test"""
self.duplicate_f_name_l_name_dob.update( class PersonSerializerPyTest(
super().duplicate_f_name_l_name_dob PersonSerializerTestCases,
)
self.kwargs_create_item_duplicate_f_name_l_name_dob.update(
super().kwargs_create_item_duplicate_f_name_l_name_dob
)
self.kwargs_create_item.update(
super().kwargs_create_item
)
self.valid_data.update(
super().valid_data
)
super().setUpTestData()
class PersonSerializerTest(
SerializerTestCases,
TestCase,
): ):
pass parameterized_test_data: dict = None