285 lines
10 KiB
Python
285 lines
10 KiB
Python
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)
|