refactor(Access): Update Functional Serializer to use PyTest for Entity Model
ref: #761 #730
This commit is contained in:
@ -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
|
||||||
|
Reference in New Issue
Block a user