from __future__ import annotations import unittest from .redaction import RedactionError, assert_no_leaks, redact, scan_for_leaks class RedactionTests(unittest.TestCase): def test_recursive_canary_redaction_across_all_evidence_surfaces(self) -> None: canary = "canary-value-93f1" evidence = { canary + "-key": "key canary", "environment": {"OPENAI_API_KEY": canary, "SAFE_MODE": "on"}, "argv": ["--token", canary], "stdout": "output " + canary, "stderr": "error " + canary, "exception": RuntimeError("failed with " + canary), "nested": [{"GITHUB_TOKEN": "another-value"}], } self.assertTrue(scan_for_leaks(evidence, canaries=[canary])) redacted = redact(evidence, canaries=[canary]) assert_no_leaks(redacted, canaries=[canary]) self.assertEqual(redacted["environment"]["SAFE_MODE"], "on") self.assertNotIn(canary, str(redacted)) self.assertIn("[REDACTED]", str(redacted)) def test_configured_name_pattern_is_precise_for_safe_fields(self) -> None: evidence = { "status": "passed", "provider": "fixture", "tokenCount": 2, "MY_SECRET_ALPHA": "fixture-secret", "message": "MY_SECRET_ALPHA was used", } patterns = [r"(? None: with self.assertRaises(RedactionError): assert_no_leaks( {"observation": "GITHUB_TOKEN still visible"}, canaries=["a-secret-canary"], ) if __name__ == "__main__": unittest.main()