77a53c77cd
CI / test (push) Successful in 15m19s
Модерация писала #{reason => ...} — UI падал с React #31.
Co-authored-by: Cursor <cursoragent@cursor.com>
144 lines
6.3 KiB
Erlang
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"). |