Files
EventHubBack/test/api/admins/admin_stats_tests.erl
T

87 lines
4.1 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/stats
%%%
%%% Проверяет:
%%% - получение статистики для всех четырёх ролей администраторов
%%% - для superadmin и admin – наличие ключевых метрик, включая
%%% pending_users_total, *_by_day
%%% - для 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/events_total/pending_users_total и *_by_day
%% 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),
% Проверяем наличие новых ключей
?assert(maps:is_key(<<"pending_users_total">>, Stats)),
?assert(maps:is_key(<<"reviews_by_day">>, Stats)),
?assert(maps:is_key(<<"calendars_by_day">>, Stats)),
?assert(maps:is_key(<<"reports_by_day">>, Stats)),
?assert(maps:is_key(<<"tickets_by_day">>, Stats)),
?assert(maps:is_key(<<"subscriptions_by_day">>, Stats)),
?assert(maps:is_key(<<"pending_users_by_day">>, Stats)),
% Проверяем, что *_by_day являются списками
?assert(is_list(maps:get(<<"reviews_by_day">>, Stats))),
?assert(is_list(maps:get(<<"calendars_by_day">>, Stats))),
?assert(is_list(maps:get(<<"reports_by_day">>, Stats))),
?assert(is_list(maps:get(<<"tickets_by_day">>, Stats))),
?assert(is_list(maps:get(<<"subscriptions_by_day">>, Stats))),
?assert(is_list(maps:get(<<"pending_users_by_day">>, Stats)));
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").