Compare commits

..

No commits in common. "e655e1598abd3df50d85c973d41e4d79351eee46" and "6e6f4ced7bd21b24fffc728a9bafaf99dccc5ed1" have entirely different histories.

7 changed files with 67 additions and 242 deletions

View File

@ -11,7 +11,6 @@ pipenv = "*"
wheel = "*" wheel = "*"
twine = "*" twine = "*"
pandoc ="*" pandoc ="*"
pylint-django ="*"
[packages] [packages]
django = "*" django = "*"

View File

@ -1,91 +1,50 @@
from django.db import models from django.db import models
from django.core.exceptions import FieldDoesNotExist
from django.test import TestCase
class TestModel:
class ModelTestCase:
''' '''
Base class for Lostplaces models Base class for Lostplaces models
''' '''
model_name = None model_name = None
def _test_field(self, field_name, field_class, must_have={}, must_not_have={}): def _test_field(self, field_name, field_class):
''' '''
Tests if a field exists under the given name and Tests if a field exists under the given name and
if the field is of the right type. 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)
''' '''
try:
field = self.object._meta.get_field(field_name) field = self.object._meta.get_field(field_name)
except FieldDoesNotExist: self.assertTrue(
self.fail( field,
'Expecting %s to have a field named \'%s\'' % ( msg="%s has no field named '%s'" % (
self.model_name, self.model_name,
field_name field_name
) )
) )
self.assertEqual( self.assertEqual(
type(field), field_class, type(field), field_class,
msg='Expecting type of %s.%s to be %s' % ( msg='%s.%s name field is no CharField' % (
self.model_name, self.model_name,
field_name, field_name
field_class.__name__
) )
) )
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
)
)
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 return field
def _test_char_field(self, field_name, min_length, max_length, must_have={}, must_hot_have={}):
def _test_char_field(self, field_name, min_length, max_length):
''' '''
Tests if the given field is a char field and if its max_length Tests if the given field is a char field and if its max_length
is in min_length and max_legth is in min_length and max_legth
''' '''
field = self._test_field( field = self._test_field(field_name, models.CharField)
field_name, models.CharField, must_have, must_hot_have) self.assertEqual(
type(field), models.CharField,
msg='%s.%s name field is no CharField' % (
self.model_name,
field_name
)
)
self.assertTrue( self.assertTrue(
field.max_length in range(min_length, max_length), field.max_length in range(min_length, max_length),
msg='Expeting %s.%s field max_length to be in the range of %d and %d' % ( msg='%s.%s field max_length not in range of %d and %d' % (
self.model_name, self.model_name,
field_name, field_name,
min_length, min_length,
@ -93,7 +52,7 @@ class ModelTestCase:
) )
) )
def _test_float_field(self, field_name, min_value=None, max_value=None, must_have={}, must_hot_have={}): def _test_float_field(self, field_name, min_value=None, max_value=None):
''' '''
Tests if the field is a floatfield. If min_value and/or max_value are passed, 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 the validators of the field are also checked. The validator list of the field should
@ -102,12 +61,11 @@ class ModelTestCase:
[MinValueValidator] if only min_value is passed, [MinValueValidator] if only min_value is passed,
[MaxValueValidator] if only max_value is passed [MaxValueValidator] if only max_value is passed
''' '''
field = self._test_field( field = self._test_field(field_name, models.FloatField)
field_name, models.FloatField, must_have, must_hot_have)
if min_value: if min_value:
self.assertTrue( self.assertTrue(
len(field.validators) >= 1, len(field.validators) >= 1,
msg='Expecting the first valiator of %s.%s to check the minimum' % ( msg='%s.%s first validator should check minimum' % (
self.model_name, self.model_name,
field_name field_name
) )
@ -115,10 +73,9 @@ class ModelTestCase:
self.assertEqual( self.assertEqual(
field.validators[0].limit_value, field.validators[0].limit_value,
min_value, min_value,
msg='Expecting the min value of %s.%s min to be at least %d' % ( msg='%s.%s min value missmatch' % (
self.model_name, self.model_name,
field_name, field_name
min_value
) )
) )
if max_value: if max_value:
@ -127,7 +84,7 @@ class ModelTestCase:
index += 1 index += 1
self.assertTrue( self.assertTrue(
len(field.validators) >= index+1, len(field.validators) >= index+1,
msg='Expecting the second valiator of %s.%s to check the maximum' % ( msg='%s.%s second validator should check maximum' % (
self.model_name, self.model_name,
field_name field_name
) )
@ -135,33 +92,30 @@ class ModelTestCase:
self.assertEqual( self.assertEqual(
field.validators[1].limit_value, field.validators[1].limit_value,
max_value, max_value,
msg='Expecting the max value of %s.%s min to be at most %d' % ( msg='%s.%s max value missmatch' % (
self.model_name, self.model_name,
field_name, field_name
max_value
) )
) )
class TestSubmittable(TestModel):
class SubmittableTestCase(ModelTestCase):
model_name='<Class>' model_name='<Class>'
related_name = None related_name = None
nullable = False nullable = False
def test_submitted_when(self): def test_submitted_when(self):
submitted_when = self._test_field( submitted_when = self._test_field('submitted_when', models.DateTimeField)
'submitted_when', self.assertTrue(submitted_when.auto_now_add,
models.DateTimeField, msg='%s.submitted_when should be auto_now_add' % (
must_have={'auto_now_add': True} self.model_name
)
) )
def test_submitted_by(self): def test_submitted_by(self):
submitted_by = self._test_field('submitted_by',models.ForeignKey) submitted_by = self._test_field('submitted_by',models.ForeignKey)
if self.related_name: if self.related_name:
self.assertEqual( self.assertEqual(submitted_by.remote_field.related_name, self.related_name)
submitted_by.remote_field.related_name, self.related_name)
if self.nullable: if self.nullable:
self.assertTrue(submitted_by.null,) self.assertTrue(submitted_by.null,)
self.assertTrue(submitted_by.blank) self.assertTrue(submitted_by.blank)
self.assertEqual( self.assertEqual(submitted_by.remote_field.on_delete, models.SET_NULL)
submitted_by.remote_field.on_delete, models.SET_NULL)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

View File

@ -1,55 +0,0 @@
from django.test import TestCase
from django.db import models
from django.contrib.auth.models import User
from lostplaces_app.models import Explorer
from lostplaces_app.tests import mock_user
class ExplorerTestCase(TestCase):
def setUp(self):
mock_user()
def test_epxlorer_creation(self):
'''
Tests if the explorer profile will be automticly
created when a user is created
'''
user = User.objects.get(id=1)
explorer_list = Explorer.objects.all()
self.assertTrue(len(explorer_list) > 0,
msg='Expecting at least one Exlorer object, none found'
)
self.assertTrue(hasattr(user, 'explorer'),
msg='''Expecting the User instance to have an \'explorer\' attribute.
Check the Explorer model and the related name.'''
)
explorer = Explorer.objects.get(id=1)
self.assertEqual(explorer, user.explorer,
msg='''The Explorer object of the User did not match.
Expecting User with id 1 to have Explorer with id 1'''
)
explorer = Explorer.objects.get(id=1)
self.assertEqual(explorer.user, user,
msg='''The User object of the Explorer did not match.
Expecting Explorer with id 1 to have User with id 1'''
)
def test_explorer_deletion(self):
'''
Tests if the Explorer objects get's deleted when the User instance is deleted
'''
user = User.objects.get(id=1)
explorer_id = user.explorer.id
user.delete()
with self.assertRaises(models.ObjectDoesNotExist,
msg='Expecting explorer objec to be deleted when the corresponding User object is deleted'
):
Explorer.objects.get(id=explorer_id)

View File

@ -1,39 +1,28 @@
import datetime import datetime
import os
import shutil
from unittest import mock from unittest import mock
from django.test import TestCase from django.test import TestCase
from django.db import models from django.db import models
from django.core.files import File from django.core.files import File
from django.conf import settings
from lostplaces_app.models import PlaceImage from lostplaces_app.models import PlaceImage
from lostplaces_app.tests.models import SubmittableTestCase from lostplaces_app.tests.models import TestSubmittable
from lostplaces_app.tests import mock_user from lostplaces_app.tests import mock_user
from lostplaces_app.tests.models import TestModel
from lostplaces_app.tests.models.test_place_model import mock_place from lostplaces_app.tests.models.test_place_model import mock_place
from easy_thumbnails.fields import ThumbnailerImageField from easy_thumbnails.fields import ThumbnailerImageField
def mock_place_image(): def mock_place_image():
all_place_images = PlaceImage.objects.all() return PlaceImage(
if len(all_place_images) <= 0:
current_dir = os.path.dirname(os.path.abspath(__file__))
if not os.path.isfile(os.path.join(settings.MEDIA_ROOT, 'im_a_image_copy.jpeg')):
shutil.copyfile(
os.path.join(current_dir, 'im_a_image.jpeg'),
os.path.join(settings.MEDIA_ROOT, 'im_a_image_copy.jpeg')
)
return PlaceImage.objects.create(
description='Im a description', description='Im a description',
filename=os.path.join(settings.MEDIA_ROOT, 'im_a_image_copy.jpeg'), filename=mock.MagicMock(spec=File, name='FileMock'),
place=mock_place(), place=mock_place(),
submitted_when=datetime.datetime.now(), submitted_when=datetime.datetime.now(),
submitted_by=mock_user().explorer submitted_by=mock_user().explorer
) )
return all_place_images[0]
class TestPlaceImage(SubmittableTestCase, TestCase): class TestPlaceImage(TestSubmittable, TestCase):
model_name = 'PlaceImage' model_name = 'PlaceImage'
def setUp(self): def setUp(self):
@ -62,18 +51,5 @@ class TestPlaceImage(SubmittableTestCase, TestCase):
) )
def test_str(self): def test_str(self):
place_image = self.object place_image = mock_place_image()
self.assertTrue(place_image.place.name.lower() in str(place_image).lower(), self.assertEqual(str(place_image), ' '.join([place_image.place.name, str(place_image.pk)]))
msg='Expecting %s.__str__ to contain the name of the place' % (
self.model_name
)
)
def test_deletion(self):
# TODO
path = self.object.filename.path
self.object.delete()
self.assertFalse(
os.path.isfile(path),
msg='Expecting the file of an place_image to be deleteed when an place_image is deleted'
)

View File

@ -4,8 +4,9 @@ from django.test import TestCase
from django.db import models from django.db import models
from lostplaces_app.models import Place from lostplaces_app.models import Place
from lostplaces_app.tests.models import SubmittableTestCase from lostplaces_app.tests.models import TestSubmittable
from lostplaces_app.tests import mock_user from lostplaces_app.tests import mock_user
from lostplaces_app.tests.models import TestModel
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
@ -23,7 +24,7 @@ def mock_place():
return place return place
class PlaceTestCase(SubmittableTestCase, TestCase): class PlaceTestCase(TestSubmittable, TestCase):
model_name = 'Place' model_name = 'Place'
related_name = 'places' related_name = 'places'
nullable = True nullable = True
@ -126,9 +127,10 @@ class PlaceTestCase(SubmittableTestCase, TestCase):
) )
def test_str(self): def test_str(self):
place = self.object place = mock_place()
self.assertTrue(place.name.lower() in str(place).lower(), self.assertEqual(str(place), place.name,
msg='Expecting %s.__str__ to contain the name' % ( msg='%s __str__ should return the name' % (
self.model_name self.model_name
) )
) )

View File

@ -1,51 +0,0 @@
import datetime
from django.test import TestCase
from django.db import models
from lostplaces_app.models import Voucher
from lostplaces_app.tests.models import ModelTestCase
def mock_voucher():
return Voucher.objects.create(
code='ayDraJCCwfhcFiYmSR5GrcjcchDfcahv',
expires=datetime.datetime.now() + datetime.timedelta(days=1)
)
class VoucheTestCase(ModelTestCase, TestCase):
model_name = 'Voucher'
def setUp(self):
self.object = mock_voucher()
def test_voucher_code(self):
self._test_char_field(
'code',
10,
100,
must_have={'unique': True}
)
def test_voucher_created(self):
self._test_field(
'created_when',
models.DateTimeField,
must_have={'auto_now_add': True}
)
def test_voucher_expires(self):
self._test_field(
'expires_when',
models.DateTimeField,
must_not_have={'auto_now_add': True}
)
def test_str(self):
voucher = self.object
self.assertTrue(voucher.code.lower() in str(voucher).lower(),
msg='Expecting %s.__str__ to contain the voucher code' % (
self.model_name
)
)