from salt import acl
from tests.support.unit import TestCase


class ClientACLTestCase(TestCase):
    """
    Unit tests for salt.acl.ClientACL
    """

    def setUp(self):
        self.blacklist = {
            "users": ["joker", "penguin", "*bad_*", "blocked_.*", "^Homer$"],
            "modules": ["cmd.run", "test.fib", "rm-rf.*"],
        }
        self.whitelist = {
            "users": ["testuser", "saltuser"],
            "modules": ["test.ping", "grains.items"],
        }

    def tearDown(self):
        del self.blacklist
        del self.whitelist

    def test_user_is_blacklisted(self):
        """
        test user_is_blacklisted
        """
        client_acl = acl.PublisherACL(self.blacklist)

        self.assertTrue(client_acl.user_is_blacklisted("joker"))
        self.assertTrue(client_acl.user_is_blacklisted("penguin"))
        self.assertTrue(client_acl.user_is_blacklisted("bad_"))
        self.assertTrue(client_acl.user_is_blacklisted("bad_user"))
        self.assertTrue(client_acl.user_is_blacklisted("bad_*"))
        self.assertTrue(client_acl.user_is_blacklisted("user_bad_"))
        self.assertTrue(client_acl.user_is_blacklisted("blocked_"))
        self.assertTrue(client_acl.user_is_blacklisted("blocked_user"))
        self.assertTrue(client_acl.user_is_blacklisted("blocked_.*"))
        self.assertTrue(client_acl.user_is_blacklisted("Homer"))

        self.assertFalse(client_acl.user_is_blacklisted("batman"))
        self.assertFalse(client_acl.user_is_blacklisted("robin"))
        self.assertFalse(client_acl.user_is_blacklisted("bad"))
        self.assertFalse(client_acl.user_is_blacklisted("blocked"))
        self.assertFalse(client_acl.user_is_blacklisted("NotHomer"))
        self.assertFalse(client_acl.user_is_blacklisted("HomerSimpson"))

    def test_cmd_is_blacklisted(self):
        """
        test cmd_is_blacklisted
        """
        client_acl = acl.PublisherACL(self.blacklist)

        self.assertTrue(client_acl.cmd_is_blacklisted("cmd.run"))
        self.assertTrue(client_acl.cmd_is_blacklisted("test.fib"))
        self.assertTrue(client_acl.cmd_is_blacklisted("rm-rf.root"))

        self.assertFalse(client_acl.cmd_is_blacklisted("cmd.shell"))
        self.assertFalse(client_acl.cmd_is_blacklisted("test.versions"))
        self.assertFalse(client_acl.cmd_is_blacklisted("arm-rf.root"))

        self.assertTrue(client_acl.cmd_is_blacklisted(["cmd.run", "state.sls"]))
        self.assertFalse(
            client_acl.cmd_is_blacklisted(["state.highstate", "state.sls"])
        )

    def test_user_is_whitelisted(self):
        """
        test user_is_whitelisted
        """
        client_acl = acl.PublisherACL(self.whitelist)

        self.assertTrue(client_acl.user_is_whitelisted("testuser"))
        self.assertTrue(client_acl.user_is_whitelisted("saltuser"))
        self.assertFalse(client_acl.user_is_whitelisted("three"))
        self.assertFalse(client_acl.user_is_whitelisted("hans"))

    def test_cmd_is_whitelisted(self):
        """
        test cmd_is_whitelisted
        """
        client_acl = acl.PublisherACL(self.whitelist)

        self.assertTrue(client_acl.cmd_is_whitelisted("test.ping"))
        self.assertTrue(client_acl.cmd_is_whitelisted("grains.items"))
        self.assertFalse(client_acl.cmd_is_whitelisted("cmd.run"))
        self.assertFalse(client_acl.cmd_is_whitelisted("test.version"))
