Files
EventHubBack/test/api/admins/admin_moderation_tests.erl
T
aleksey 77a53c77cd
CI / test (push) Successful in 15m19s
fix(audit): reason и entity_id в audit как строки, не map.
Модерация писала #{reason => ...} — UI падал с React #31.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 14:08:25 +03:00

144 lines
6.3 KiB
Erlang

%%%-------------------------------------------------------------------
%%% @doc Тесты административного API для модерации сущностей.
%%%
%%% Покрывает эндпоинты:
%%% PUT /v1/admin/:target_type/:id
%%%
%%% Проверяет:
%%% - заморозку/разморозку календаря
%%% - заморозку/разморозку события
%%% - скрытие/раскрытие отзыва
%%% - блокировку/разблокировку пользователя
%%% - наличие записей в аудите после модерации
%%% @end
%%%-------------------------------------------------------------------
-module(admin_moderation_tests).
-include_lib("eunit/include/eunit.hrl").
-export([test/0]).
%%%===================================================================
%%% Главная тестовая функция
%%%===================================================================
-spec test() -> ok.
test() ->
ct:pal("=== Admin Moderation Tests ==="),
Token = api_test_runner:get_admin_token(),
UserToken = api_test_runner:get_user_token(),
% Создаём календарь и событие
CalId = api_test_runner:create_calendar(UserToken, #{title => <<"ModTestCal">>}),
EventId = api_test_runner:create_event(UserToken, CalId, #{
title => <<"Event to moderate">>,
start_time => api_test_runner:future_date(),
duration => 60
}),
% Создаём пользователя для блокировки
UserEmail = api_test_runner:unique_email(<<"moduser">>),
UserTok = api_test_runner:register_and_login(UserEmail, <<"pass">>),
#{<<"id">> := UserId} = api_test_runner:client_get(<<"/v1/user/me">>, UserTok),
% Создаём отзыв (требуется участие)
#{<<"id">> := BookingId} = api_test_runner:client_post(
<<"/v1/events/", EventId/binary, "/bookings">>, UserTok, #{}),
api_test_runner:client_put(<<"/v1/bookings/", BookingId/binary>>, UserToken,
#{action => <<"confirm">>}),
#{<<"id">> := ReviewId} = api_test_runner:client_post(<<"/v1/reviews">>, UserTok,
#{ target_type => <<"event">>, target_id => EventId, rating => 3,
comment => <<"Moderate me">> }),
% Тесты модерации
test_freeze_calendar(Token, CalId),
test_unfreeze_calendar(Token, CalId),
test_freeze_event(Token, EventId),
test_unfreeze_event(Token, EventId),
test_hide_review(Token, ReviewId),
test_unhide_review(Token, ReviewId),
test_block_user(Token, UserId),
test_unblock_user(Token, UserId),
% Проверка аудита после модерации
test_moderate_calendar_audit(Token),
ct:pal("=== All admin moderation tests passed ==="),
ok.
%%%===================================================================
%%% Тестовые функции
%%%===================================================================
test_freeze_calendar(Token, Id) ->
ct:pal(" TEST: Freeze calendar"),
Path = <<"/v1/admin/calendar/", Id/binary>>,
Body = #{<<"action">> => <<"freeze">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"frozen">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_unfreeze_calendar(Token, Id) ->
ct:pal(" TEST: Unfreeze calendar"),
Path = <<"/v1/admin/calendar/", Id/binary>>,
Body = #{<<"action">> => <<"unfreeze">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"active">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_freeze_event(Token, Id) ->
ct:pal(" TEST: Freeze event"),
Path = <<"/v1/admin/event/", Id/binary>>,
Body = #{<<"action">> => <<"freeze">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"frozen">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_unfreeze_event(Token, Id) ->
ct:pal(" TEST: Unfreeze event"),
Path = <<"/v1/admin/event/", Id/binary>>,
Body = #{<<"action">> => <<"unfreeze">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"active">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_hide_review(Token, ReviewId) ->
ct:pal(" TEST: Hide review"),
Path = <<"/v1/admin/review/", ReviewId/binary>>,
Body = #{<<"action">> => <<"hide">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"hidden">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_unhide_review(Token, ReviewId) ->
ct:pal(" TEST: Unhide review"),
Path = <<"/v1/admin/review/", ReviewId/binary>>,
Body = #{<<"action">> => <<"unhide">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"visible">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_block_user(Token, UserId) ->
ct:pal(" TEST: Block user"),
Path = <<"/v1/admin/user/", UserId/binary>>,
Body = #{<<"action">> => <<"block">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"blocked">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_unblock_user(Token, UserId) ->
ct:pal(" TEST: Unblock user"),
Path = <<"/v1/admin/user/", UserId/binary>>,
Body = #{<<"action">> => <<"unblock">>, <<"reason">> => <<"Test">>},
Resp = api_test_runner:admin_put(Path, Token, Body),
?assertEqual(<<"active">>, maps:get(<<"status">>, Resp)),
ct:pal(" OK").
test_moderate_calendar_audit(Token) ->
ct:pal(" TEST: Audit record for freeze calendar"),
UserToken2 = api_test_runner:get_user_token(),
CalId = api_test_runner:create_calendar(UserToken2, #{title => <<"AuditCal">>}),
Path = <<"/v1/admin/calendar/", CalId/binary>>,
api_test_runner:admin_put(Path, Token, #{action => <<"freeze">>, reason => <<"Violation">>}),
ct:sleep(200),
SuperToken = api_test_runner:get_superadmin_token(),
AuditRecords = api_test_runner:admin_get(<<"/v1/admin/audit?action=freeze_calendar">>, SuperToken),
?assert(length(AuditRecords) >= 1),
Matching = [R || R <- AuditRecords, maps:get(<<"entity_id">>, R) =:= CalId],
?assert(length(Matching) >= 1),
Last = hd(Matching),
?assertEqual(<<"freeze_calendar">>, maps:get(<<"action">>, Last)),
?assertEqual(<<"calendar">>, maps:get(<<"entity_type">>, Last)),
?assertEqual(<<"Violation">>, maps:get(<<"reason">>, Last)),
ct:pal(" OK: audit record found").