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: self.assertEqual( self.router.classify("Wie funktioniert SQLite in Python?").policy, CloudPolicy.ALLOWED, ) 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()