import json from datetime import timedelta from django.test import TestCase from django.utils import timezone from lists.models import ListItem, Entity, Tag from users.models import User class TestList(TestCase): def setUp(self): self.user = User.objects.create_user(username='user', email='email@email.com', password='superpassword') self.other = User.objects.create_user(username='other', email='email@email.com', password='superpassword') self.entities = [ Entity.objects.create(mbid='a', entity_type='artist'), Entity.objects.create(mbid='b', entity_type='release-group'), Entity.objects.create(mbid='c', entity_type='recording'), ] self.tags = [ Tag.objects.create(user=self.user, name='1'), Tag.objects.create(user=self.user, name='2'), Tag.objects.create(user=self.user, name='3') ] for tag in self.tags: self.user.tags.add(tag) list_item = ListItem.objects.create(user_id=self.user.id, entity=self.entities[0], opinion='oh no', stars=4) list_item.tags.set(self.tags) self.user.list.add(list_item) tomorrow = timezone.now() + timedelta(1) self.user_token = self.user.oauth2_provider_accesstoken.create(expires=tomorrow, token='usertoken') self.other_token = self.other.oauth2_provider_accesstoken.create(expires=tomorrow, token='ohnotoken') def _user_bearer_token(self): return f'Bearer {self.user_token.token}' def _other_bearer_token(self): return f'Bearer {self.other_token.token}' def test_get_list(self): response = self.client.get('/api/lists/list/1', follow=True) self.assertEqual(response.status_code, 200) self.assertTrue('list' in response.json()) for list_item in response.json()['list']: self.assertTrue('entity' in list_item) self.assertTrue('tags' in list_item) def test_get_list_user_doesnt_exists(self): response = self.client.get('/api/lists/list/3', follow=True) self.assertEqual(response.status_code, 404) def test_add_to_list_is_protected(self): response = self.client.post('/api/lists/list/1/') self.assertEqual(response.status_code, 403) response = self.client.post('/api/lists/list/1/', HTTP_AUTHORIZATION=self._other_bearer_token()) self.assertEqual(response.status_code, 403) def test_add_to_list(self): to_add = { 'entity': 'b', 'entity_type': 'artist', 'tags': ['1', '2'], 'stars': 1, 'opinion': 'oh no' } response = self.client.post('/api/lists/list/1/', json.dumps(to_add), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) list_item = ListItem.objects.filter(pk=2) self.assertEqual(list_item.count(), 1) list_item = list_item[0] self.assertEqual(list_item.user_id, self.user.id) self.assertEqual(list_item.entity_id, to_add['entity']) self.assertEqual(list_item.tags.count(), len(to_add['tags'])) def test_add_to_list_no_tags(self): to_add = { 'entity': 'b', 'entity_type': 'artist', 'tags': [] } response = self.client.post('/api/lists/list/1/', json.dumps(to_add), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) list_item = ListItem.objects.filter(pk=2) self.assertEqual(list_item.count(), 1) list_item = list_item[0] self.assertEqual(list_item.user_id, self.user.id) self.assertEqual(list_item.entity_id, to_add['entity']) self.assertEqual(list_item.tags.count(), len(to_add['tags'])) def test_add_to_list_non_exists_entity(self): to_add = { 'entity': 'd', 'entity_type': 'artist', 'tags': ['1', '2'] } response = self.client.post('/api/lists/list/1/', json.dumps(to_add), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) list_item = ListItem.objects.filter(pk=2) self.assertEqual(list_item.count(), 1) list_item = list_item[0] self.assertEqual(list_item.user_id, self.user.id) self.assertEqual(list_item.entity_id, to_add['entity']) self.assertEqual(list_item.tags.count(), len(to_add['tags'])) def test_add_to_list_non_valid_stars(self): to_add = { 'entity': 'b', 'entity_type': 'artist', 'tags': ['1', '2'], 'stars': -1, 'opinion': 'oh no' } response = self.client.post('/api/lists/list/1/', json.dumps(to_add), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 400) to_add = { 'entity': 'b', 'entity_type': 'artist', 'tags': ['1', '2'], 'stars': 6, 'opinion': 'oh no' } response = self.client.post('/api/lists/list/1/', json.dumps(to_add), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 400) def test_delete_list_item_is_protected(self): response = self.client.delete('/api/lists/list/1/1/') self.assertEqual(response.status_code, 403) response = self.client.delete('/api/lists/list/1/1/', HTTP_AUTHORIZATION=self._other_bearer_token()) self.assertEqual(response.status_code, 403) def test_delete_list_item(self): self.assertEqual(ListItem.objects.filter(pk=1).count(), 1) response = self.client.delete('/api/lists/list/1/1/', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) self.assertEqual(ListItem.objects.filter(pk=1).count(), 0) def test_get_list_item(self): response = self.client.get('/api/lists/list/1/1', follow=True) self.assertEqual(response.status_code, 200) list_item = response.json() self.assertEqual(list_item['entity']['mbid'], 'a') self.assertEqual(list_item['entity']['type'], 'artist') self.assertEqual(len(list_item['tags']), 3) def test_update_list_item_is_protected(self): response = self.client.put('/api/lists/list/1/1/') self.assertEqual(response.status_code, 403) response = self.client.put('/api/lists/list/1/1/', HTTP_AUTHORIZATION=self._other_bearer_token()) self.assertEqual(response.status_code, 403) def test_update_list_item(self): self.assertEqual(ListItem.objects.get(pk=1).tags.count(), 3) to_update = { 'entity': 'a', 'tags': ['1', '2'] } response = self.client.put('/api/lists/list/1/1/', json.dumps(to_update), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) self.assertEqual(ListItem.objects.get(pk=1).tags.count(), 2) def test_get_tag(self): response = self.client.get('/api/lists/tag/1/') self.assertEqual(response.status_code, 200) tags = response.json()['tags'] self.assertEqual(len(tags), 3) def test_post_tag_is_protected(self): response = self.client.post('/api/lists/tag/1/', HTTP_AUTHORIZATION=self._other_bearer_token()) self.assertEqual(response.status_code, 403) def test_post_tag(self): tag = { 'name': 'oh no' } response = self.client.post('/api/lists/tag/1/', json.dumps(tag), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) self.assertEqual(Tag.objects.filter(name='oh no').count(), 1) def test_put_tag_is_protected(self): response = self.client.put('/api/lists/tag/1/1/', HTTP_AUTHORIZATION=self._other_bearer_token()) self.assertEqual(response.status_code, 403) def test_put_tag(self): tag = {'name': 'oh no'} response = self.client.put('/api/lists/tag/1/1/', json.dumps(tag), content_type='application/json', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) self.assertEqual(Tag.objects.filter(name='oh no').count(), 1) def test_delete_tag_is_protected(self): response = self.client.put('/api/lists/tag/1/1/', HTTP_AUTHORIZATION=self._other_bearer_token()) self.assertEqual(response.status_code, 403) def test_delete_tag(self): response = self.client.delete('/api/lists/tag/1/1/', HTTP_AUTHORIZATION=self._user_bearer_token()) self.assertEqual(response.status_code, 200) self.assertEqual(Tag.objects.all().count(), 2) self.assertEqual(ListItem.objects.get(pk=1).tags.count(), 2) def test_entity_opinions(self): response = self.client.get('/api/lists/entity/a/opinions', follow=True) self.assertEqual(response.status_code, 200) opinions = response.json()['opinions'] self.assertEqual(len(opinions), 1) self.assertEqual(opinions[0]['user']['id'], 1) self.assertEqual(opinions[0]['user']['username'], 'user') self.assertEqual(opinions[0]['opinion'], 'oh no') self.assertEqual(opinions[0]['stars'], 4)