134 lines
5.7 KiB
Erlang
134 lines
5.7 KiB
Erlang
%%%-------------------------------------------------------------------
|
||
%%% @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"). |