import json from django.test import TestCase from users.models import User, SocialNetworks from django.utils import timezone from datetime import timedelta class TestAPIViews(TestCase): def setUp(self): self.user_admin = User.objects.create_superuser('admin', 'email@email.com', 'superpassword') self.user_regular = User.objects.create_user('normal', 'email@email.com', 'superpassword') tomorrow = timezone.now() + timedelta(1) self.user_token = self.user_regular.oauth2_provider_accesstoken.create(expires=tomorrow, token='usertoken') self.admin_token = self.user_admin.oauth2_provider_accesstoken.create(expires=tomorrow, token='admintoken') self.user_regular.socialnetworks.twitter = 'twitter' self.user_regular.socialnetworks.save() def _admin_header(self): return f'Bearer {self.admin_token.token}' def _user_header(self): return f'Bearer {self.user_token.token}' def test_get_user_exists(self): response = self.client.get('/api/users/user/1', follow=True) self.assertEqual(response.status_code, 200) def test_get_user_not_exists(self): response = self.client.get('/api/users/user/3', follow=True) self.assertEqual(response.status_code, 404) def test_put_user_valid(self): new_user_data = { 'username': 'other', 'email': 'skrd159@gmail.com' } response = self.client.put('/api/users/user/2', json.dumps(new_user_data), HTTP_AUTHORIZATION=self._user_header()) self.assertEqual(response.status_code, 200) user = User.objects.get(pk=2) self.assertEqual(user.username, new_user_data['username']) self.assertEqual(user.email, new_user_data['email']) def test_put_user_not_all_data(self): new_user_data = { 'username': 'other', } response = self.client.put('/api/users/user/2', json.dumps(new_user_data), HTTP_AUTHORIZATION=self._user_header()) self.assertEqual(response.status_code, 400) def test_put_user_not_modifying_self(self): new_user_data = { 'username': 'other', 'email': 'skrd159@gmail.com' } response = self.client.put('/api/users/user/1', json.dumps(new_user_data), HTTP_AUTHORIZATION=self._user_header()) self.assertEqual(response.status_code, 403) def test_put_user_admin_not_modifying_self(self): new_user_data = { 'username': 'other', 'email': 'skrd159@gmail.com' } response = self.client.put('/api/users/user/2', json.dumps(new_user_data), HTTP_AUTHORIZATION=self._admin_header()) self.assertEqual(response.status_code, 200) def test_get_social_networks_exists(self): response = self.client.get('/api/users/user/2/social_networks', follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(response.json()['twitter'], 'twitter') def test_get_social_networks_not_exists(self): response = self.client.get('/api/users/user/3/social_networks', follow=True) self.assertEqual(response.status_code, 404) def test_put_social_networks_valid(self): new_social_data = { 'twitter': 'ryuuji159', 'facebook': '', 'instagram': '', 'youtube': '', 'twitch': '', } response = self.client.put('/api/users/user/2/social_networks', json.dumps(new_social_data), HTTP_AUTHORIZATION=self._user_header()) self.assertEqual(response.status_code, 200) social_networks = SocialNetworks.objects.get(user_id=2) self.assertEqual(social_networks.twitter, new_social_data['twitter']) self.assertEqual(social_networks.facebook, new_social_data['facebook']) self.assertEqual(social_networks.instagram, new_social_data['instagram']) self.assertEqual(social_networks.youtube, new_social_data['youtube']) self.assertEqual(social_networks.twitch, new_social_data['twitch']) def test_put_social_networks_invalid(self): # max length para los fields es 255 => len('toolong'*37) == 259 new_social_data = {'twitter': 'toolong'*37} response = self.client.put('/api/users/user/2/social_networks', json.dumps(new_social_data), HTTP_AUTHORIZATION=self._user_header()) self.assertEqual(response.status_code, 400) def test_put_social_networks_not_modifying_self(self): new_social_data = {} response = self.client.put('/api/users/user/1/social_networks', json.dumps(new_social_data), HTTP_AUTHORIZATION=self._user_header()) self.assertEqual(response.status_code, 403) def test_put_social_networks_admin_modifying_other(self): new_social_data = {} response = self.client.put('/api/users/user/2/social_networks', json.dumps(new_social_data), HTTP_AUTHORIZATION=self._admin_header()) self.assertEqual(response.status_code, 200)