import pytest from django.http import HttpRequest, HttpResponse from apps.core.consent import CONSENT_COOKIE_NAME, ConsentService @pytest.mark.django_db def test_consent_round_trip(rf): request = HttpRequest() response = HttpResponse() ConsentService.set_consent(response, analytics=True, advertising=False) cookie = response.cookies[CONSENT_COOKIE_NAME].value request.COOKIES[CONSENT_COOKIE_NAME] = cookie state = ConsentService.get_consent(request) assert state.analytics is True assert state.advertising is False @pytest.mark.django_db def test_consent_post_view(client): resp = client.post("/consent/", {"accept_all": "1"}, follow=False) assert resp.status_code == 302 assert CONSENT_COOKIE_NAME in resp.cookies @pytest.mark.django_db def test_consent_get_without_cookie_defaults_false(): request = HttpRequest() state = ConsentService.get_consent(request) assert state.analytics is False assert state.advertising is False assert state.requires_prompt is True @pytest.mark.django_db def test_consent_malformed_cookie_returns_safe_default(): request = HttpRequest() request.COOKIES[CONSENT_COOKIE_NAME] = "not=a=valid%%%cookie" state = ConsentService.get_consent(request) assert state.analytics is False assert state.advertising is False @pytest.mark.django_db def test_consent_post_preferences(client): resp = client.post("/consent/", {"analytics": "1", "advertising": ""}) assert resp.status_code == 302 value = resp.cookies[CONSENT_COOKIE_NAME].value assert "a=1" in value assert "d=0" in value @pytest.mark.django_db def test_consent_get_method_not_allowed(client): resp = client.get("/consent/") assert resp.status_code == 405 @pytest.mark.django_db def test_cookie_banner_hides_after_consent(client, home_page): first = client.get("/") assert "id=\"cookie-banner\"" in first.content.decode() consented = client.post("/consent/", {"accept_all": "1"}) cookie_value = consented.cookies[CONSENT_COOKIE_NAME].value client.cookies[CONSENT_COOKIE_NAME] = cookie_value second = client.get("/") assert "id=\"cookie-banner\"" not in second.content.decode()