diff --git a/webapp/tests/test_event.py b/webapp/tests/test_event.py index 36e374f..e09d2c3 100644 --- a/webapp/tests/test_event.py +++ b/webapp/tests/test_event.py @@ -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 diff --git a/webapp/tests/test_feed.py b/webapp/tests/test_feed.py index 2a73d79..3710f07 100644 --- a/webapp/tests/test_feed.py +++ b/webapp/tests/test_feed.py @@ -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): diff --git a/webapp/tests/test_tag.py b/webapp/tests/test_tag.py index d8e2a4a..69f1165 100644 --- a/webapp/tests/test_tag.py +++ b/webapp/tests/test_tag.py @@ -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)