Статистика для дашборда #7

This commit is contained in:
2026-04-28 21:31:22 +03:00
parent 967a024d0c
commit c87d56bb49
18 changed files with 210 additions and 167 deletions

View File

@@ -1,4 +1,7 @@
-module(api_test_runner).
-include("records.hrl").
-export([run_all/0, run/1]).
-export([http_post/2, http_post/3, http_get/1, http_get/2, http_put/3, http_delete/2]).
-export([extract_json/2, extract_json/3, assert_status/2]).
@@ -10,8 +13,8 @@
-define(ADMIN_URL, "http://localhost:8445").
%% ============ Глобальные переменные для тестов ============
-define(ADMIN_EMAIL, <<"global_admin@test.com">>).
-define(ADMIN_PASSWORD, <<"admin123">>).
-define(ADMIN_EMAIL, <<"admin@eventhub.local">>).
-define(ADMIN_PASSWORD, <<"123456">>).
-define(USER_EMAIL, <<"global_user@test.com">>).
-define(USER_PASSWORD, <<"user123">>).
@@ -21,27 +24,29 @@ init_global_users() ->
undefined ->
io:format("~n=== Initializing global test users ===~n"),
% Создаём или логиним админа
AdminToken = register_and_login(?ADMIN_EMAIL, ?ADMIN_PASSWORD),
{ok, {{_, 200, _}, _, MeResp}} = http_get("/v1/user/me", AdminToken),
#{<<"id">> := AdminId, <<"role">> := Role} = jsx:decode(list_to_binary(MeResp), [return_maps]),
io:format("Admin ID: ~s, Current role: ~s~n", [AdminId, Role]),
% Проверяем, что админ действительно админ
case Role of
<<"admin">> ->
io:format("✓ Admin already has admin role~n"),
% ---------- АДМИНИСТРАТОР ----------
% Проверяем, существует ли админ в таблице admin
case core_admin:get_by_email(?ADMIN_EMAIL) of
{ok, Admin} ->
io:format("Admin already exists: ~s~n", [Admin#admin.id]),
ok;
_ ->
io:format("⚠ Admin role is '~s', attempting to promote...~n", [Role]),
promote_to_admin(AdminToken, AdminId)
{error, not_found} ->
% Создаём суперадмина напрямую
{ok, Admin} = core_admin:create(?ADMIN_EMAIL, ?ADMIN_PASSWORD, superadmin),
io:format("Admin created: ~s~n", [Admin#admin.id])
end,
% Логинимся через админский API
LoginBody = jsx:encode(#{<<"email">> => ?ADMIN_EMAIL, <<"password">> => ?ADMIN_PASSWORD}),
{ok, {{_, 200, _}, _, LoginResp}} = httpc:request(post,
{?ADMIN_URL ++ "/v1/admin/login", [], "application/json", LoginBody}, [], []),
#{<<"token">> := AdminToken, <<"user">> := #{<<"id">> := AdminId}} =
jsx:decode(list_to_binary(LoginResp), [return_maps]),
put(admin_token, AdminToken),
put(admin_id, AdminId),
% Создаём или логиним обычного пользователя
% ---------- ПОЛЬЗОВАТЕЛЬ ----------
UserToken = register_and_login(?USER_EMAIL, ?USER_PASSWORD),
{ok, {{_, 200, _}, _, UserMeResp}} = http_get("/v1/user/me", UserToken),
#{<<"id">> := UserId} = jsx:decode(list_to_binary(UserMeResp), [return_maps]),
@@ -49,7 +54,7 @@ init_global_users() ->
put(user_token, UserToken),
put(user_id, UserId),
io:format("User ID: ~s~n", [UserId]),
io:format("Admin ID: ~s, User ID: ~s~n", [AdminId, UserId]),
io:format("=== Global users initialized ===~n~n"),
ok;
_ ->
@@ -57,32 +62,6 @@ init_global_users() ->
ok
end.
%% Попытка повысить роль через разные методы
promote_to_admin(AdminToken, AdminId) ->
io:format("Attempting to promote user ~s to admin...~n", [AdminId]),
% Метод 1: Прямое обновление через core_user (если доступно)
try
{ok, _User} = core_user:get_by_id(AdminId),
core_user:update(AdminId, [{role, admin}]),
io:format("✓ Promoted via core_user~n")
catch
_:_ ->
io:format(" Method 1 (core_user) failed~n")
end,
% Проверяем, сработало ли
{ok, {{_, 200, _}, _, CheckResp}} = http_get("/v1/user/me", AdminToken),
#{<<"role">> := NewRole} = jsx:decode(list_to_binary(CheckResp), [return_maps]),
case NewRole of
<<"admin">> ->
io:format("✓ User is now admin~n");
_ ->
io:format("⚠ WARNING: User still has role '~s'~n", [NewRole]),
io:format(" Some admin tests may fail~n")
end.
get_admin_token() ->
init_global_users(),
get(admin_token).