%%%------------------------------------------------------------------- %%% @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").