Skip to content
Snippets Groups Projects
Commit a7ffb4bc authored by florimondmanca's avatar florimondmanca
Browse files

add last tests to registration API, fix bugs in test code

parent f5fa03c5
No related branches found
No related tags found
No related merge requests found
...@@ -13,3 +13,16 @@ class DocumentFactory(factory.DjangoModelFactory): ...@@ -13,3 +13,16 @@ class DocumentFactory(factory.DjangoModelFactory):
title = factory.Faker('sentence', locale='fr') title = factory.Faker('sentence', locale='fr')
content = factory.Faker('text', max_nb_chars=1000, locale='fr') content = factory.Faker('text', max_nb_chars=1000, locale='fr')
class AddressFactory(factory.DjangoModelFactory):
"""Address object factory."""
class Meta: # noqa
model = models.Address
line1 = factory.Faker('street_address', locale='fr')
# line2: None (default)
post_code = factory.Faker('postcode', locale='fr')
city = factory.Faker('city', locale='fr')
# country: None (default)
...@@ -5,6 +5,7 @@ import factory.django ...@@ -5,6 +5,7 @@ import factory.django
from utils import printable_only from utils import printable_only
from core.factory import AddressFactory
from . import models from . import models
...@@ -26,3 +27,4 @@ class RegistrationFactory(factory.DjangoModelFactory): ...@@ -26,3 +27,4 @@ class RegistrationFactory(factory.DjangoModelFactory):
phone = factory.Faker('phone_number') phone = factory.Faker('phone_number')
date_of_birth = factory.Faker('past_date', start_date='-20y') date_of_birth = factory.Faker('past_date', start_date='-20y')
address = factory.SubFactory(AddressFactory)
...@@ -24,9 +24,10 @@ class RegistrationSerializer(serializers.ModelSerializer): ...@@ -24,9 +24,10 @@ class RegistrationSerializer(serializers.ModelSerializer):
def create(self, validated_data): def create(self, validated_data):
"""Override for writable nested address field.""" """Override for writable nested address field."""
address_data: dict = validated_data.pop('address', None)
registration = Registration.objects.create(**validated_data) registration = Registration.objects.create(**validated_data)
address_data: dict = validated_data.pop('address', None)
if address_data: if address_data:
address = Address.objects.create(**address_data) address = Address.objects.create(**address_data)
registration.address = address registration.address = address
......
...@@ -28,8 +28,19 @@ class CategoryFactory(factory.DjangoModelFactory): ...@@ -28,8 +28,19 @@ class CategoryFactory(factory.DjangoModelFactory):
class Meta: # noqa class Meta: # noqa
model = models.Category model = models.Category
exclude = ('_title',)
title = factory.Faker('word') _title = factory.Faker('word')
@factory.lazy_attribute
def title(self):
"""Category title is subject to a unique constraint.
Add a random number if the fake title already exists.
"""
if models.Category.objects.filter(title=self._title).exists():
return self._title + str(random.randint(0, 100))
return self._title
class TestimonyFactory(factory.DjangoModelFactory): class TestimonyFactory(factory.DjangoModelFactory):
......
"""Address API tests."""
from django.test import TestCase
from core.factory import AddressFactory
from core.serializers import AddressSerializer
from tests.utils import SerializerTestCaseMixin
class TestArticleSerializer(SerializerTestCaseMixin, TestCase):
"""Test the Article serializer."""
serializer_class = AddressSerializer
factory_class = AddressFactory
expected_fields = (
'line1', 'line2', 'post_code', 'city',
{'country': ('name', 'code')},
)
"""Address model tests."""
from core.models import Address
from core.factory import AddressFactory
from tests.utils import ModelTestCase
class ArticleTest(ModelTestCase):
"""Test the Article model."""
model = Address
field_tests = {
'line1': {
'verbose_name': 'ligne 1',
'blank': False,
'max_length': 300,
},
'line2': {
'verbose_name': 'ligne 2',
'max_length': 300,
'blank': True,
'default': '',
},
'post_code': {
'verbose_name': 'code postal',
'blank': False,
'max_length': 20,
},
'city': {
'verbose_name': 'ville',
'blank': False,
'max_length': 100,
},
'country': {
'verbose_name': 'pays',
'blank': False,
'default': 'FR',
},
}
model_tests = {
'verbose_name': 'adresse',
}
@classmethod
def setUpTestData(cls):
cls.obj = AddressFactory.create(
line1='3 Rue Joliot Curie',
post_code='91190',
city='Gif-sur-Yvette',
)
def test_str(self):
expected = '3 Rue Joliot Curie, 91190 Gif-sur-Yvette, France'
self.assertEqual(expected, str(self.obj))
"""Document model tests.""" """Document model tests."""
from django.test import TestCase
from core.models import Document from core.models import Document
from core.factory import DocumentFactory from core.factory import DocumentFactory
from tests.utils import ModelTestCase from tests.utils import ModelTestCase
......
...@@ -155,4 +155,15 @@ class SerializerTestCaseMixin: ...@@ -155,4 +155,15 @@ class SerializerTestCaseMixin:
def test_contains_expected_fields(self): def test_contains_expected_fields(self):
data = self.serializer.data data = self.serializer.data
self.assertEqual(set(data), set(self.expected_fields))
# test nested fields passed as {'<name>': (<f1>, <f2>, ...)}
for field in self.expected_fields:
if isinstance(field, dict):
name, fields = list(field.items())[0]
data_fields = data.pop(name)
self.assertEqual(set(data_fields), set(fields))
# test non-nested fields
not_nested = (field for field in self.expected_fields
if not isinstance(field, dict))
self.assertEqual(set(data), set(not_nested))
...@@ -51,6 +51,9 @@ def group_exists(group_name): ...@@ -51,6 +51,9 @@ def group_exists(group_name):
return Group.objects.filter(name=group_name).exists() return Group.objects.filter(name=group_name).exists()
def printable_only(s): def printable_only(s, with_spaces=False):
"""Remove non-printable characters from a string.""" """Remove non-printable characters from a string."""
return ''.join(c for c in filter(lambda x: x in printable, s)) filtered = ''.join(c for c in filter(lambda x: x in printable, s))
if not with_spaces:
return filtered.replace(' ', '')
return filtered
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment