import unittest from javis.providers.base import ChatMessage from javis.security.privacy import CloudPolicy, PrivacyRouter class PrivacyRouterTests(unittest.TestCase): def setUp(self) -> None: self.router = PrivacyRouter() def test_general_technical_question_is_allowed(self) -> None: for question in ( "Erkläre in zwei Sätzen den Unterschied zwischen RAM und SSD.", "Wie funktioniert eine SQLite-Transaktion?", "Was bedeutet HTTP 404?", "Wie funktioniert Git?", ): with self.subTest(question=question): self.assertEqual( self.router.classify(question).policy, CloudPolicy.ALLOWED, ) def test_internal_server_question_requires_approval(self) -> None: decision = self.router.classify( "Wie konfiguriere ich den internen Server mit Hostname srv-intern-01?" ) self.assertEqual(decision.policy, CloudPolicy.ASK) def test_technical_question_with_api_key_is_never(self) -> None: decision = self.router.classify("Wie nutze ich diesen API-Key in Python: AIza" + "x" * 25) self.assertEqual(decision.policy, CloudPolicy.NEVER) def test_personal_technical_situation_requires_approval(self) -> None: decision = self.router.classify( "Meine SSD ist voll. Wie verschiebe ich meine persönlichen Dateien?" ) self.assertEqual(decision.policy, CloudPolicy.ASK) def test_personal_information_requires_approval(self) -> None: self.assertEqual( self.router.classify("Ich möchte meinen Alltag besser planen.").policy, CloudPolicy.ASK, ) def test_family_information_requires_approval(self) -> None: self.assertEqual( self.router.classify("Meine Frau hat morgen einen Termin.").policy, CloudPolicy.ASK, ) def test_secret_pattern_is_never(self) -> None: decision = self.router.classify("Mein API-Key ist AIza" + "x" * 25) self.assertEqual(decision.policy, CloudPolicy.NEVER) def test_financial_and_health_information_are_never(self) -> None: self.assertEqual( self.router.classify("Meine IBAN ist ein Geheimnis.").policy, CloudPolicy.NEVER, ) self.assertEqual( self.router.classify("Meine Diagnose soll ausgewertet werden.").policy, CloudPolicy.NEVER, ) def test_unknown_content_is_conservatively_ask(self) -> None: self.assertEqual( self.router.classify("Erkläre das bitte genauer.").policy, CloudPolicy.ASK, ) def test_explicit_cloud_request_cannot_override_never(self) -> None: decision = self.router.classify( "Sende mein Passwort an die Cloud.", cloud_requested=True, ) self.assertEqual(decision.policy, CloudPolicy.NEVER) def test_minimal_context_excludes_sensitive_history(self) -> None: messages = [ ChatMessage("user", "Meine Diagnose ist privat."), ChatMessage("assistant", "Das bleibt lokal."), ChatMessage("user", "Wie funktioniert SQLite?"), ] selected = self.router.minimal_context( messages, current_policy=CloudPolicy.ALLOWED, approved=False, max_chars=1_000, max_messages=6, ) self.assertEqual(selected, [ChatMessage("user", "Wie funktioniert SQLite?")]) if __name__ == "__main__": unittest.main()