from __future__ import annotations from ariadne.services import keycloak_profile class _Admin: def __init__(self, users=None, *, ready: bool = True, fail_update: bool = False) -> None: self.users = users or [] self._ready = ready self.fail_update = fail_update self.calls = [] def ready(self) -> bool: return self._ready def iter_users(self, page_size=200, brief=False): return self.users def update_user_safe(self, user_id, payload) -> None: if self.fail_update: raise RuntimeError("update failed") self.calls.append((user_id, payload)) def test_profile_sync_ready_and_skip_edges(monkeypatch) -> None: assert not keycloak_profile._profile_complete({"email": "", "lastName": "User", "emailVerified": True}) assert not keycloak_profile._profile_complete({"email": "a@b.test", "lastName": "", "emailVerified": True}) assert not keycloak_profile._profile_complete({"email": "a@b.test", "lastName": "User", "emailVerified": False}) monkeypatch.setattr(keycloak_profile, "keycloak_admin", _Admin(ready=False)) summary = keycloak_profile.run_profile_sync() assert summary.failures == 1 assert summary.detail == "keycloak admin not configured" users = [ {}, {"username": "disabled", "enabled": False}, {"username": "service-account-demo", "requiredActions": ["UPDATE_PROFILE"]}, {"username": "svc", "serviceAccountClientId": "client", "requiredActions": ["UPDATE_PROFILE"]}, {"username": "no-actions", "email": "no-actions@bstein.dev", "lastName": "User", "emailVerified": True}, {"username": "incomplete", "requiredActions": ["UPDATE_PROFILE"]}, { "username": "other-action", "id": "2", "email": "other@bstein.dev", "lastName": "User", "emailVerified": True, "requiredActions": ["CONFIGURE_TOTP"], }, { "username": "missing-id", "email": "missing@bstein.dev", "lastName": "User", "emailVerified": True, "requiredActions": ["UPDATE_PROFILE"], }, ] monkeypatch.setattr(keycloak_profile, "keycloak_admin", _Admin(users)) summary = keycloak_profile.run_profile_sync() assert summary.skipped == 7 assert summary.failures == 1 def test_profile_sync_update_failure(monkeypatch) -> None: users = [ { "id": "1", "username": "alice", "email": "alice@bstein.dev", "lastName": "User", "emailVerified": True, "requiredActions": ["UPDATE_PROFILE", "CONFIGURE_TOTP"], } ] monkeypatch.setattr(keycloak_profile, "keycloak_admin", _Admin(users, fail_update=True)) summary = keycloak_profile.run_profile_sync() assert summary.processed == 1 assert summary.updated == 0 assert summary.failures == 1