#!/usr/bin/env python # -*- coding: utf-8 -*- import re from os import path from django.test import TestCase, Client from django.urls import reverse from django.contrib.auth.models import User from django.utils import timezone from django.conf import settings from lostplaces.models import Place from lostplaces.views import ( PlaceCreateView, PlaceListView, PlaceDetailView ) from lostplaces.forms import PlaceImageForm, PlaceForm from lostplaces.tests.views import ( ViewTestCase, TaggableViewTestCaseMixin, MapableViewTestCaseMixin, GlobalTemplateTestCaseMixin ) class TestPlaceListView(GlobalTemplateTestCaseMixin, ViewTestCase): """ Tests the view listing all placs """ view = PlaceListView @classmethod def setUpTestData(cls): user = User.objects.create_user( username='testpeter', password='Develop123' ) for i in range(12): place = Place.objects.create( name='Im a place %d' % i, submitted_when=timezone.now(), submitted_by=user.explorer, location='Test %d town' % i, latitude=50.5 + i/10, longitude=7.0 - i/10, description='This is just a test, do not worry' ) place.tags.add('I a tag', 'testlocation') place.save() def setUp(self): self.client = Client() def test_list_view(self): self.client.login(username='testpeter', password='Develop123') response = self.client.get(reverse('place_list')) self.assertContext(response, 'mapping_config') self.assertGlobal(response) def test_pagination(self): self.client.login(username='testpeter', password='Develop123') response = self.client.get(reverse('place_list')) self.assertNotEqual( None, re.search( """\s*(.*\s*){6,}""", response.content.decode().replace('\n', '').lower() ), msg='Expecting the place list to be paginated like [first] [previous] [item] at least 2 times [next] [last]' ) class TestPlaceCreateView(ViewTestCase): view = PlaceCreateView @classmethod def setUpTestData(cls): user = User.objects.create_user( username='testpeter', password='Develop123' ) def setUp(self): self.client = Client() def test_has_forms(self): self.client.login(username='testpeter', password='Develop123') response = self.client.get(reverse('place_create')) self.assertHasForm(response, 'place_image_form', PlaceImageForm) self.assertHasForm(response, 'place_form', PlaceForm) def test_positive_no_image(self): self.client.login(username='testpeter', password='Develop123') response = self.client.post( reverse('place_create'), { 'name': 'test place 486', 'location': 'test location', 'latitude': 45.804192, 'longitude': 1.860222, 'description': """ Cupiditate harum reprehenderit ipsam iure consequuntur eaque eos reiciendis. Blanditiis vel minima minus repudiandae voluptate aut quia sed. Provident ex omnis illo molestiae. Ullam eos et est provident enim deserunt. """ } ) self.assertHttpRedirect(response) place = Place.objects.get(name='test place 486') self.assertNotEqual( None, place, msg='Submitted place not found in database / model' ), self.assertNotEqual( None, re.search( """.*%s""" % reverse( 'place_detail', kwargs={'pk': place.id} ), response.url ) ) def test_positive_image(self): self.client.login(username='testpeter', password='Develop123') image = open( path.join( settings.BASE_DIR, 'testdata', 'test_image.jpg' ), 'rb' ) response = self.client.post( reverse('place_create'), { 'name': 'test place 894', 'location': 'test location', 'latitude': 45.804192, 'longitude': 1.860222, 'description': """ Cupiditate harum reprehenderit ipsam iure consequuntur eaque eos reiciendis. Blanditiis vel minima minus repudiandae voluptate aut quia sed. Provident ex omnis illo molestiae. Ullam eos et est provident enim deserunt. """, 'filename': [image] } ) self.assertHttpRedirect(response) place = Place.objects.get(name='test place 894') self.assertNotEqual( None, place, msg='Submitted place not found in database / model' ), self.assertNotEqual( None, re.search( """.*%s""" % reverse( 'place_detail', kwargs={'pk': place.id} ), response.url ) ) self.assertEqual( len(place.placeimages.all()), 1, msg='Expecting the place to have exactly 1 place image' ) def test_negative_no_name(self): self.client.login(username='testpeter', password='Develop123') response = self.client.post( reverse('place_create'), { 'location': 'test location 456', 'latitude': 45.804192, 'longitude': 1.860222, 'description': """ Cupiditate harum reprehenderit ipsam iure consequuntur eaque eos reiciendis. Blanditiis vel minima minus repudiandae voluptate aut quia sed. Provident ex omnis illo molestiae. Ullam eos et est provident enim deserunt. """ } ) self.assertHttpBadRequest(response) self.assertEqual( len(Place.objects.filter(location='test location 456')), 0, msg='Expecting no place to be created' ) def test_negative_no_location(self): self.client.login(username='testpeter', password='Develop123') response = self.client.post( reverse('place_create'), { 'name': 'test name 376', 'latitude': 45.804192, 'longitude': 1.860222, 'description': """ Cupiditate harum reprehenderit ipsam iure consequuntur eaque eos reiciendis. Blanditiis vel minima minus repudiandae voluptate aut quia sed. Provident ex omnis illo molestiae. Ullam eos et est provident enim deserunt. """ } ) self.assertHttpBadRequest(response) self.assertEqual( len(Place.objects.filter(name='test name 376')), 0, msg='Expecting no place to be created' ) def test_negative_no_latitude(self): self.client.login(username='testpeter', password='Develop123') response = self.client.post( reverse('place_create'), { 'name': 'test name 417', 'location': 'location', 'longitude': 1.860222, 'description': """ Cupiditate harum reprehenderit ipsam iure consequuntur eaque eos reiciendis. Blanditiis vel minima minus repudiandae voluptate aut quia sed. Provident ex omnis illo molestiae. Ullam eos et est provident enim deserunt. """ } ) self.assertHttpBadRequest(response) self.assertEqual( len(Place.objects.filter(name='test name 417')), 0, msg='Expecting no place to be created' ) def test_negative_no_longitude(self): self.client.login(username='testpeter', password='Develop123') response = self.client.post( reverse('place_create'), { 'name': 'test name 417', 'location': 'location', 'latitude': 45.804192, 'description': """ Cupiditate harum reprehenderit ipsam iure consequuntur eaque eos reiciendis. Blanditiis vel minima minus repudiandae voluptate aut quia sed. Provident ex omnis illo molestiae. Ullam eos et est provident enim deserunt. """ } ) self.assertHttpBadRequest(response) self.assertEqual( len(Place.objects.filter(name='test name 417')), 0, msg='Expecting no place to be created' ) class PlaceDetailViewTestCase(TaggableViewTestCaseMixin, MapableViewTestCaseMixin, ViewTestCase): view = PlaceDetailView @classmethod def setUpTestData(cls): user = User.objects.create_user( username='testpeter', password='Develop123' ) place = Place.objects.create( name='Im a place', submitted_when=timezone.now(), submitted_by=user.explorer, location='Testtown', latitude=50.5, longitude=7.0, description='This is just a test, do not worry' ) place.tags.add('I a tag', 'testlocation') place.save() def test_context(self): self.client.login(username='testpeter', password='Develop123') response = self.client.get(reverse('place_detail', kwargs={'pk': 1})) self.assertTrue( 'tagging_config' in response.context, msg='Expecting the context of %s to have an \'tagging_config\'' % ( str(self.view) ) ) self.assertTaggableContext(response.context['tagging_config']) self.assertTrue( 'mapping_config' in response.context, msg='Expecting the context of %s to have an \'mapping_config\'' % ( str(self.view) ) ) self.assertMapableContext(response.context['mapping_config'])