%%%------------------------------------------------------------------- %%% @doc Тесты административного API для аудита. %%% %%% Покрывает эндпоинты: %%% GET /v1/admin/audit %%% %%% Проверяет: %%% - получение списка записей аудита %%% - фильтрацию по admin_id %%% - пагинацию %%% @end %%%------------------------------------------------------------------- -module(admin_audit_tests). -include_lib("eunit/include/eunit.hrl"). -export([test/0]). -spec test() -> ok. test() -> ct:pal("=== Admin Audit Tests ==="), UserToken = api_test_runner:get_user_token(), #{<<"id">> := UserId} = api_test_runner:client_get(<<"/v1/user/me">>, UserToken), AdminToken = api_test_runner:get_admin_token(), SuperToken = api_test_runner:get_superadmin_token(), % Создаём тестовую запись аудита Me = api_test_runner:admin_get(<<"/v1/admin/me">>, AdminToken), AdminId = maps:get(<<"id">>, Me), Path = <<"/v1/admin/user/", UserId/binary>>, Body = #{<<"action">> => <<"block">>, <<"reason">> => <<"Test">>}, api_test_runner:admin_put(Path, AdminToken, Body), ct:sleep(200), Body2 = #{<<"action">> => <<"unblock">>, <<"reason">> => <<"Test">>}, api_test_runner:admin_put(Path, AdminToken, Body2), test_list_audit(SuperToken), test_filter_audit(SuperToken, AdminId), test_audit_pagination(SuperToken), test_list_admin_forbidden(AdminToken), ct:pal("=== All admin audit tests passed ==="), ok. test_list_audit(Token) -> ct:pal(" TEST: List all audit records"), Records = api_test_runner:admin_get(<<"/v1/admin/audit">>, Token), ?assert(is_list(Records)), ?assert(length(Records) >= 1), ct:pal(" OK: ~p records", [length(Records)]). test_filter_audit(Token, AdminId) -> ct:pal(" TEST: Filter audit by admin_id"), Records = api_test_runner:admin_get(<<"/v1/admin/audit?admin_id=", AdminId/binary>>, Token), ?assert(is_list(Records)), [?assertEqual(AdminId, maps:get(<<"admin_id">>, R)) || R <- Records], ct:pal(" OK: ~p records", [length(Records)]). test_audit_pagination(Token) -> ct:pal(" TEST: Audit pagination"), Page1 = api_test_runner:admin_get(<<"/v1/admin/audit?limit=1&offset=0">>, Token), ?assert(length(Page1) >= 1), Page2 = api_test_runner:admin_get(<<"/v1/admin/audit?limit=1&offset=1">>, Token), ?assert(length(Page2) >= 0), case {Page1, Page2} of {[First|_], [Second|_]} -> Id1 = maps:get(<<"id">>, First), Id2 = maps:get(<<"id">>, Second), ?assertNotEqual(Id1, Id2); _ -> ok end, ct:pal(" OK"). -spec test_list_admin_forbidden(binary()) -> ok. test_list_admin_forbidden(Token) -> ct:pal(" TEST: List audit as non-superadmin (403)"), Resp = api_test_runner:admin_request(get, <<"/v1/admin/audit">>, Token), ?assertMatch({ok, 403, _, _}, Resp), ct:pal(" OK: got 403").