# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import inspect

from task.models import InveraTask
from api.utils import send_test_csv_report

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

TEST_RESULTS = []
RECIPIENTS = ['email@destino.com']


class TaskListTestCase(APITestCase):
    def setUp(self) -> None:
        self.user = User.objects.create_user(
            username='test_user', password='adminpass')
        self.other_user = User.objects.create_user(
            username='other_user', password='adminpass')
        self.task = InveraTask.objects.create(
            userTask=self.user, title='My Initial Task')

        self.client = APIClient()

    @classmethod
    def tearDownClass(cls):
        User.objects.filter(username__in=['test_user', 'other_user']).delete()

    def test_create_task_with_un_authenticate_user(self):
        """
        En este caso de prueba, estamos probando la API Task Create utilizando un usuario no autenticado.
        """

        response = self.client.post(
            reverse('api-task'), {'title': 'My Task 1'}, format='json')

        is_passed = response.status_code == status.HTTP_403_FORBIDDEN

        TEST_RESULTS.append({
            "result": "Passed" if is_passed else "Failed",
            "test_name": inspect.currentframe().f_code.co_name,
            "test_description": "El usuario no autenticado no puede agregar una tarea a la lista"
        })

        if is_passed:
            print("Resultado: Aprobado")
        else:
            print("Resultado: Fallido")
        print("Nombre del test: " + inspect.currentframe().f_code.co_name)
        print("Descripcion: El usuario no autenticado no puede agregar una tarea a la lista")
        print("-----------")

    def test_put_task_with_un_authenticate_user(self):
        """
        En este caso de prueba, estamos probando la API Task PUT utilizando un usuario no autenticado.
        """

        response = self.client.put(
            reverse('api-task'), {'title': 'My Task'}, format='json')

        is_passed = response.status_code == status.HTTP_403_FORBIDDEN

        TEST_RESULTS.append({
            "result": "Passed" if is_passed else "Failed",
            "test_name": inspect.currentframe().f_code.co_name,
            "test_description": "El usuario no autenticado no puede modificar una tarea"
        })

        if is_passed:
            print("Resultado: Aprobado")
        else:
            print("Resultado: Fallido")
        print("Nombre del test: " + inspect.currentframe().f_code.co_name)
        print("Descripcion: El usuario no autenticado no puede modificar una tarea")
        print("-----------")

    def test_put_task_with_authenticated_user(self):
        self.client.login(username='test_user', password='adminpass')

        response = self.client.put(reverse('api-task-detail', args=[str(self.task.idTask)]), {'title': 'My Task 2'}, format='json')

        is_passed = response.status_code == status.HTTP_200_OK
        TEST_RESULTS.append({
            "result": "Passed" if is_passed else "Failed",
            "test_name": inspect.currentframe().f_code.co_name,
            "test_description": "Usuario autenticado puede modificar una tarea suya"
        })
        if is_passed:
            print("Resultado: Aprobado")
        else:
            print("Resultado: Fallido")
        print("Nombre del test: " + inspect.currentframe().f_code.co_name)
        print("Descripcion: Usuario autenticado puede modificar una tarea suya")
        print("-----------")
 

    def test_get_other_user_task_detail(self):
        """
        En este caso de prueba, estamos probando la API Task GET y tratando de obtener detalles de la tarea de un usuario que usa credenciales de usuario diferentes.
        """

        self.client.login(username='other_user', password='adminpass')

        response = self.client.get(reverse('api-task-detail', args=[str(self.task.idTask)]))

        is_passed = response.status_code == status.HTTP_404_NOT_FOUND

        # is_passed = response.status_code == status.HTTP_403_FORBIDDEN

        TEST_RESULTS.append({
            "result": "Passed" if is_passed else "Failed",
            "test_name": inspect.currentframe().f_code.co_name,
            "test_description": "Solo el propietario puede ver el detalle de la tarea"
        })
        if is_passed:
            print("Resultado: Aprobado")
        else:
            print("Resultado: Fallido")
        print("Nombre del test: " + inspect.currentframe().f_code.co_name)
        print("Descripcion: Solo el propietario puede ver el detalle de la tarea")
        print("-----------")
            
  

    def test_create_task_with_authenticated_user(self):
        self.client.login(username='test_user', password='adminpass')

        response = self.client.post(reverse('api-task'), {'title': 'My Task'}, format='json')

        is_passed = response.status_code == status.HTTP_201_CREATED
        TEST_RESULTS.append({
            "result": "Passed" if is_passed else "Failed",
            "test_name": inspect.currentframe().f_code.co_name,
            "test_description": "Usuario autenticado agrega tarea a la lista"
        })
        if is_passed:
            print("Resultado: Aprobado")
        else:
            print("Resultado: Fallido")
        print("Nombre del test: " + inspect.currentframe().f_code.co_name)
        print("Descripcion: Usuario autenticado agrega tarea a la lista")
        print("-----------")

    def test_get_task_detail(self):
        self.client.login(username='test_user', password='adminpass')

        response = self.client.get(reverse('api-task-detail', args=[str(self.task.idTask)]))

        is_passed = response.status_code == status.HTTP_200_OK

        TEST_RESULTS.append({
            "result": "Passed" if is_passed else "Failed",
            "test_name": inspect.currentframe().f_code.co_name,
            "test_description": "Usuario autenticado puede ver detalles de la tarea correctamente"
        })
        if is_passed:
            print("Resultado: Aprobado")
        else:
            print("Resultado: Fallido")
        print("Nombre del test: " + inspect.currentframe().f_code.co_name)
        print("Descripcion: Usuario autenticado puede ver detalles de la tarea correctamente")
        print("-----------")


class CSVReportTest(APITestCase):
    def test_send_csv(self):
        send_test_csv_report(
            test_results=TEST_RESULTS,
            recipients=RECIPIENTS
        )




[((478, 546), 'django.contrib.auth.models.User.objects.create_user', 'User.objects.create_user', ([], {'username': '"""test_user"""', 'password': '"""adminpass"""'}), "(username='test_user', password='adminpass')\n", (502, 546), False, 'from django.contrib.auth.models import User\n'), ((586, 655), 'django.contrib.auth.models.User.objects.create_user', 'User.objects.create_user', ([], {'username': '"""other_user"""', 'password': '"""adminpass"""'}), "(username='other_user', password='adminpass')\n", (610, 655), False, 'from django.contrib.auth.models import User\n'), ((689, 759), 'task.models.InveraTask.objects.create', 'InveraTask.objects.create', ([], {'userTask': 'self.user', 'title': '"""My Initial Task"""'}), "(userTask=self.user, title='My Initial Task')\n", (714, 759), False, 'from task.models import InveraTask\n'), ((796, 807), 'rest_framework.test.APIClient', 'APIClient', ([], {}), '()\n', (805, 807), False, 'from rest_framework.test import APIClient, APITestCase\n'), ((6544, 6614), 'api.utils.send_test_csv_report', 'send_test_csv_report', ([], {'test_results': 'TEST_RESULTS', 'recipients': 'RECIPIENTS'}), '(test_results=TEST_RESULTS, recipients=RECIPIENTS)\n', (6564, 6614), False, 'from api.utils import send_test_csv_report\n'), ((1172, 1191), 'rest_framework.reverse.reverse', 'reverse', (['"""api-task"""'], {}), "('api-task')\n", (1179, 1191), False, 'from rest_framework.reverse import reverse\n'), ((2114, 2133), 'rest_framework.reverse.reverse', 'reverse', (['"""api-task"""'], {}), "('api-task')\n", (2121, 2133), False, 'from rest_framework.reverse import reverse\n'), ((4962, 4981), 'rest_framework.reverse.reverse', 'reverse', (['"""api-task"""'], {}), "('api-task')\n", (4969, 4981), False, 'from rest_framework.reverse import reverse\n'), ((862, 923), 'django.contrib.auth.models.User.objects.filter', 'User.objects.filter', ([], {'username__in': "['test_user', 'other_user']"}), "(username__in=['test_user', 'other_user'])\n", (881, 923), False, 'from django.contrib.auth.models import User\n'), ((1418, 1440), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (1438, 1440), False, 'import inspect\n'), ((1720, 1742), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (1740, 1742), False, 'import inspect\n'), ((2358, 2380), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (2378, 2380), False, 'import inspect\n'), ((2651, 2673), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (2671, 2673), False, 'import inspect\n'), ((3239, 3261), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (3259, 3261), False, 'import inspect\n'), ((3527, 3549), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (3547, 3549), False, 'import inspect\n'), ((4341, 4363), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (4361, 4363), False, 'import inspect\n'), ((4631, 4653), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (4651, 4653), False, 'import inspect\n'), ((5203, 5225), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (5223, 5225), False, 'import inspect\n'), ((5484, 5506), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (5504, 5506), False, 'import inspect\n'), ((6006, 6028), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (6026, 6028), False, 'import inspect\n'), ((6308, 6330), 'inspect.currentframe', 'inspect.currentframe', ([], {}), '()\n', (6328, 6330), False, 'import inspect\n')]