from django.contrib.auth.models import User
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase


class MessageApiTestCase(APITestCase):
    def setUp(self):
        self.test_user1 = User.objects.create(username='u1')
        self.test_user1.set_password('u1')
        self.test_user1.save()
        self.test_user2 = User.objects.create(username='u2', password='u2')
        self.test_user2.set_password('u2')
        self.test_user2.save()
        self.test_user3 = User.objects.create(username='u3', password='u3')
        self.test_user3.set_password('u3')
        self.test_user3.save()

    def test_list_request(self):
        self.login_user1()
        response = self.client.get(reverse('message-api-list'), format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.logout()

    def test_send_message_unauth(self):
        url = reverse('message-api-list')
        message = {'recipient': 'u1', 'body': 'No auth!'}
        response = self.client.post(url, message, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_send_message(self):
        self.login_user1()
        url = reverse('message-api-list')
        message = {'recipient': 'u2', 'body': 'hello'}
        response = self.client.post(url, message, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.logout()

    def test_read_message(self):
        self.login_user1()
        url = reverse('message-api-list')
        message = {'recipient': 'u2', 'body': 'hello'}
        response = self.client.post(url, message, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.logout()
        # Change user
        self.login_user2()
        url = reverse('message-api-detail', kwargs={'pk': 1})
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['body'], 'hello')
        self.logout()
        # Change to another user (not in conversation)
        self.login_user3()
        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.logout()

    def login_user1(self):
        self.login('u1', 'u1')

    def login_user2(self):
        self.login('u2', 'u2')

    def login_user3(self):
        self.login('u3', 'u3')

    def login(self, username, password):
        self.assertTrue(self.client.login(username=username, password=password))

    def logout(self):
        self.client.logout()