"""Non-destructive tests for firewall helpers.

These DO NOT call netsh — they only exercise pure functions / branches that
should never modify the system firewall state.
"""
from __future__ import annotations

import sys
import unittest
from unittest.mock import patch

from proxy_chain_manager import firewall


@unittest.skipUnless(sys.platform == "win32", "Windows-only firewall API")
class TestEmergencyDisengageGuard(unittest.TestCase):
    def test_no_op_when_not_engaged(self) -> None:
        """emergency_disengage() must NOT touch firewall state when our rules
        are not present (the audit fix to C-08)."""
        called = []
        with patch.object(firewall, "is_engaged", return_value=False), \
             patch.object(firewall, "_set_outbound_policy",
                          side_effect=lambda *_a, **_k: called.append("policy")), \
             patch.object(firewall, "_delete_rules",
                          side_effect=lambda *_a, **_k: called.append("delete")):
            firewall.emergency_disengage()
        self.assertEqual(called, [])

    def test_runs_disengage_when_engaged(self) -> None:
        called = []
        with patch.object(firewall, "is_engaged", return_value=True), \
             patch.object(firewall, "_set_outbound_policy",
                          side_effect=lambda *_a, **_k: called.append("policy")), \
             patch.object(firewall, "_delete_rules",
                          side_effect=lambda *_a, **_k: called.append("delete")):
            firewall.emergency_disengage()
        self.assertIn("policy", called)
        self.assertIn("delete", called)


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