# (c) cavaliba.com - tests / api / task datetime second precision

import json

from django.test import TestCase
from django.urls import reverse

import app_home.cache as cache
from app_data.models import DataTask
from app_data.task_manager import create_datatask, finish_task
from tests import helper

ISO_SECONDS_RE = r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$"


class TestAPITaskDatetimeSecondPrecision(TestCase):
    def setUp(self):
        cache.clear()
        self.header = helper.add_apikey_admin()

    def _detail(self, handle):
        response = self.client.get(
            reverse("api:api_task_detail", kwargs={"handle": handle}), headers=self.header
        )
        self.assertEqual(response.status_code, 200)
        return json.loads(response.content)

    def test_created_at_has_no_fractional_seconds(self):
        # created_at is auto_now_add, so the stored value still carries
        # microseconds - the API must not print them
        dt = create_datatask("t", owner_id="u1")
        self.assertNotEqual(DataTask.objects.get(handle=dt.handle).created_at, None)
        data = self._detail(dt.handle)
        self.assertRegex(data["created_at"], ISO_SECONDS_RE)
        self.assertNotIn(".", data["created_at"])

    def test_finished_at_has_no_fractional_seconds(self):
        dt = create_datatask("t", owner_id="u1")
        finish_task(dt.handle, state="DONE")
        data = self._detail(dt.handle)
        self.assertRegex(data["finished_at"], ISO_SECONDS_RE)
        self.assertNotIn(".", data["finished_at"])

    def test_finished_at_is_null_while_running(self):
        dt = create_datatask("t", owner_id="u1")
        data = self._detail(dt.handle)
        self.assertIsNone(data["finished_at"])

    def test_task_list_timestamps_have_no_fractional_seconds(self):
        create_datatask("t1", owner_id="u1")
        response = self.client.get(reverse("api:api_task_list"), headers=self.header)
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content)
        for task in data["tasks"]:
            self.assertRegex(task["created_at"], ISO_SECONDS_RE)
