# (c) cavaliba.com - tests / log2 - transient debug lines

import logging

from django.test import TestCase

from app_home.log import WARNING, log2
from app_home.models import CavalibaEvent


class TestLog2Debug(TestCase):
    def setUp(self):
        log2.reset(channel="web", actor="alice")

    def test_debug_is_never_stored(self):
        before = CavalibaEvent.objects.count()
        with self.assertLogs("cavaliba.debug", level="DEBUG"):
            log2.debug("transient %s", 1)
            log2.debug("transient warning", level=WARNING)
        self.assertEqual(CavalibaEvent.objects.count(), before)

    def test_debug_record_names_caller_module_and_line(self):
        with self.assertLogs("cavaliba.debug", level="DEBUG") as captured:
            log2.debug("from the test %s", "module")
        record = captured.records[0]
        self.assertEqual(record.name, f"cavaliba.debug.{__name__}")
        self.assertEqual(record.getMessage(), "from the test module")
        self.assertEqual(record.filename, "test_log2_debug.py")
        self.assertEqual(record.funcName, "test_debug_record_names_caller_module_and_line")

    def test_debug_level_and_ambient_carried(self):
        with self.assertLogs("cavaliba.debug", level="DEBUG") as captured:
            log2.debug("warn", level=WARNING, extra={"k": "v"})
        record = captured.records[0]
        self.assertEqual(record.levelno, logging.WARNING)
        self.assertEqual(record.ambient["actor"], "alice")
        self.assertEqual(record.ambient["extra"], {"k": "v"})

    def test_debug_disabled_emits_nothing(self):
        # tests run with the debug stream routed nowhere (level above CRITICAL)
        logger = logging.getLogger(f"cavaliba.debug.{__name__}")
        self.assertFalse(logger.isEnabledFor(logging.CRITICAL))
        before = CavalibaEvent.objects.count()
        log2.debug("not emitted %s", object())
        self.assertEqual(CavalibaEvent.objects.count(), before)
