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

improve tests

parent 229b01e3
Branches
No related tags found
No related merge requests found
......@@ -17,7 +17,8 @@ class StudentReadTest(AuthAPITestMixin, APIReadTestMixin, APITestCase):
factory = StudentFactory
list_url = '/api/students/'
retrieve_url_format = '/api/students/{obj.pk}/'
data_content_keys = ('user', 'address', 'tutoring_group', 'school', 'url')
data_content_keys = ('user_id', 'user', 'address', 'tutoring_group',
'school', 'url')
@classmethod
def get_user(cls):
......
......@@ -17,7 +17,8 @@ class TutorReadTest(AuthAPITestMixin, APIReadTestMixin,
factory = TutorFactory
list_url = '/api/tutors/'
retrieve_url = '/api/tutors/{obj.pk}/'
data_content_keys = ('user', 'promotion', 'tutoring_groups', 'url',)
data_content_keys = ('user_id', 'user', 'promotion', 'tutoring_groups',
'url',)
@classmethod
def get_user(cls):
......
"""Users API tests."""
from datetime import date
from django.utils.formats import date_format
from django.template.defaulttags import date
from django.contrib.auth import get_user_model
from rest_framework import status
from rest_framework.test import APITestCase
from users.models import Student
from tests.utils import random_email
from tests.utils import ModelAPITestCase
from tests.factory import UserFactory
from tests.utils import AuthAPITestMixin
from tests.utils import APIPostRequestTestMixin
from tests.utils import APIReadTestMixin
User = get_user_model()
class UserAPITest(ModelAPITestCase):
"""Test the users API."""
class UserReadTest(AuthAPITestMixin, APIReadTestMixin, APITestCase):
"""Test authenticated users can read users."""
model = User
factory = UserFactory
list_url = '/api/users/'
retrieve_url_format = '/api/users/{obj.pk}/'
data_content_keys = (
'id', 'url', 'first_name', 'last_name', 'email', 'date_of_birth',
'phone_number', 'gender', 'profile',
)
def create_data(self):
data = {
'email': random_email(),
'first_name': 'John',
'last_name': 'Doe',
'phone_number': '0601020304',
'date_of_birth': date(2000, 1, 1),
'profile_type': 'student',
}
return data
def test_list(self):
n_items = 5
for _ in range(n_items):
self.create_obj()
url = '/api/users/'
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), n_items)
@classmethod
def get_user(cls):
return UserFactory.create()
def test_retrieve(self):
obj = self.create_obj()
url = f'/api/users/{obj.pk}/'
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_data_has_expected_values(self):
obj = self.create_obj()
url = f'/api/users/{obj.pk}/'
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
keys = (
'id',
'url',
'email',
'first_name',
'last_name',
'phone_number',
'date_of_birth',
'gender',
'profile',
)
for key in keys:
self.assertIn(key, response.data)
class UserCreateTest(APIPostRequestTestMixin, APITestCase):
"""Test anonymous user can create a user."""
def test_create(self):
url = '/api/users/'
data = {
'email': 'john.doe@example.net',
'password': 'hello25',
'first_name': 'john',
'last_name': 'doe',
'gender': User.MALE,
'phone_number': '0601020304',
'date_of_birth': '01/01/2000',
'profile_type': 'student',
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(User.objects.count(), 1)
user = User.objects.get()
self.assertIsInstance(user.profile, Student)
for key in data:
if key == 'password':
continue
elif key == 'date_of_birth':
date_of_birth = date_format(user.date_of_birth, 'd/m/Y')
self.assertEqual(date_of_birth, data['date_of_birth'])
continue
if key == 'profile_type':
continue
self.assertEqual(getattr(user, key), data[key])
def get_obj(self):
return UserFactory.build()
def get_post_data(self, obj):
return {
'email': obj.email,
'first_name': obj.first_name,
'last_name': obj.last_name,
'phone_number': obj.phone_number,
'date_of_birth': obj.date_of_birth.strftime('%d/%m/%Y'),
'gender': obj.gender,
'profile_type': obj.profile_type,
'password': 'secret',
}
......@@ -141,6 +141,3 @@ class UtilsImportsTest(TestCase):
def test_import_random_uai_code(self):
from tests.utils import random_uai_code
def test_import_api_utils(self):
from tests.utils import ModelAPITestCase
"""API test utilities."""
from rest_framework.test import APITestCase
from rest_framework import status
__all__ = ('ModelAPITestCase', 'AuthAPITestMixin', 'APIReadTestMixin',
'APIPostRequestTestMixin')
class ModelAPITestCase(APITestCase):
"""Generic model API test case."""
model = None
@property
def model_name(self):
return self.model._meta.model_name
@property
def model_name_plural(self):
return self.model_name + 's'
def create_data(self):
return {}
def create_obj(self, **kwargs):
create_data = self.create_data()
kwargs.update(create_data)
return self.model.objects.create(**kwargs)
__all__ = ('AuthAPITestMixin', 'APIReadTestMixin', 'APIPostRequestTestMixin')
class AuthAPITestMixin:
......@@ -97,15 +73,15 @@ class APIReadTestMixin:
def test_data_content(self):
"""Test the content of a retrieve action data.
Retrieves an object as in test_retrieve and checks that keys specified
in `data_content_keys` are contained in response.data.
Retrieves an object as in test_retrieve and checks that the set of
keys specified in `data_content_keys` equals the keys of the
response data.
"""
obj = self.factory.create()
url = obj.get_absolute_url()
response = self.client.get(url)
keys = self.data_content_keys
for key in keys:
self.assertIn(key, response.data)
self.assertEqual(
set(self.data_content_keys), set(response.data.keys()))
class APIRequestTestMixin:
......@@ -136,4 +112,5 @@ class APIPostRequestTestMixin(APIRequestTestMixin):
obj = self.get_obj()
data = self.get_post_data(obj)
response = self.client.post(self.url, data, format='json')
self.assertEqual(response.status_code, self.expected_status_code)
self.assertEqual(response.status_code, self.expected_status_code,
response.data)
......@@ -87,7 +87,7 @@ class User(AbstractUser):
# TODO add a proper phone number validator
phone_number = models.CharField('téléphone',
max_length=12, null=True, blank=True)
max_length=20, null=True, blank=True)
# type of profile of the user
# allows to access the Profile object through user.profile
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment