from unittest.mock import AsyncMock from fastapi.testclient import TestClient from app.api.v1.endpoints import audit as audit_endpoint from app.auth.metadata_dependencies import ( get_current_metadata_admin, get_current_metadata_user, ) from tests.conftest import build_test_app, make_audit_log def _build_client(repo, *, metadata_admin=None, metadata_user=None) -> TestClient: app = build_test_app(audit_endpoint.router, "/audit") app.dependency_overrides[audit_endpoint.get_audit_repository] = lambda: repo if metadata_admin is not None: app.dependency_overrides[get_current_metadata_admin] = lambda: metadata_admin if metadata_user is not None: app.dependency_overrides[get_current_metadata_user] = lambda: metadata_user return TestClient(app) def test_get_audit_logs_passes_filters(): repo = type( "Repo", (), { "get_logs": AsyncMock(return_value=[make_audit_log(action="LOGIN")]), "get_log_count": AsyncMock(), }, )() client = _build_client(repo, metadata_admin=object()) response = client.get( "/audit/logs", params={ "action": "LOGIN", "resource_type": "user", "skip": 2, "limit": 5, }, ) assert response.status_code == 200 assert response.json()[0]["action"] == "LOGIN" repo.get_logs.assert_awaited_once() kwargs = repo.get_logs.await_args.kwargs assert kwargs["action"] == "LOGIN" assert kwargs["resource_type"] == "user" assert kwargs["skip"] == 2 assert kwargs["limit"] == 5 def test_get_audit_logs_count_returns_count_payload(): repo = type( "Repo", (), { "get_logs": AsyncMock(), "get_log_count": AsyncMock(return_value=7), }, )() client = _build_client(repo, metadata_admin=object()) response = client.get("/audit/logs/count", params={"action": "DELETE_USER"}) assert response.status_code == 200 assert response.json() == {"count": 7} repo.get_log_count.assert_awaited_once() assert repo.get_log_count.await_args.kwargs["action"] == "DELETE_USER" def test_get_my_audit_logs_forces_current_user_id(): current_user = type("User", (), {"id": make_audit_log().user_id})() repo = type( "Repo", (), { "get_logs": AsyncMock(return_value=[make_audit_log(user_id=current_user.id)]), "get_log_count": AsyncMock(), }, )() client = _build_client(repo, metadata_user=current_user) response = client.get("/audit/logs/my", params={"limit": 3}) assert response.status_code == 200 repo.get_logs.assert_awaited_once() kwargs = repo.get_logs.await_args.kwargs assert kwargs["user_id"] == current_user.id assert kwargs["limit"] == 3