from django.test import TestCase
from django.contrib.auth.models import User
from rest_framework import status
from rest_framework.test import APITestCase, force_authenticate

from webapp.models import TemplateQuestion
from webapp.serializers import SavedQuestionsSerializer
from webapp.tests.signup_fixture import ALL_QUESTION_TYPES
import json


class TemplateQuestionCase(APITestCase):
    def setUp(self):
        self.questions = [
            TemplateQuestion.objects.create(
                name="Testi1",
                question=ALL_QUESTION_TYPES
            ),
            TemplateQuestion.objects.create(
                name="Testi2",
                question=ALL_QUESTION_TYPES
            )
        ]

        username, password = "test_admin", "password123"
        self.authClient = User.objects.create_superuser(username, "myemail@test.com", password)

    def test_get(self):
        response = self.client.get("/api/questions/", format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data["results"], SavedQuestionsSerializer(self.questions, many=True).data)
        response = self.client.get(f"/api/questions/{self.questions[0].id}/", format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data, SavedQuestionsSerializer(self.questions[0]).data)

    def test_post(self):
        new = {
            "name": "testi3",
            "question": json.dumps(ALL_QUESTION_TYPES)
        }
        response = self.client.post("/api/questions/", new, format="json")
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(TemplateQuestion.objects.count(), 2)

        # Authenticate
        self.client.force_authenticate(user=self.authClient)
        response = self.client.post("/api/questions/", new, format="json")
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(TemplateQuestion.objects.count(), 3)

    def test_update(self):
        new = {
            "name": "uusi testi2",
            "question": json.dumps({})
        }
        response = self.client.put(f"/api/questions/{self.questions[0].id}/", new, format="json")
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(TemplateQuestion.objects.count(), 2)

        # Authenticate
        self.client.force_authenticate(user=self.authClient)
        response = self.client.put(f"/api/questions/{self.questions[0].id}/", new, format="json")

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(TemplateQuestion.objects.count(), 2)
        self.assertEqual(
            TemplateQuestion.objects.get(id=self.questions[0].id).name,
            "uusi testi2"
        )

    def test_delete(self):
        response = self.client.delete(f"/api/questions/{self.questions[0].id}/", format="json")
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(TemplateQuestion.objects.count(), 2)

        # Authenticate
        self.client.force_authenticate(user=self.authClient)
        response = self.client.delete(f"/api/questions/{self.questions[0].id}/", format="json")
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(TemplateQuestion.objects.count(), 1)
