"""Unit-Tests für die minimalen Applicability-Prädikate."""
from compliance.services.obligation_applicability import (
    applicable, direct_marketing, has_third_country_transfer,
    uses_legitimate_interest,
)


class TestThirdCountry:
    def test_drittland_present(self):
        assert has_third_country_transfer("übermittlung in ein drittland erfolgt") is True

    def test_scc_present(self):
        assert has_third_country_transfer("auf basis der standardvertragsklauseln") is True

    def test_absent(self):
        assert has_third_country_transfer("verarbeitung nur innerhalb deutschlands") is False


class TestLegitimateInterest:
    def test_present(self):
        assert uses_legitimate_interest("auf grundlage unseres berechtigten interesses") is True

    def test_absent(self):
        assert uses_legitimate_interest("nur auf grundlage ihrer einwilligung") is False


class TestDirectMarketing:
    def test_newsletter(self):
        assert direct_marketing("anmeldung zum newsletter möglich") is True

    def test_direktwerbung(self):
        assert direct_marketing("daten für direktwerbung genutzt") is True

    def test_absent(self):
        assert direct_marketing("wir versenden keine werblichen inhalte ohne basis") is True  # 'werbliche' trifft

    def test_truly_absent(self):
        assert direct_marketing("reine vertragsabwicklung") is False


class TestApplicableHook:
    def test_known_predicate_true(self):
        assert applicable("has_third_country_transfer", "Transfer in die USA") is True

    def test_known_predicate_false_triggers_na(self):
        assert applicable("has_third_country_transfer", "nur in der EU") is False

    def test_public_task_alias(self):
        assert applicable("legitimate_interest_or_public_task",
                          "zur ausübung öffentlicher gewalt") is True

    def test_unknown_predicate_returns_none(self):
        # profiling noch nicht modelliert → None → Aufrufer behält anwendbar
        assert applicable("profiling", "irgendein text") is None

    def test_case_insensitive(self):
        assert applicable("uses_legitimate_interest", "BERECHTIGTES INTERESSE") is True
