Files
musiclist-server/lists/test.py
Daniel Cortes 329a982641 Api de opinione
2020-07-15 00:35:20 -04:00

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)