# (c) cavaliba.com - tests / log2 - Celery task_prerun / task_postrun binding

from types import SimpleNamespace

from django.test import TestCase

from app_home.log import log2
from core.celery import _log_task_postrun, _log_task_prerun, _task_aaa

ALICE = {"username": "alice", "is_authenticated": True, "user_ip": "10.1.1.1"}


class TestLog2CeleryBinding(TestCase):
    def test_task_aaa_from_kwarg(self):
        self.assertEqual(_task_aaa((), {"aaa": ALICE}), ALICE)

    def test_task_aaa_from_params_dict(self):
        self.assertEqual(_task_aaa(("handle", {"spec": {}, "aaa": ALICE}), {}), ALICE)

    def test_task_aaa_absent_or_invalid(self):
        self.assertIsNone(_task_aaa((), {}))
        self.assertIsNone(_task_aaa(None, None))
        self.assertIsNone(_task_aaa((), {"aaa": {"perms": []}}))

    def test_prerun_binds_requester_and_postrun_restores(self):
        log2.reset(channel="web", actor="outer")
        task = SimpleNamespace(name="app_sirene.mail.task_send_mail")
        _log_task_prerun(task_id="abcdef0123456789zz", task=task, args=(), kwargs={"aaa": ALICE})
        ambient = log2.ambient()
        self.assertEqual(ambient["channel"], "celery")
        self.assertEqual(ambient["origin"], "app_sirene.mail.task_send_mail")
        self.assertEqual(ambient["actor"], "alice")
        self.assertEqual(ambient["client_ip"], "10.1.1.1")
        self.assertEqual(ambient["request_id"], "abcdef0123456789")
        _log_task_postrun(task_id="abcdef0123456789zz")
        self.assertEqual(log2.ambient()["actor"], "outer")

    def test_prerun_without_aaa_is_system(self):
        _log_task_prerun(task_id="t2", task=SimpleNamespace(name="x"), args=(), kwargs={})
        self.assertEqual(log2.ambient()["actor"], "system")
        _log_task_postrun(task_id="t2")
