# (c) cavaliba.com - test / app_data.eav.eav_purge (orphan removal, dryrun default)

from django.core.cache import cache as cache_django
from django.test import TestCase

import app_home.cache as cache
from app_data.eav import eav_purge
from app_data.models import DataEAV, DataInstance
from tests import helper


class TestEavPurgeOrphan(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()
        helper.add_schema("testpurge")
        helper.add_instance("testpurge", "keep01")
        helper.add_instance("testpurge", "orphan01")
        self.assertTrue(DataEAV.objects.filter(keyname="orphan01").exists())
        # delete the instance row only: its EAV rows stay behind as orphans,
        # exactly what a bulk delete or a crashed write leaves in data_cache
        DataInstance.objects.filter(classname="testpurge", keyname="orphan01").delete()

    def test_default_call_deletes_orphans(self):
        # no argument at all: the daily housekeeping call shape
        count_delete, count_total = eav_purge()

        self.assertFalse(DataEAV.objects.filter(keyname="orphan01").exists())
        self.assertGreaterEqual(count_delete, 1)
        self.assertGreaterEqual(count_total, count_delete)

    def test_default_call_keeps_live_instances(self):
        eav_purge()

        self.assertTrue(DataEAV.objects.filter(keyname="keep01").exists())
        self.assertTrue(
            DataInstance.objects.filter(classname="testpurge", keyname="keep01").exists()
        )

    def test_dryrun_true_keeps_orphans(self):
        count_delete, _count_total = eav_purge(dryrun=True)

        self.assertTrue(DataEAV.objects.filter(keyname="orphan01").exists())
        self.assertGreaterEqual(count_delete, 1)
