Files
Jarvis-Ai/tests/unit/test_privacy.py
T

117 lines
4.3 KiB
Python

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_medical_questions_are_always_never(self) -> None:
for question in (
"Wenn ich blute, sollte ich dann zum Arzt?",
"Welche Symptome hat eine Grippe?",
"Wie nehme ich dieses Medikament ein?",
"Was bedeutet diese Diagnose?",
"Wie sollte eine Verletzung behandelt werden?",
):
with self.subTest(question=question):
self.assertEqual(
self.router.classify(question).policy,
CloudPolicy.NEVER,
)
def test_technical_terms_cannot_override_medical_never(self) -> None:
decision = self.router.classify(
"Wie speichere ich meine Symptome und Diagnose mit Python in SQLite?"
)
self.assertEqual(decision.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()