# (c) cavaliba.com - tests / settings - CAVALIBA_LOG_* env parsing and LOGGING shape

import os
from unittest.mock import patch

from django.conf import settings
from django.test import SimpleTestCase

from core.settings import _log_config_warnings, _log_handlers, _log_level, _log_routes


class TestLogSettingsParsing(SimpleTestCase):
    def test_routes(self):
        with patch.dict(os.environ, {"CAVALIBA_LOG_DEBUG_TO": " stdout , FILE ,bogus"}):
            self.assertEqual(_log_routes("DEBUG_TO", ""), ["stdout", "file"])
        with patch.dict(os.environ, {}, clear=False):
            os.environ.pop("CAVALIBA_LOG_EVENT_TO", None)
            self.assertEqual(_log_routes("EVENT_TO", "stdout"), ["stdout"])

    def test_level_validation(self):
        with patch.dict(os.environ, {"CAVALIBA_LOG_SYSTEM_LEVEL": "warning"}):
            self.assertEqual(_log_level("SYSTEM_LEVEL", "INFO"), "WARNING")
        with patch.dict(os.environ, {"CAVALIBA_LOG_SYSTEM_LEVEL": "loud"}):
            self.assertEqual(_log_level("SYSTEM_LEVEL", "INFO"), "INFO")

    def test_unrouted_stream_gets_null_handler(self):
        self.assertEqual(_log_handlers([]), ["null"])
        self.assertEqual(_log_handlers(["stdout"]), ["stdout"])

    def test_logging_streams_do_not_propagate(self):
        loggers = settings.LOGGING["loggers"]
        self.assertFalse(loggers["cavaliba.event"]["propagate"])
        self.assertFalse(loggers["cavaliba.debug"]["propagate"])
        self.assertEqual(loggers["django.db.backends"]["level"], "WARNING")
        self.assertEqual(loggers["django"]["handlers"], [])

    def test_config_warnings(self):
        self.assertEqual(_log_config_warnings({}), [])
        self.assertEqual(_log_config_warnings({"CAVALIBA_LOG_EVENT_TO": "stdout,file",
                                               "CAVALIBA_LOG_FILE": "/tmp/x.json"}), [])  # fmt: skip
        warnings = _log_config_warnings({
            "CAVALIBA_LOG_EVENT_TO": "stdout;file", "CAVALIBA_LOG_SYSTEM_TO": "file",
            "CAVALIBA_LOG_DEBUG_LEVEL": "loud", "CAVALIBA_LOG_STDOUT": "xml",
        })  # fmt: skip
        text = " | ".join(warnings)
        self.assertEqual(len(warnings), 4, warnings)
        self.assertIn("CAVALIBA_LOG_EVENT_TO: unknown destination", text)
        self.assertIn("CAVALIBA_LOG_SYSTEM_TO=file but CAVALIBA_LOG_FILE is empty", text)
        self.assertIn("CAVALIBA_LOG_DEBUG_LEVEL='loud'", text)
        self.assertIn("CAVALIBA_LOG_STDOUT='xml'", text)

    def test_debug_file_satisfies_debug_route(self):
        env = {"CAVALIBA_LOG_DEBUG_TO": "file", "CAVALIBA_LOG_DEBUG_FILE": "/tmp/d.log"}
        self.assertEqual(_log_config_warnings(env), [])
