Compare commits

...

2 Commits

Author SHA1 Message Date
b3db6643b9 Refactoring 2020-09-13 19:43:47 +02:00
cea3a909b5 Using abstract modls 2020-09-13 19:29:30 +02:00
5 changed files with 63 additions and 64 deletions

View File

@ -109,19 +109,11 @@ class Voucher(models.Model):
return "Voucher " + str(self.code) return "Voucher " + str(self.code)
class Place(Taggable, MapablePoint): class Place(Submittable, Taggable, MapablePoint):
""" """
Place defines a lost place (location, name, description etc.). Place defines a lost place (location, name, description etc.).
""" """
submitted_when = models.DateTimeField(auto_now_add=True, null=True)
submitted_by = models.ForeignKey(
Explorer,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='places'
)
location = models.CharField(max_length=50) location = models.CharField(max_length=50)
description = models.TextField() description = models.TextField()
@ -157,7 +149,7 @@ def generate_image_upload_path(instance, filename):
return 'places/' + str(uuid.uuid4())+'.'+filename.split('.')[-1] return 'places/' + str(uuid.uuid4())+'.'+filename.split('.')[-1]
class PlaceImage (models.Model): class PlaceImage (Submittable):
""" """
PlaceImage defines an image file object that points to a file in uploads/. PlaceImage defines an image file object that points to a file in uploads/.
Intermediate image sizes are generated as defined in SIZES. Intermediate image sizes are generated as defined in SIZES.
@ -171,14 +163,6 @@ class PlaceImage (models.Model):
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='placeimages' related_name='placeimages'
) )
submitted_when = models.DateTimeField(auto_now_add=True, null=True)
submitted_by = models.ForeignKey(
Explorer,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='placeimages'
)
def __str__(self): def __str__(self):
""" """

View File

@ -84,7 +84,7 @@ class SubmittableTestCase(ModelTestCase):
) )
self.assertEqual( self.assertEqual(
submitted_by.remote_field.on_delete, submitted_by.remote_field.on_delete,
models.SET_NULL models.SET_NULL,
msg='Expecting %s to be null when reference is delete (models.SET_NULL)' % ( msg='Expecting %s to be null when reference is delete (models.SET_NULL)' % (
str(submitted_by) str(submitted_by)
) )

View File

@ -1,17 +1,14 @@
from django.test import Client from django.test import TestCase
class ViewTestCaseMixin: class ViewTestCase(TestCase):
''' '''
This is a mixni for testing views. It provides functionality to This is a mixni for testing views. It provides functionality to
test the context, forms and HTTP Response of responses. test the context, forms and HTTP Response of responses.
Also works with django's ReqeustFactory and provides a self.client All methods take responses, so this base class can be used
with django's RequestFactory and Test-Client
''' '''
view = None view = None
def setUp(self):
self.view_name = self.view.__name__
self.client = Client()
def assertContext(self, response, key, value=None): def assertContext(self, response, key, value=None):
''' '''
Checks weather the response's context has the given key Checks weather the response's context has the given key
@ -20,7 +17,7 @@ class ViewTestCaseMixin:
self.assertTrue( self.assertTrue(
key in response.context, key in response.context,
msg='Expecting the context of %s to have an attribute \'%s\'' % ( msg='Expecting the context of %s to have an attribute \'%s\'' % (
self.view_name, self.view.__name__,
key key
) )
) )
@ -30,24 +27,24 @@ class ViewTestCaseMixin:
value, value,
response.context[key], response.context[key],
msg='Expecting the context of %s to have %s set to \'%s\'' % ( msg='Expecting the context of %s to have %s set to \'%s\'' % (
self.view_name, self.view.__name__,
key, key,
str(value) str(value)
) )
) )
def assertHasForm(self, response, context_key, form_class): def assertHasForm(self, response, key, form_class):
''' '''
Checks if response has a form under the given key and if Checks if response has a form under the given key and if
the forms class matches. the forms class matches.
''' '''
self.assertContext(response, context_key) self.assertContext(response, key)
self.assertEqual( self.assertEqual(
type(response.context[context_key]), type(response.context[key]),
form_class, form_class,
msg='Expecting %s\'s context.%s to be of the type %s' % ( msg='Expecting %s\'s context.%s to be of the type %s' % (
self.view_name, self.view.__name__,
context_key, key,
form_class.__name__ form_class.__name__
) )
) )
@ -64,12 +61,6 @@ class ViewTestCaseMixin:
) )
) )
def assertHttpOK(self, response):
self.assertHttpCode(response, 200)
def assertHttpCreated(self, response):
self.assertHttpCode(response, 201)
def assertHttpRedirect(self, response, redirect_to=None): def assertHttpRedirect(self, response, redirect_to=None):
''' '''
Checks weather the response redirected, and if passed, Checks weather the response redirected, and if passed,
@ -81,16 +72,25 @@ class ViewTestCaseMixin:
'Expected an HTTP 3XX (redirect) response, but got HTTP %s' % 'Expected an HTTP 3XX (redirect) response, but got HTTP %s' %
response.status_code response.status_code
) )
self.assertTrue(
'location' in response,
msg='Expecting a redirect to have an location, got none'
)
if redirect_to: if redirect_to:
self.assertEqual( self.assertEqual(
response['Location'], response['location'],
redirect_to, redirect_to,
msg='Expecing the response to redirect to %s, where redirected to %s instea' % ( msg='Expecing the response to redirect to %s, where redirected to %s instea' % (
str(redirect_to), str(redirect_to),
str(response['Location']) str(response['location'])
) )
) )
def assertHttpOK(self, response):
self.assertHttpCode(response, 200)
def assertHttpCreated(self, response):
self.assertHttpCode(response, 201)
def assertHttpBadRequest(self, response): def assertHttpBadRequest(self, response):
self.assertHttpCode(response, 400) self.assertHttpCode(response, 400)

View File

@ -7,9 +7,9 @@ from django.contrib.messages.storage.fallback import FallbackStorage
from lostplaces_app.models import Place from lostplaces_app.models import Place
from lostplaces_app.views import IsAuthenticatedMixin from lostplaces_app.views import IsAuthenticatedMixin
from lostplaces_app.tests.views import ViewTestCaseMixin from lostplaces_app.tests.views import ViewTestCase
class TestIsAuthenticated(ViewTestCaseMixin, TestCase): class TestIsAuthenticated(ViewTestCase):
view = IsAuthenticatedMixin view = IsAuthenticatedMixin
@classmethod @classmethod
@ -19,6 +19,9 @@ class TestIsAuthenticated(ViewTestCaseMixin, TestCase):
password='Develop123' password='Develop123'
) )
def setUp(self):
self.client = Client()
def test_logged_in(self): def test_logged_in(self):
request = RequestFactory().get('/') request = RequestFactory().get('/')
request.user = User.objects.get(id=1) request.user = User.objects.get(id=1)
@ -64,6 +67,9 @@ class TestIsPlaceSubmitterMixin(TestCase):
def setUp(self): def setUp(self):
self.client = Client() self.client = Client()
def setUp(self):
self. client = Client()
def test_is_submitter(self): def test_is_submitter(self):
self.client.login(username='testpeter', password='Develop123') self.client.login(username='testpeter', password='Develop123')
response = self.client.get(reverse_lazy('place_edit', kwargs={'pk': 1})) response = self.client.get(reverse_lazy('place_edit', kwargs={'pk': 1}))

View File

@ -1,6 +1,6 @@
import datetime import datetime
from django.test import TestCase from django.test import TestCase, Client
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -10,10 +10,9 @@ from lostplaces_app.views import (
PlaceListView PlaceListView
) )
from lostplaces_app.forms import PlaceImageCreateForm, PlaceForm from lostplaces_app.forms import PlaceImageCreateForm, PlaceForm
from lostplaces_app.tests.views import ViewTestCaseMixin from lostplaces_app.tests.views import ViewTestCase
class TestPlaceCreateView(ViewTestCaseMixin, TestCase):
class TestPlaceCreateView(ViewTestCase):
view = PlaceCreateView view = PlaceCreateView
@classmethod @classmethod
@ -35,6 +34,9 @@ class TestPlaceCreateView(ViewTestCaseMixin, TestCase):
place.tags.add('I a tag', 'testlocation') place.tags.add('I a tag', 'testlocation')
place.save() place.save()
def setUp(self):
self.client = Client()
def test_has_forms(self): def test_has_forms(self):
self.client.login(username='testpeter', password='Develop123') self.client.login(username='testpeter', password='Develop123')
response = self.client.get(reverse_lazy('place_create')) response = self.client.get(reverse_lazy('place_create'))
@ -42,7 +44,7 @@ class TestPlaceCreateView(ViewTestCaseMixin, TestCase):
self.assertHasForm(response, 'place_image_form', PlaceImageCreateForm) self.assertHasForm(response, 'place_image_form', PlaceImageCreateForm)
self.assertHasForm(response, 'place_form', PlaceForm) self.assertHasForm(response, 'place_form', PlaceForm)
class TestPlaceListView(ViewTestCaseMixin, TestCase): class TestPlaceListView(ViewTestCase):
view = PlaceListView view = PlaceListView
@classmethod @classmethod
@ -64,10 +66,17 @@ class TestPlaceListView(ViewTestCaseMixin, TestCase):
place.tags.add('I a tag', 'testlocation') place.tags.add('I a tag', 'testlocation')
place.save() place.save()
def setUp(self):
self.client = Client()
def test_list_view(self): def test_list_view(self):
self.client.login(username='testpeter', password='Develop123') self.client.login(username='testpeter', password='Develop123')
response = self.client.get(reverse_lazy('place_list')) response = self.client.get(reverse_lazy('place_list'))
self.assertContext(response, 'map_config') self.assertContext(response, 'map_config')
def test_test(self):
response = self.client.get(reverse_lazy('place_list'))
print(response['location'])