Files
TJWaterServerBinary/tests/api/test_audit_endpoints.py
T

92 lines
2.8 KiB
Python

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