# (c) cavaliba.com - tests / log2 - one HTTP request = one request id, current client IP

from django.contrib.sessions.backends.db import SessionStore
from django.core.cache import cache as cache_django
from django.test import RequestFactory, TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from app_data.aaa import start_view
from app_home.log import log2, reset_on_request_started
from app_home.models import CavalibaEvent
from tests import helper


@override_settings(CAVALIBA_AUTH_MODE="unittest")
class TestLog2RequestContext(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()
        helper.add_user_with_perm(login="unittest", perms=["p_log_view"])

    def _last_list_event(self):
        return CavalibaEvent.objects.filter(action="log.list").order_by("-id").first()

    def test_proxy_request_id_kept_through_start_view(self):
        self.client.get(reverse("app_home:log"), HTTP_X_REQUEST_ID="proxy-rid-1")
        self.assertEqual(self._last_list_event().request_id, "proxy-rid-1")

    def test_start_view_keeps_the_request_started_id(self):
        # no X-Request-ID header: the id generated by request_started must survive start_view
        request = RequestFactory().get("/home/private/log/", REMOTE_ADDR="10.7.7.9")
        request.session = SessionStore()
        reset_on_request_started(environ=request.META)
        request_id = log2.ambient()["request_id"]
        start_view(request, app="home", view="log", perm="p_log_view")
        self.assertEqual(log2.ambient()["request_id"], request_id)
        self.assertEqual(log2.ambient()["actor"], "unittest")

    def test_each_request_gets_its_own_request_id(self):
        self.client.get(reverse("app_home:log"))
        first = self._last_list_event().request_id
        self.client.get(reverse("app_home:log"))
        self.assertNotEqual(self._last_list_event().request_id, first)

    def test_client_ip_is_the_current_request_not_the_session(self):
        self.client.get(reverse("app_home:log"), REMOTE_ADDR="10.7.7.1")
        self.assertEqual(self._last_list_event().client_ip, "10.7.7.1")
        self.client.get(reverse("app_home:log"), REMOTE_ADDR="10.7.7.2")
        event = self._last_list_event()
        self.assertEqual(event.client_ip, "10.7.7.2")
        self.assertEqual(event.actor, "unittest")
