lostplaces-backend/lostplaces/lostplaces_app/tests/models/__init__.py

175 lines
6.0 KiB
Python
Raw Normal View History

2020-09-03 22:22:04 +02:00
from django.db import models
2020-09-11 23:07:19 +02:00
from django.contrib.auth.models import User
2020-09-11 12:08:15 +02:00
from django.core.exceptions import FieldDoesNotExist
from django.test import TestCase
2020-09-03 22:22:04 +02:00
2020-09-11 23:07:19 +02:00
# Creating a test user
2020-09-11 12:08:15 +02:00
class ModelTestCase:
2020-09-03 22:22:04 +02:00
'''
Base class for Lostplaces models
'''
2020-09-11 23:07:19 +02:00
model = None
2020-09-03 22:22:04 +02:00
model_name = None
2020-09-11 23:07:19 +02:00
def setUp(self):
self.object = self.model.objects.get(id=1)
self.model_name = type(self.model).__name__
2020-09-11 12:08:15 +02:00
def _test_field(self, field_name, field_class, must_have={}, must_not_have={}):
2020-09-03 22:22:04 +02:00
'''
Tests if a field exists under the given name and
2020-09-11 12:08:15 +02:00
if the field is of the right type.
Also checks if the field has the given must_have attributes
and does not have any of the must_not_have attributes. If you
dont care about the value of the attribute you can just set it to
something that fullfills value == False (i.e. '' or 0)
2020-09-03 22:22:04 +02:00
'''
2020-09-11 12:08:15 +02:00
try:
field = self.object._meta.get_field(field_name)
except FieldDoesNotExist:
self.fail(
'Expecting %s to have a field named \'%s\'' % (
self.model_name,
field_name
)
2020-09-03 22:22:04 +02:00
)
self.assertEqual(
2020-09-11 12:08:15 +02:00
type(field), field_class,
msg='Expecting type of %s.%s to be %s' % (
2020-09-03 22:22:04 +02:00
self.model_name,
2020-09-11 12:08:15 +02:00
field_name,
field_class.__name__
2020-09-03 22:22:04 +02:00
)
)
2020-09-11 12:08:15 +02:00
for key, value in must_have.items():
if value:
self.assertEqual(getattr(field, key), value,
msg='Expeting %s.%s.%s to be \'%s\'' % (
self.model_name,
field_name,
key,
value
)
)
else:
self.assertTrue(hasattr(field, key),
msg='Expeting %s.%s to have \'%s\'' % (
self.model_name,
field_name,
key
)
)
2020-09-03 22:22:04 +02:00
2020-09-11 12:08:15 +02:00
for key, value in must_not_have.items():
if value:
self.assertTrue(getattr(field, key) != value,
msg='Expeting %s.%s.%s to not be \'%s\'' % (
self.model_name,
field_name,
key,
value
)
)
else:
self.assertFalse(hasattr(field, value),
msg='Expeting %s.%s to not have \'%s\'' % (
self.model_name,
field_name,
key
)
)
return field
def _test_char_field(self, field_name, min_length, max_length, must_have={}, must_hot_have={}):
2020-09-03 22:22:04 +02:00
'''
Tests if the given field is a char field and if its max_length
is in min_length and max_legth
'''
2020-09-11 12:08:15 +02:00
field = self._test_field(
field_name, models.CharField, must_have, must_hot_have)
2020-09-03 22:22:04 +02:00
self.assertTrue(
field.max_length in range(min_length, max_length),
2020-09-11 12:08:15 +02:00
msg='Expeting %s.%s field max_length to be in the range of %d and %d' % (
2020-09-03 22:22:04 +02:00
self.model_name,
field_name,
min_length,
max_length
2020-09-11 12:08:15 +02:00
)
2020-09-03 22:22:04 +02:00
)
2020-09-11 12:08:15 +02:00
def _test_float_field(self, field_name, min_value=None, max_value=None, must_have={}, must_hot_have={}):
2020-09-03 22:22:04 +02:00
'''
Tests if the field is a floatfield. If min_value and/or max_value are passed,
the validators of the field are also checked. The validator list of the field should
look like
[MinValueValidator, MayValueValidator], if both values are passed,
[MinValueValidator] if only min_value is passed,
[MaxValueValidator] if only max_value is passed
'''
2020-09-11 12:08:15 +02:00
field = self._test_field(
field_name, models.FloatField, must_have, must_hot_have)
2020-09-03 22:22:04 +02:00
if min_value:
self.assertTrue(
len(field.validators) >= 1,
2020-09-11 12:08:15 +02:00
msg='Expecting the first valiator of %s.%s to check the minimum' % (
2020-09-03 22:22:04 +02:00
self.model_name,
field_name
)
2020-09-11 12:08:15 +02:00
)
2020-09-03 22:22:04 +02:00
self.assertEqual(
field.validators[0].limit_value,
min_value,
2020-09-11 12:08:15 +02:00
msg='Expecting the min value of %s.%s min to be at least %d' % (
2020-09-03 22:22:04 +02:00
self.model_name,
2020-09-11 12:08:15 +02:00
field_name,
min_value
2020-09-03 22:22:04 +02:00
)
)
if max_value:
index = 0
if min_value:
index += 1
self.assertTrue(
len(field.validators) >= index+1,
2020-09-11 12:08:15 +02:00
msg='Expecting the second valiator of %s.%s to check the maximum' % (
2020-09-03 22:22:04 +02:00
self.model_name,
field_name
2020-09-11 12:08:15 +02:00
)
2020-09-03 22:22:04 +02:00
)
self.assertEqual(
field.validators[1].limit_value,
max_value,
2020-09-11 12:08:15 +02:00
msg='Expecting the max value of %s.%s min to be at most %d' % (
2020-09-03 22:22:04 +02:00
self.model_name,
2020-09-11 12:08:15 +02:00
field_name,
max_value
2020-09-03 22:22:04 +02:00
)
)
2020-09-11 12:08:15 +02:00
class SubmittableTestCase(ModelTestCase):
model_name = '<Class>'
2020-09-03 22:22:04 +02:00
related_name = None
nullable = False
def test_submitted_when(self):
2020-09-11 12:08:15 +02:00
submitted_when = self._test_field(
'submitted_when',
models.DateTimeField,
must_have={'auto_now_add': True}
2020-09-03 22:22:04 +02:00
)
def test_submitted_by(self):
2020-09-11 12:08:15 +02:00
submitted_by = self._test_field('submitted_by', models.ForeignKey)
2020-09-03 22:22:04 +02:00
if self.related_name:
2020-09-11 12:08:15 +02:00
self.assertEqual(
submitted_by.remote_field.related_name, self.related_name)
2020-09-03 22:22:04 +02:00
if self.nullable:
self.assertTrue(submitted_by.null,)
self.assertTrue(submitted_by.blank)
2020-09-11 12:08:15 +02:00
self.assertEqual(
submitted_by.remote_field.on_delete, models.SET_NULL)