"""event_matcher tests"""
from django.test import TestCase
from guardian.shortcuts import get_anonymous_user

from authentik.events.models import Event, EventAction
from authentik.policies.event_matcher.models import EventMatcherPolicy
from authentik.policies.types import PolicyRequest


class TestEventMatcherPolicy(TestCase):
    """EventMatcherPolicy tests"""

    def test_match_action(self):
        """Test match action"""
        event = Event.new(EventAction.LOGIN)
        request = PolicyRequest(get_anonymous_user())
        request.context["event"] = event
        policy: EventMatcherPolicy = EventMatcherPolicy.objects.create(
            action=EventAction.LOGIN
        )
        response = policy.passes(request)
        self.assertTrue(response.passing)
        self.assertTupleEqual(response.messages, ("Action matched.",))

    def test_match_client_ip(self):
        """Test match client_ip"""
        event = Event.new(EventAction.LOGIN)
        event.client_ip = "1.2.3.4"
        request = PolicyRequest(get_anonymous_user())
        request.context["event"] = event
        policy: EventMatcherPolicy = EventMatcherPolicy.objects.create(
            client_ip="1.2.3.4"
        )
        response = policy.passes(request)
        self.assertTrue(response.passing)
        self.assertTupleEqual(response.messages, ("Client IP matched.",))

    def test_match_app(self):
        """Test match app"""
        event = Event.new(EventAction.LOGIN)
        event.app = "foo"
        request = PolicyRequest(get_anonymous_user())
        request.context["event"] = event
        policy: EventMatcherPolicy = EventMatcherPolicy.objects.create(app="foo")
        response = policy.passes(request)
        self.assertTrue(response.passing)
        self.assertTupleEqual(response.messages, ("App matched.",))

    def test_drop(self):
        """Test drop event"""
        event = Event.new(EventAction.LOGIN)
        event.client_ip = "1.2.3.4"
        request = PolicyRequest(get_anonymous_user())
        request.context["event"] = event
        policy: EventMatcherPolicy = EventMatcherPolicy.objects.create(
            client_ip="1.2.3.5"
        )
        response = policy.passes(request)
        self.assertFalse(response.passing)

    def test_invalid(self):
        """Test passing event"""
        request = PolicyRequest(get_anonymous_user())
        policy: EventMatcherPolicy = EventMatcherPolicy.objects.create(
            client_ip="1.2.3.4"
        )
        response = policy.passes(request)
        self.assertFalse(response.passing)
