Add ModelTestCase to tests

This commit is contained in:
Ciro Monteiro 2021-11-13 23:25:43 -03:00
parent 060a3b632f
commit 8d99a4da51
2 changed files with 70 additions and 3 deletions

View File

@ -14,6 +14,7 @@ from django.test.client import RequestFactory as DjangoRequestFactory
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from django.utils.http import urlencode from django.utils.http import urlencode
from rest_framework import status
from rest_framework.compat import coreapi, requests from rest_framework.compat import coreapi, requests
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
@ -410,3 +411,44 @@ class URLPatternsTestCase(testcases.SimpleTestCase):
cls._module.urlpatterns = cls._module_urlpatterns cls._module.urlpatterns = cls._module_urlpatterns
else: else:
del cls._module.urlpatterns del cls._module.urlpatterns
class ModelTestCase(APITestCase):
model = None
def __model_fields(self):
return [field.name for field in self.model._meta.local_fields[1:]]
def __get_field_cases(self):
fields = self.__model_fields()
field_cases = {}
for field_name in fields:
try:
field_value = getattr(self, field_name) # must be an array
except:
raise AttributeError(f"TestCase doesn't have attribute '{field_name}'.")
field_cases[field_name] = field_value
return field_cases
def __cases(self):
fields = self.__model_fields()
field_cases = self.__get_field_cases()
cases = [{}]
for field_name in fields:
cases_updated = []
for case in cases:
for field_case in field_cases[field_name]:
cases_updated.append({ **case, field_name: field_case })
cases = cases_updated[:]
return cases
def test_post(self):
if self.model == None:
return
cases = self.__cases()
for case in cases:
response = self.client.post(self.url, case, format='json')
response.data.pop('id')
self.assertEqual(case, response.data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

View File

@ -1,16 +1,17 @@
from io import BytesIO from io import BytesIO
import django import django
from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.shortcuts import redirect from django.shortcuts import redirect
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from django.urls import path from django.urls import path
from rest_framework import fields, serializers from rest_framework import fields, serializers, viewsets
from rest_framework.decorators import api_view from rest_framework.decorators import api_view
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.test import ( from rest_framework.test import (
APIClient, APIRequestFactory, URLPatternsTestCase, force_authenticate APIClient, APIRequestFactory, URLPatternsTestCase, force_authenticate, ModelTestCase
) )
@ -47,11 +48,27 @@ def post_view(request):
return Response(serializer.validated_data) return Response(serializer.validated_data)
class Person(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.PositiveSmallIntegerField()
class PersonSerializer(serializers.ModelSerializer):
class Meta:
model = Person
fields = '__all__'
class PersonViewSet(viewsets.ModelViewSet):
queryset = Person.objects.all()
serializer_class = PersonSerializer
urlpatterns = [ urlpatterns = [
path('view/', view), path('view/', view),
path('session-view/', session_view), path('session-view/', session_view),
path('redirect-view/', redirect_view), path('redirect-view/', redirect_view),
path('post-view/', post_view) path('post-view/', post_view),
path('persons/', PersonViewSet.as_view({'post': 'create'}))
] ]
@ -319,3 +336,11 @@ class TestExistingPatterns(TestCase):
def test_urlpatterns(self): def test_urlpatterns(self):
# sanity test to ensure that this test module does not have a '/' route # sanity test to ensure that this test module does not have a '/' route
assert self.client.get('/').status_code == 404 assert self.client.get('/').status_code == 404
@override_settings(ROOT_URLCONF='tests.test_testing')
class TestModelTestCase(ModelTestCase):
model = Person
first_name = ["John", "Jane"]
last_name = ["Doe", "Roosevelt"]
age = [11, 23, 58, 13, 21]
url = "/persons/"