Расширена общая статистика по дням: Отзывы, Календари, Жалобы, Тикеты, Подписки #22

This commit is contained in:
2026-05-27 22:40:03 +03:00
parent 4444461ee3
commit 2dac5e5102
9 changed files with 250 additions and 39 deletions
+32 -22
View File
@@ -2,28 +2,26 @@
%%% @doc Тесты административного API для получения статистики.
%%%
%%% Покрывает эндпоинты:
%%% GET /v1/admin/stats
%%% GET /v1/admin/stats
%%%
%%% Проверяет:
%%% - получение статистики для всех четырёх ролей администраторов
%%% - для superadmin и admin – наличие ключевых метрик
%%% - для moderator и support ответ непустой
%%% - работу с фильтром по датам (from, to)
%%% - получение статистики для всех четырёх ролей администраторов
%%% - для 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(),
@@ -44,34 +42,46 @@ test() ->
%%%===================================================================
%% @doc Проверяет получение статистики для конкретной роли.
%% strict – ожидаем ключи users_total/users и events_total/events
%% loose – просто убеждаемся, что ответ непустой
%% 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]),
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);
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))]).
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"),
ct:pal(" TEST: Get stats with date range"),
From = <<"2026-01-01T00:00:00Z">>,
To = <<"2026-12-31T23:59:59Z">>,
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").
?assert(maps:is_key(<<"users_total">>, Stats) orelse maps:is_key(<<"users">>, Stats)),
ct:pal(" OK").