Files
EventHubBack/test/api/admins/admin_reports_tests.erl

134 lines
5.7 KiB
Erlang
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
%%%-------------------------------------------------------------------
%%% @doc Тесты административного API для управления жалобами.
%%%
%%% Покрывает эндпоинты:
%%% GET /v1/admin/reports
%%% GET /v1/admin/reports/:id
%%% PUT /v1/admin/reports/:id
%%%
%%% Проверяет:
%%% - получение списка жалоб
%%% - получение жалобы по ID
%%% - обновление статуса жалобы (review, dismiss)
%%% - фильтрацию по статусу и типу цели
%%% - пагинацию
%%% @end
%%%-------------------------------------------------------------------
-module(admin_reports_tests).
-include_lib("eunit/include/eunit.hrl").
-export([test/0]).
%%%===================================================================
%%% Главная тестовая функция
%%%===================================================================
-spec test() -> ok.
test() ->
ct:pal("=== Admin Reports Tests ==="),
Token = api_test_runner:get_admin_token(),
UserToken = api_test_runner:get_user_token(),
% Создаём тестовые данные: календарь, событие
CalId = api_test_runner:create_calendar(UserToken, #{title => <<"ReportsTestCal">>}),
EventId = api_test_runner:create_event(UserToken, CalId, #{
title => <<"Event for reporting">>,
start_time => api_test_runner:future_date(),
duration => 60
}),
% Создаём две жалобы от имени пользователя
#{<<"id">> := Report1Id} = api_test_runner:client_post(<<"/v1/reports">>, UserToken, #{
<<"target_type">> => <<"event">>,
<<"target_id">> => EventId,
<<"reason">> => <<"Inappropriate content">>
}),
#{<<"id">> := Report2Id} = api_test_runner:client_post(<<"/v1/reports">>, UserToken, #{
<<"target_type">> => <<"event">>,
<<"target_id">> => EventId,
<<"reason">> => <<"Spam">>
}),
test_list_reports(Token, Report1Id),
test_get_report(Token, Report1Id),
test_review_report(Token, Report1Id),
test_dismiss_report(Token, Report2Id),
test_filter_reports(Token),
test_report_pagination(Token),
ct:pal("=== All admin reports tests passed ==="),
ok.
%%%===================================================================
%%% Тестовые функции
%%%===================================================================
%% @doc GET /v1/admin/reports проверяет получение списка жалоб.
-spec test_list_reports(binary(), binary()) -> ok.
test_list_reports(Token, ReportId) ->
ct:pal(" TEST: List all reports"),
Reports = api_test_runner:admin_get(<<"/v1/admin/reports">>, Token),
?assert(is_list(Reports)),
?assert(length(Reports) >= 2),
?assert(lists:any(fun(R) -> maps:get(<<"id">>, R) =:= ReportId end, Reports)),
ct:pal(" OK: ~p reports", [length(Reports)]).
%% @doc GET /v1/admin/reports/:id проверяет получение жалобы по ID.
-spec test_get_report(binary(), binary()) -> ok.
test_get_report(Token, ReportId) ->
ct:pal(" TEST: Get report by ID"),
Path = <<"/v1/admin/reports/", ReportId/binary>>,
Report = api_test_runner:admin_get(Path, Token),
?assertEqual(ReportId, maps:get(<<"id">>, Report)),
?assertEqual(<<"pending">>, maps:get(<<"status">>, Report)),
ct:pal(" OK").
%% @doc PUT /v1/admin/reports/:id проверяет изменение статуса на reviewed.
-spec test_review_report(binary(), binary()) -> ok.
test_review_report(Token, ReportId) ->
ct:pal(" TEST: Review report (set status to reviewed)"),
Path = <<"/v1/admin/reports/", ReportId/binary>>,
Updated = api_test_runner:admin_put(Path, Token, #{<<"status">> => <<"reviewed">>}),
?assertEqual(<<"reviewed">>, maps:get(<<"status">>, Updated)),
ct:pal(" OK").
%% @doc PUT /v1/admin/reports/:id проверяет изменение статуса на dismissed.
-spec test_dismiss_report(binary(), binary()) -> ok.
test_dismiss_report(Token, ReportId) ->
ct:pal(" TEST: Dismiss report (set status to dismissed)"),
Path = <<"/v1/admin/reports/", ReportId/binary>>,
Updated = api_test_runner:admin_put(Path, Token, #{<<"status">> => <<"dismissed">>}),
?assertEqual(<<"dismissed">>, maps:get(<<"status">>, Updated)),
ct:pal(" OK").
%% @doc GET /v1/admin/reports?status=...&target_type=... проверяет фильтрацию.
-spec test_filter_reports(binary()) -> ok.
test_filter_reports(Token) ->
ct:pal(" TEST: Filter reports by status=reviewed"),
Reports = api_test_runner:admin_get(<<"/v1/admin/reports?status=reviewed">>, Token),
?assert(is_list(Reports)),
[?assertEqual(<<"reviewed">>, maps:get(<<"status">>, R)) || R <- Reports],
ct:pal(" OK: ~p reviewed reports", [length(Reports)]),
ct:pal(" TEST: Filter reports by target_type=event"),
Reports2 = api_test_runner:admin_get(<<"/v1/admin/reports?target_type=event">>, Token),
?assert(is_list(Reports2)),
[?assertEqual(<<"event">>, maps:get(<<"target_type">>, R)) || R <- Reports2],
ct:pal(" OK: ~p reports for events", [length(Reports2)]).
%% @doc GET /v1/admin/reports?limit=...&offset=... проверяет пагинацию.
-spec test_report_pagination(binary()) -> ok.
test_report_pagination(Token) ->
ct:pal(" TEST: Report pagination"),
Page1 = api_test_runner:admin_get(<<"/v1/admin/reports?limit=1&offset=0">>, Token),
?assert(length(Page1) >= 1),
Page2 = api_test_runner:admin_get(<<"/v1/admin/reports?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").