%%%------------------------------------------------------------------- %%% @doc Тесты административного API для получения статистики. %%% %%% Покрывает эндпоинты: %%% GET /v1/admin/stats %%% %%% Проверяет: %%% - получение статистики для всех четырёх ролей администраторов %%% - для superadmin и admin – наличие ключевых метрик %%% - для moderator и support – ответ непустой %%% - работу с фильтром по датам (from, to) %%% @end %%%------------------------------------------------------------------- -module(admin_stats_tests). -include_lib("eunit/include/eunit.hrl"). -export([test/0]). %%%=================================================================== %%% Главная тестовая функция %%%=================================================================== -spec test() -> ok. test() -> ct:pal("=== Admin Stats Tests ==="), SuperToken = api_test_runner:get_superadmin_token(), AdminToken = api_test_runner:get_admin_token(), ModerToken = api_test_runner:get_moderator_token(), SupportToken = api_test_runner:get_support_token(), test_stats_for_role("Superadmin", SuperToken, strict), test_stats_for_role("Admin", AdminToken, strict), test_stats_for_role("Moderator", ModerToken, loose), test_stats_for_role("Support", SupportToken, loose), test_stats_with_dates(SuperToken), ct:pal("=== All admin stats tests passed ==="), ok. %%%=================================================================== %%% Тестовые функции %%%=================================================================== %% @doc Проверяет получение статистики для конкретной роли. %% strict – ожидаем ключи users_total/users и events_total/events %% loose – просто убеждаемся, что ответ непустой -spec test_stats_for_role(string(), binary(), strict | loose) -> ok. test_stats_for_role(RoleName, Token, Strictness) -> ct:pal(" TEST: Get stats for role ~s", [RoleName]), Stats = api_test_runner:admin_get(<<"/v1/admin/stats">>, Token), ?assert(is_map(Stats)), case Strictness of strict -> HasUsers = maps:is_key(<<"users_total">>, Stats) orelse maps:is_key(<<"users">>, Stats), HasEvents = maps:is_key(<<"events_total">>, Stats) orelse maps:is_key(<<"events">>, Stats), ?assert(HasUsers orelse HasEvents); loose -> ?assert(map_size(Stats) > 0) end, ct:pal(" OK: ~p keys", [length(maps:keys(Stats))]). %% @doc GET /v1/admin/stats?from=...&to=... – проверяет фильтрацию по датам. -spec test_stats_with_dates(binary()) -> ok. test_stats_with_dates(Token) -> ct:pal(" TEST: Get stats with date range"), From = <<"2026-01-01T00:00:00Z">>, To = <<"2026-12-31T23:59:59Z">>, Path = <<"/v1/admin/stats?from=", From/binary, "&to=", To/binary>>, Stats = api_test_runner:admin_get(Path, Token), ?assert(is_map(Stats)), ?assert(maps:is_key(<<"users_total">>, Stats) orelse maps:is_key(<<"users">>, Stats)), ct:pal(" OK").