Use context and other test fixes

This commit is contained in:
Aarni Halinen
2019-11-09 21:43:46 +02:00
parent b3a3a9815f
commit 31ebace4cd
3 changed files with 64 additions and 58 deletions
+9 -6
View File
@@ -1,8 +1,9 @@
from django.test import TestCase
from django.utils import timezone
from django.contrib.auth.models import User
from rest_framework.test import APITestCase, APIRequestFactory, force_authenticate
from django.utils import timezone
from rest_framework import status
from rest_framework.test import APITestCase, APIRequestFactory, force_authenticate
from webapp.models import Tag, Event
from webapp.serializers import EventSerializer
@@ -87,10 +88,12 @@ class EventTestCase(APITestCase):
def test_get_single_event(self):
response = self.client.get(f"/api/events/{self.testEventId}/", format="json")
result = response.data
# Remove tags because of API call having also domain name added to icon URL
result.pop("tags")
serialized = EventSerializer(Event.objects.get(title="TestEvent1")).data
serialized.pop("tags")
serialized = EventSerializer(
Event.objects.get(title="TestEvent1"),
context={
"request": APIRequestFactory().get(r"http://testserver/api/events/")
}
).data
self.assertEqual(
result,
serialized
+7 -9
View File
@@ -1,8 +1,8 @@
from django.test import TestCase
from django.contrib.auth.models import User
from rest_framework.test import APITestCase
from rest_framework import status
from rest_framework.test import force_authenticate
from rest_framework.test import APITestCase, APIRequestFactory, force_authenticate
from webapp.models import Tag, Feed
from webapp.serializers import FeedSerializer
@@ -33,13 +33,11 @@ class FeedTestCase(APITestCase):
self.assertTrue(status.is_success(response.status_code))
feeds = Feed.objects.all()
serializer = FeedSerializer(feeds, many=True)
# DRF extends path given by serializer with the protocol and domain for icon
# Ignore tag on serializer and response. This is tested on TagTestCase.
# Note that we assume the length here to be 1
response.data['results'][0].pop('tags')
serializer.data[0].pop('tags')
serializer = FeedSerializer(
feeds, many=True,
context={
"request": APIRequestFactory().get(r"http://testserver/api/events/")
})
self.assertEqual(response.data['results'], serializer.data)
def test_post_feed(self):
+48 -43
View File
@@ -1,6 +1,8 @@
from django.test import TestCase
from django.contrib.auth.models import User
from rest_framework import status
from rest_framework.test import APITestCase
from rest_framework.test import APITestCase, APIRequestFactory, force_authenticate
from webapp.models import Tag
from webapp.serializers import TagSerializer
@@ -13,58 +15,61 @@ class TagsTestCase(APITestCase):
def setUp(self):
self.icon = tempfile.NamedTemporaryFile(suffix=".jpg").name
Tag.objects.create(slug='Party', name_fi='Bileet', name_en="Partytime", icon=self.icon)
self.tag_id = Tag.objects.create(slug='Party', name_fi='Bileet', name_en="Partytime", icon=self.icon).id
Tag.objects.create(slug='OFF', name_fi='Virallinen', name_en="Official", icon=self.icon)
self.assertEqual(Tag.objects.count(), 2)
username, password = 'test_admin', 'password123'
self.authClient = User.objects.create_superuser(username, 'myemail@test.com', password)
def test_get_single_tag(self):
self.assertEqual(Tag.objects.count(), 1)
response = self.client.get('/api/tags/', format='json')
self.assertTrue(status.is_success(response.status_code))
response = self.client.get(f"/api/tags/{self.tag_id}/", format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
# We dont care about icon, so response is sliced
sliced_response = OrderedDict(islice(response.data['results'][0].items(), 3))
tag1 = Tag.objects.get(slug="Party")
self.assertEqual(sliced_response, {'id': tag1.id, 'slug': 'Party', 'name_fi': 'Bileet'})
def test_get_single_tag_serializer(self):
response = self.client.get('/api/tags/', format='json')
self.assertTrue(status.is_success(response.status_code))
tags = Tag.objects.all()
serializer = TagSerializer(tags, many=True)
# Icon on serializer is returned without protocol and domain
# Assert these individually
resp_icon = response.data['results'][0].pop('icon')
serial_icon = serializer.data[0].pop('icon')
self.assertEqual(response.data['results'], serializer.data)
self.assertEqual(resp_icon, "http://testserver" + serial_icon)
tags = Tag.objects.get(id=self.tag_id)
serializer = TagSerializer(
tags, context={
"request": APIRequestFactory().get(r"http://testserver/api/events/")
})
self.assertEqual(response.data, serializer.data)
def test_get_multiple_tags(self):
self.assertEqual(Tag.objects.count(), 1)
Tag.objects.create(slug='Freshmen', name_fi='Fuksit', icon=self.icon)
Tag.objects.create(slug='International', name_fi='Ulkkarit', icon=self.icon)
self.assertEqual(Tag.objects.count(), 3)
self.assertEqual(Tag.objects.count(), 4)
response = self.client.get('/api/tags/', format='json')
self.assertTrue(status.is_success(response.status_code))
self.assertEqual(response.status_code, status.HTTP_200_OK)
# We dont care about icon, so response is sliced
tag1 = Tag.objects.get(slug="Party")
sliced_response = OrderedDict(islice(response.data['results'][0].items(), 3))
self.assertEqual(sliced_response, {'id': tag1.id, 'slug': 'Party', 'name_fi': 'Bileet'})
sliced_response = OrderedDict(islice(response.data['results'][1].items(), 3))
tag2 = Tag.objects.get(slug="Freshmen")
self.assertEqual(sliced_response, {'id': tag2.id, 'slug': 'Freshmen', 'name_fi': 'Fuksit'})
sliced_response = OrderedDict(islice(response.data['results'][2].items(), 3))
tag3 = Tag.objects.get(slug="International")
self.assertEqual(sliced_response, {'id': tag3.id, 'slug': 'International', 'name_fi': 'Ulkkarit'})
expected = TagSerializer(
Tag.objects.all(), many=True,
context={
"request": APIRequestFactory().get(r"http://testserver/api/events/")
}).data
def test_create_tag(self):
self.assertEqual(Tag.objects.count(), 1)
response = self.client.post('/api/tags/', {'slug': 'Test', 'name_fi': 'Testinimi', 'icon': self.icon}, format='multipart')
self.assertFalse(status.is_success(response.status_code))
self.assertEqual(Tag.objects.count(), 1)
self.assertEqual(
response.data['results'],
expected
)
def test_invalid_tag(self):
self.assertEqual(Tag.objects.count(), 1)
response = self.client.get('/api/tags/15', format='json', follow=True)
def test_get_invalid_tag(self):
response = self.client.get('/api/tags/15/', format='json', follow=True)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
# READ ONLY API!
def test_create_tag(self):
# Authenticate
self.client.force_authenticate(user=self.authClient)
response = self.client.post(
"/api/tags/",
{
"slug": "Test",
"name": "Testinimi",
"name_fi": "Testinimi",
"name_en": "Test name",
"icon": self.icon
},
format='json'
)
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
self.assertEqual(Tag.objects.count(), 2)