Files

81 lines
2.6 KiB
Python

import unittest
from keyring.errors import PasswordDeleteError
from javis.interface.cli import run_secrets
from javis.security.secrets import GEMINI_ACCOUNT, SERVICE_NAME, SecretProvider
class _FakeBackend:
def __init__(self) -> None:
self.values: dict[tuple[str, str], str] = {}
def get_password(self, service: str, account: str) -> str | None:
return self.values.get((service, account))
def set_password(self, service: str, account: str, value: str) -> None:
self.values[(service, account)] = value
def delete_password(self, service: str, account: str) -> None:
try:
del self.values[(service, account)]
except KeyError as exc:
raise PasswordDeleteError("missing") from exc
class SecretProviderTests(unittest.TestCase):
def setUp(self) -> None:
self.backend = _FakeBackend()
self.provider = SecretProvider(self.backend)
def test_key_is_initially_not_available(self) -> None:
self.assertFalse(self.provider.gemini_key_available())
def test_set_and_delete_key(self) -> None:
self.provider.set_gemini_key("test-secret-value")
self.assertTrue(self.provider.gemini_key_available())
self.assertEqual(
self.backend.values[(SERVICE_NAME, GEMINI_ACCOUNT)],
"test-secret-value",
)
self.assertTrue(self.provider.delete_gemini_key())
self.assertFalse(self.provider.gemini_key_available())
def test_cli_set_uses_hidden_input_and_never_outputs_value(self) -> None:
output: list[str] = []
secret = "test-secret-value"
result = run_secrets(
"set",
provider=self.provider,
password_fn=lambda _prompt: secret,
output=output.append,
)
self.assertEqual(result, 0)
self.assertTrue(self.provider.gemini_key_available())
self.assertNotIn(secret, "\n".join(output))
def test_cli_status_only_reports_availability(self) -> None:
output: list[str] = []
self.provider.set_gemini_key("test-secret-value")
result = run_secrets("status", provider=self.provider, output=output.append)
self.assertEqual(result, 0)
self.assertEqual(output, ["Gemini-Schlüssel: verfügbar"])
self.assertNotIn("test-secret-value", "\n".join(output))
def test_cli_delete_handles_missing_key(self) -> None:
output: list[str] = []
result = run_secrets("delete", provider=self.provider, output=output.append)
self.assertEqual(result, 0)
self.assertEqual(output, ["Gemini-Schlüssel war nicht verfügbar."])
if __name__ == "__main__":
unittest.main()