%%%------------------------------------------------------------------- %%% @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, case maps:get(<<"entity_id">>, R) of #{<<"id">> := Id} -> Id =:= CalId; _ -> false end], ?assert(length(Matching) >= 1), Last = hd(Matching), ?assertEqual(<<"freeze_calendar">>, maps:get(<<"action">>, Last)), ?assertEqual(<<"calendar">>, maps:get(<<"entity_type">>, Last)), ct:pal(" OK: audit record found").