# (c) cavaliba.com - tests / data / instance last_update & last_sync write precision

from django.test import TestCase

import app_home.cache as cache
from app_data.data import Instance
from app_data.models import DataInstance
from tests import helper

AAA = {"username": "testuser", "perms": ["p_data_admin"]}
AAA_SYNC = {"username": "testuser", "perms": ["p_data_admin"], "sync_mode": True}

SCHEMA = "tsprec"


class TestInstanceTimestampSecondPrecision(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_schema(
            classname=SCHEMA,
            field_definition={"mystring": {"dataformat": "string", "displayname": "MyString"}},
        )

    def _create(self, keyname, aaa=AAA):
        instance = Instance(classname=SCHEMA)
        instance.merge_import({"classname": SCHEMA, "keyname": keyname, "mystring": "v1"}, aaa=aaa)
        instance.save(aaa=aaa, action="create")
        return instance

    def test_create_sets_last_update_without_microseconds(self):
        instance = self._create("obj01")
        self.assertIsNotNone(instance.last_update)
        self.assertEqual(instance.last_update.microsecond, 0)

    def test_last_update_stored_without_microseconds(self):
        self._create("obj02")
        iobj = DataInstance.objects.get(classname=SCHEMA, keyname="obj02")
        self.assertEqual(iobj.last_update.microsecond, 0)

    def test_update_sets_last_update_without_microseconds(self):
        self._create("obj03")
        instance = Instance.from_keyname(SCHEMA, "obj03")
        instance.set_field_value_single("mystring", "v2")
        instance.save(aaa=AAA)
        iobj = DataInstance.objects.get(classname=SCHEMA, keyname="obj03")
        self.assertEqual(iobj.last_update.microsecond, 0)

    def test_sync_mode_sets_last_sync_without_microseconds(self):
        self._create("obj04", aaa=AAA_SYNC)
        iobj = DataInstance.objects.get(classname=SCHEMA, keyname="obj04")
        self.assertIsNotNone(iobj.last_sync)
        self.assertEqual(iobj.last_sync.microsecond, 0)

    def test_sync_only_touch_sets_last_sync_without_microseconds(self):
        self._create("obj05")
        # no diff, sync_mode on -> single-column last_sync UPDATE fast path
        instance = Instance.from_keyname(SCHEMA, "obj05")
        instance.save(aaa=AAA_SYNC)
        iobj = DataInstance.objects.get(classname=SCHEMA, keyname="obj05")
        self.assertIsNotNone(iobj.last_sync)
        self.assertEqual(iobj.last_sync.microsecond, 0)

    def test_delete_sets_last_update_without_microseconds(self):
        instance = self._create("obj06")
        self.assertTrue(instance.delete())
        self.assertEqual(instance.last_update.microsecond, 0)
