from __future__ import annotations from dataclasses import dataclass from ariadne.services.vaultwarden import VaultwardenInvite from ariadne.services import vaultwarden_sync @dataclass class DummyAdmin: ready_value: bool = True users: list[dict] = None attrs: dict[str, dict] = None set_calls: list[tuple[str, str, str]] = None def ready(self) -> bool: return self.ready_value def iter_users(self, page_size: int = 200, brief: bool = False): return self.users or [] def get_user(self, user_id: str): return self.attrs.get(user_id, {}) if self.attrs else {} def set_user_attribute(self, username: str, key: str, value: str) -> None: if self.set_calls is None: self.set_calls = [] self.set_calls.append((username, key, value)) def test_vaultwarden_sync_requires_admin(monkeypatch) -> None: dummy = DummyAdmin(ready_value=False) monkeypatch.setattr(vaultwarden_sync, "keycloak_admin", dummy) summary = vaultwarden_sync.run_vaultwarden_sync() assert summary.failures == 1 assert summary.detail == "keycloak admin not configured" def test_vaultwarden_sync_skips_when_missing_mailbox(monkeypatch) -> None: dummy = DummyAdmin( users=[{"id": "1", "username": "alice", "enabled": True, "attributes": {"mailu_email": ["alice@bstein.dev"]}}], attrs={"1": {"id": "1", "username": "alice", "attributes": {"mailu_email": ["alice@bstein.dev"]}}}, ) monkeypatch.setattr(vaultwarden_sync, "keycloak_admin", dummy) monkeypatch.setattr(vaultwarden_sync.mailu, "mailbox_exists", lambda email: False) summary = vaultwarden_sync.run_vaultwarden_sync() assert summary.skipped == 1 assert summary.processed == 0 def test_vaultwarden_sync_invites(monkeypatch) -> None: dummy = DummyAdmin( users=[{"id": "1", "username": "alice", "enabled": True, "attributes": {"mailu_email": ["alice@bstein.dev"]}}], attrs={"1": {"id": "1", "username": "alice", "attributes": {"mailu_email": ["alice@bstein.dev"]}}}, ) monkeypatch.setattr(vaultwarden_sync, "keycloak_admin", dummy) monkeypatch.setattr(vaultwarden_sync.mailu, "mailbox_exists", lambda email: True) monkeypatch.setattr(vaultwarden_sync.vaultwarden, "invite_user", lambda email: VaultwardenInvite(True, "invited")) summary = vaultwarden_sync.run_vaultwarden_sync() assert summary.created_or_present == 1 assert dummy.set_calls