import unittest
from unittest.mock import MagicMock

from .watch_master import WatchMaster
from .access_control import AccessControl

class TestWatchMaster(unittest.TestCase):

    def setUp(self):
        self.access_control = AccessControl()
        self.watch_master = WatchMaster(self.access_control)

    def test_enforce_allowed(self):
        mock_operation = MagicMock(return_value="Operation Result")
        result = self.watch_master.enforce(mock_operation, 1, 2, context={"user": "test_user"}, kwarg1="value1")
        self.assertEqual(result, "Operation Result")
        mock_operation.assert_called_once_with(1, 2, kwarg1="value1")

    def test_enforce_denied(self):
        self.access_control.is_allowed = MagicMock(return_value=False)
        mock_operation = MagicMock()
        with self.assertRaises(PermissionError):
            self.watch_master.enforce(mock_operation)
        mock_operation.assert_not_called()

    def test_check_access_allowed(self):
        self.access_control.is_allowed = MagicMock(return_value=True)
        mock_operation = MagicMock()
        self.assertTrue(self.watch_master.check_access(mock_operation, context={"user": "test_user"}))
        self.access_control.is_allowed.assert_called_once_with(mock_operation, {"user": "test_user"})

    def test_check_access_denied(self):
        self.access_control.is_allowed = MagicMock(return_value=False)
        mock_operation = MagicMock()
        self.assertFalse(self.watch_master.check_access(mock_operation))
        self.access_control.is_allowed.assert_called_once_with(mock_operation, None)

    def test_bypass_allowed(self):
        self.watch_master = WatchMaster(self.access_control, bypass_allowed=True)
        mock_operation = MagicMock(return_value="Bypassed Result")
        result = self.watch_master.enforce(mock_operation)
        self.assertEqual(result, "Bypassed Result")
        mock_operation.assert_called_once()

if __name__ == '__main__':
    unittest.main()
