"""
@author: p.dolata
"""

from django.test import TestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase, APIClient

from smartpicasso.app.user.models import User
from smartpicasso.app.user_profile.models import UserProfile


class UserProfileApiTest(APITestCase):
    client = APIClient()
    profile_url = reverse('profile')
    authenticate_url = reverse('authenticate')
    profile = {"username": 'test_user', "first_name": "first", "last_name": "last"}

    def test_get_profile_without_auth(self):
        response = self.client.get(self.profile_url, format='json')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)

    def test_get_profile_with_invalid_token(self):
        self.client.force_authenticate(user=None)
        response = self.client.get(self.profile_url, format='json')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)

    def test_get_profile_when_user_without_profile(self):
        user = User.objects.create_user(email='test@test.com', password='test')
        self.client.force_authenticate(user=user)
        response = self.client.get(self.profile_url, format='json')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['success'], 'False')

    def test_get_profile(self):
        user = User.objects.create_user(email='test@test.com', password='test')
        UserProfile.objects.create(
            user=user,
            username=self.profile['username'],
            first_name=self.profile['first_name'],
            last_name=self.profile['last_name']
        )
        self.client.force_authenticate(user=user)
        response = self.client.get(self.profile_url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['success'], 'True')
        profile = response.data['profile']
        self.assertEqual(profile['username'], self.profile['username'])
        self.assertEqual(profile['first_name'], self.profile['first_name'])
        self.assertEqual(profile['last_name'], self.profile['last_name'])


class UserProfileTest(TestCase):
    profile = {"username": 'test_user', "first_name": "first", "last_name": "last"}

    def test_user_profile_str(self):
        user = User.objects.create_user(email='test@test.com', password='test')
        user_profile = UserProfile.objects.create(
            user=user,
            username=self.profile['username'],
            first_name=self.profile['first_name'],
            last_name=self.profile['last_name']
        )
        self.assertEqual(str(user_profile), 'test_user - first last')