from __future__ import annotations from typing import Any from ariadne.services.keycloak_admin import KeycloakAdminClient def test_set_user_attribute_preserves_profile(monkeypatch) -> None: client = KeycloakAdminClient() captured: dict[str, Any] = {} def fake_find_user(username: str) -> dict[str, Any]: return {"id": "user-123"} def fake_get_user(user_id: str) -> dict[str, Any]: return { "id": user_id, "username": "alice", "email": "alice@bstein.dev", "emailVerified": True, "enabled": True, "firstName": "Alice", "lastName": "Smith", "requiredActions": ["UPDATE_PASSWORD", 123], "attributes": {"existing": ["value"]}, } def fake_update_user(user_id: str, payload: dict[str, Any]) -> None: captured["user_id"] = user_id captured["payload"] = payload monkeypatch.setattr(client, "find_user", fake_find_user) monkeypatch.setattr(client, "get_user", fake_get_user) monkeypatch.setattr(client, "update_user", fake_update_user) client.set_user_attribute("alice", "mailu_app_password", "secret") payload = captured.get("payload") or {} assert payload.get("username") == "alice" assert payload.get("email") == "alice@bstein.dev" assert payload.get("emailVerified") is True assert payload.get("enabled") is True assert payload.get("firstName") == "Alice" assert payload.get("lastName") == "Smith" assert payload.get("requiredActions") == ["UPDATE_PASSWORD"] assert payload.get("attributes") == { "existing": ["value"], "mailu_app_password": ["secret"], } def test_update_user_safe_merges_payload(monkeypatch) -> None: client = KeycloakAdminClient() captured: dict[str, Any] = {} def fake_get_user(user_id: str) -> dict[str, Any]: return { "id": user_id, "username": "alice", "enabled": True, "attributes": {"existing": ["value"]}, } def fake_update_user(user_id: str, payload: dict[str, Any]) -> None: captured["user_id"] = user_id captured["payload"] = payload monkeypatch.setattr(client, "get_user", fake_get_user) monkeypatch.setattr(client, "update_user", fake_update_user) client.update_user_safe( "user-123", {"attributes": {"new": ["item"]}, "requiredActions": ["UPDATE_PASSWORD"]}, ) payload = captured.get("payload") or {} assert payload.get("username") == "alice" assert payload.get("attributes") == {"existing": ["value"], "new": ["item"]} assert payload.get("requiredActions") == ["UPDATE_PASSWORD"]