# (c) cavaliba.com - test / factory reset / satellite tables (cmt, sms, api stat)

import tempfile

from django.core.cache import cache as cache_django
from django.test import TestCase, override_settings
from django.utils import timezone

import app_home.cache as cache
from app_cmt.models import CMTDay, CMTHour, CMTRaw
from app_home.factory import FACTORY_RESET_MODELS, factory_reset
from app_home.models import CavalibaAPIStat
from app_sirene.models import SMSJournal


class TestFactoryResetTables(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()
        self.tmpdir = tempfile.mkdtemp()
        now = timezone.now()
        CMTRaw.objects.create(checkname="unittest_check", status=True, usec=42)
        CMTHour.objects.create(timestamp=now, checkname="unittest_check", count_ok=1, count_ko=0)
        CMTDay.objects.create(timestamp=now, checkname="unittest_check", count_ok=1, count_ko=0)
        SMSJournal.objects.create(created_by="unittest", mobile="+33600000000", content="hello")
        CavalibaAPIStat.objects.create(keyname="unittest_api", success_count=3)

    def _reset(self):
        with override_settings(
            CAVALIBA_FILESTORE=self.tmpdir,
            CAVALIBA_EXPORT_FOLDER=self.tmpdir,
            CAVALIBA_MAIL_FOLDER=self.tmpdir,
            CAVALIBA_SMS_FOLDER=self.tmpdir,
        ):
            return factory_reset(aaa={"username": "admin"}, with_demo=False)

    def test_cmt_tables_are_purged(self):
        report = self._reset()

        self.assertEqual(CMTRaw.objects.count(), 0)
        self.assertEqual(CMTHour.objects.count(), 0)
        self.assertEqual(CMTDay.objects.count(), 0)
        self.assertEqual(report["deleted"]["cmt_raw"], 1)
        self.assertEqual(report["deleted"]["cmt_hour"], 1)
        self.assertEqual(report["deleted"]["cmt_day"], 1)

    def test_sms_journal_and_api_stat_are_purged(self):
        report = self._reset()

        self.assertEqual(SMSJournal.objects.count(), 0)
        self.assertEqual(CavalibaAPIStat.objects.count(), 0)
        self.assertEqual(report["deleted"]["sms_journal"], 1)
        self.assertEqual(report["deleted"]["api_stat"], 1)

    def test_report_covers_every_listed_table(self):
        report = self._reset()

        self.assertEqual(
            sorted(report["deleted"].keys()),
            sorted(label for label, _model in FACTORY_RESET_MODELS),
        )
