from django.test import TestCase

from ..models import Ban


class BansManagerTests(TestCase):
    def setUp(self):
        Ban.objects.bulk_create(
            [
                Ban(check_type=Ban.USERNAME, banned_value="user"),
                Ban(check_type=Ban.EMAIL, banned_value="user@example.com"),
                Ban(check_type=Ban.IP, banned_value="127.0.0.1"),
            ]
        )

    def test_get_ban_for_banned_name(self):
        """get_ban finds ban for given username"""
        self.assertIsNotNone(Ban.objects.get_ban(username="User"))
        with self.assertRaises(Ban.DoesNotExist):
            Ban.objects.get_ban(username="OtherUser")

    def test_get_ban_for_banned_email(self):
        """get_ban finds ban for given email"""
        self.assertIsNotNone(Ban.objects.get_ban(email="user@example.com"))
        with self.assertRaises(Ban.DoesNotExist):
            Ban.objects.get_ban(email="otheruser@example.com")

    def test_get_ban_for_banned_ip(self):
        """get_ban finds ban for given ip"""
        self.assertIsNotNone(Ban.objects.get_ban(ip="127.0.0.1"))
        with self.assertRaises(Ban.DoesNotExist):
            Ban.objects.get_ban(ip="42.0.0.1")

    def test_get_ban_for_all_values(self):
        """get_ban finds ban for given values"""
        valid_kwargs = {"username": "User", "ip": "42.51.52.51"}
        self.assertIsNotNone(Ban.objects.get_ban(**valid_kwargs))

        invalid_kwargs = {"username": "OtherUser", "ip": "42.51.52.51"}
        with self.assertRaises(Ban.DoesNotExist):
            Ban.objects.get_ban(**invalid_kwargs)


class BanTests(TestCase):
    def test_check_value_literal(self):
        """ban correctly tests given values"""
        test_ban = Ban(banned_value="user")

        self.assertTrue(test_ban.check_value("User"))
        self.assertFalse(test_ban.check_value("OtherUser"))
        self.assertFalse(test_ban.check_value("UserOther"))

    def test_check_value_starts_with(self):
        """ban correctly tests given values"""
        test_ban = Ban(banned_value="user*")

        self.assertTrue(test_ban.check_value("User"))
        self.assertTrue(test_ban.check_value("UserOther"))
        self.assertFalse(test_ban.check_value("NewUser"))

    def test_check_value_middle_match(self):
        """ban correctly tests given values"""
        test_ban = Ban(banned_value="u*r")

        self.assertTrue(test_ban.check_value("User"))
        self.assertTrue(test_ban.check_value("UserOther"))
        self.assertFalse(test_ban.check_value("NewUser"))
        self.assertFalse(test_ban.check_value("UserNew"))

    def test_check_value_ends_witch(self):
        """ban correctly tests given values"""
        test_ban = Ban(banned_value="*user")

        self.assertTrue(test_ban.check_value("User"))
        self.assertTrue(test_ban.check_value("OtherUser"))
        self.assertFalse(test_ban.check_value("UserOther"))