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