Добавлена оперативная и историческая статистика нод и узлов mnesia #22
This commit is contained in:
@@ -1,118 +1,72 @@
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Тесты пользовательского WebSocket API.
|
||||
%%%
|
||||
%%% Покрывает эндпоинты:
|
||||
%%% ws://localhost:8081/ws
|
||||
%%%
|
||||
%%% Проверяет:
|
||||
%%% - подключение с валидным пользовательским токеном
|
||||
%%% - подписку на календарь и получение подтверждения
|
||||
%%% @end
|
||||
%%%-------------------------------------------------------------------
|
||||
-module(user_websocket_tests).
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
-export([test/0]).
|
||||
|
||||
%%%===================================================================
|
||||
%%% Главная тестовая функция
|
||||
%%%===================================================================
|
||||
-spec test() -> ok.
|
||||
test() ->
|
||||
ct:pal("Testing WebSocket API..."),
|
||||
ct:pal("=== User WebSocket Tests ==="),
|
||||
application:ensure_all_started(gun),
|
||||
|
||||
AdminToken = api_test_runner:get_admin_token(),
|
||||
UserToken = api_test_runner:get_user_token(),
|
||||
ct:pal(" AdminToken: ~s...", [binary_part(AdminToken, 0, 30)]),
|
||||
ct:pal(" UserToken: ~s...", [binary_part(UserToken, 0, 30)]),
|
||||
UserToken = api_test_runner:get_user_token(),
|
||||
|
||||
% Создаём календарь и событие через новый api_test_runner
|
||||
% Создаём календарь и событие
|
||||
CalId = api_test_runner:create_calendar(UserToken, #{title => <<"WS Test Calendar">>, type => <<"commercial">>}),
|
||||
ct:pal(" CalId: ~s", [CalId]),
|
||||
|
||||
EventId = api_test_runner:create_event(UserToken, CalId, #{
|
||||
_EventId = api_test_runner:create_event(UserToken, CalId, #{
|
||||
title => <<"WS Test Event">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
duration => 60
|
||||
}),
|
||||
ct:pal(" EventId: ~s", [EventId]),
|
||||
|
||||
WsUrl = api_test_runner:get_base_ws_url() ++ "/ws",
|
||||
AdminWsUrl = api_test_runner:get_admin_ws_url() ++ "/admin/ws",
|
||||
|
||||
%% TEST 1: Connect to WebSocket with valid token
|
||||
ct:pal(" TEST 1: Connect WebSocket with valid token..."),
|
||||
ct:pal(" URL: ~s", [WsUrl]),
|
||||
ct:pal(" Token: ~s...", [binary_part(UserToken, 0, 30)]),
|
||||
case test_ws_connect_debug(WsUrl, UserToken) of
|
||||
{ok, WS} ->
|
||||
ct:pal(" OK - Connected"),
|
||||
% ── Пользовательские WebSocket тесты ──
|
||||
{ok, UserWS} = test_user_ws_connect(WsUrl, UserToken),
|
||||
test_user_ws_subscribe(UserWS, CalId),
|
||||
test_ws_close(UserWS),
|
||||
|
||||
%% TEST 2: Subscribe to calendar updates
|
||||
ct:pal(" TEST 2: Subscribe to calendar..."),
|
||||
SubMsg = #{action => <<"subscribe">>, calendar_id => CalId},
|
||||
ct:pal(" Sending: ~p", [SubMsg]),
|
||||
ok = test_ws_send(WS, SubMsg),
|
||||
case test_ws_recv(WS) of
|
||||
{ok, #{<<"status">> := <<"subscribed">>}} ->
|
||||
ct:pal(" OK - Subscribed");
|
||||
{ok, Other} ->
|
||||
ct:pal(" ERROR: Unexpected response: ~p", [Other]),
|
||||
error({unexpected_response, Other});
|
||||
{error, timeout} ->
|
||||
ct:pal(" ERROR: Timeout waiting for response"),
|
||||
error(timeout)
|
||||
end,
|
||||
|
||||
test_ws_close(WS);
|
||||
{error, Reason} ->
|
||||
ct:pal(" ERROR: ~p", [Reason]),
|
||||
error({websocket_connect_failed, Reason})
|
||||
end,
|
||||
|
||||
ct:pal("~n✅ WebSocket API tests passed!"),
|
||||
|
||||
%% ============ ТЕСТЫ АДМИНСКОГО WEBSOCKET ============
|
||||
ct:pal("~n=== ADMIN WEBSOCKET TESTS ==="),
|
||||
|
||||
%% TEST 6: Admin WebSocket connection
|
||||
ct:pal(" TEST 6: Admin WebSocket connect..."),
|
||||
{ok, AdminWS} = test_ws_connect_debug(AdminWsUrl, AdminToken),
|
||||
ct:pal(" OK - Admin connected"),
|
||||
|
||||
%% TEST 7: Admin subscribe to reports channel
|
||||
ct:pal(" TEST 7: Admin subscribe to reports channel..."),
|
||||
ok = test_ws_send(AdminWS, #{action => <<"subscribe">>, channel => <<"reports">>}),
|
||||
{ok, #{<<"status">> := <<"subscribed">>}} = test_ws_recv(AdminWS),
|
||||
ct:pal(" OK - Subscribed to reports"),
|
||||
|
||||
%% TEST 8: Admin subscribe to tickets channel
|
||||
ct:pal(" TEST 8: Admin subscribe to tickets channel..."),
|
||||
ok = test_ws_send(AdminWS, #{action => <<"subscribe">>, channel => <<"tickets">>}),
|
||||
{ok, #{<<"status">> := <<"subscribed">>}} = test_ws_recv(AdminWS),
|
||||
ct:pal(" OK - Subscribed to tickets"),
|
||||
|
||||
%% TEST 9: Admin receives report notification
|
||||
ct:pal(" TEST 9: Admin receives report notification..."),
|
||||
api_test_runner:client_post(<<"/v1/reports">>, UserToken,
|
||||
#{target_type => <<"event">>, target_id => EventId, reason => <<"Test report">>}),
|
||||
{ok, #{<<"type">> := <<"report_created">>}} = test_ws_recv(AdminWS, 5000),
|
||||
ct:pal(" OK - Received report notification"),
|
||||
|
||||
%% TEST 10: Admin Ping/Pong
|
||||
ct:pal(" TEST 10: Admin Ping/Pong..."),
|
||||
ok = test_ws_send(AdminWS, #{action => <<"ping">>}),
|
||||
{ok, #{<<"status">> := <<"pong">>}} = test_ws_recv(AdminWS),
|
||||
ct:pal(" OK - Admin Ping/Pong"),
|
||||
|
||||
%% TEST 11: Admin unsubscribe
|
||||
ct:pal(" TEST 11: Admin unsubscribe from reports..."),
|
||||
ok = test_ws_send(AdminWS, #{action => <<"unsubscribe">>, channel => <<"reports">>}),
|
||||
{ok, #{<<"status">> := <<"unsubscribed">>}} = test_ws_recv(AdminWS),
|
||||
ct:pal(" OK - Unsubscribed"),
|
||||
|
||||
test_ws_close(AdminWS),
|
||||
|
||||
%% TEST 12: Admin WebSocket with user token (should fail)
|
||||
ct:pal(" TEST 12: Admin WS with user token..."),
|
||||
{error, {403, _}} = test_ws_connect_debug(AdminWsUrl, UserToken),
|
||||
ct:pal(" OK - Rejected"),
|
||||
|
||||
%% TEST 13: Admin WebSocket with invalid token
|
||||
ct:pal(" TEST 13: Admin WS with invalid token..."),
|
||||
Chars = <<"abcdefghijklmnopqrstuvwxyz0123456789">>,
|
||||
InvalidToken = << <<(binary:at(Chars, rand:uniform(byte_size(Chars)) - 1))>>
|
||||
|| _ <- lists:seq(1, 30) >>,
|
||||
{error, {401, _}} = test_ws_connect_debug(AdminWsUrl, InvalidToken),
|
||||
ct:pal(" OK - Rejected"),
|
||||
|
||||
ct:pal("~n✅ Admin WebSocket API tests passed!"),
|
||||
ct:pal("~n=== All user WebSocket tests passed! ==="),
|
||||
{?MODULE, ok}.
|
||||
|
||||
%%%===================================================================
|
||||
%%% Тестовые функции
|
||||
%%%===================================================================
|
||||
|
||||
%% @doc Подключение пользовательского WebSocket с валидным токеном.
|
||||
-spec test_user_ws_connect(string(), binary()) -> {ok, pid()}.
|
||||
test_user_ws_connect(Url, Token) ->
|
||||
ct:pal(" TEST: Connect user WebSocket with valid token"),
|
||||
case test_ws_connect_debug(Url, Token) of
|
||||
{ok, WS} -> {ok, WS};
|
||||
Other -> error({unexpected, Other})
|
||||
end.
|
||||
|
||||
%% @doc Подписка на календарь и получение подтверждения.
|
||||
-spec test_user_ws_subscribe(pid(), binary()) -> ok.
|
||||
test_user_ws_subscribe(WS, CalId) ->
|
||||
ct:pal(" TEST: Subscribe to calendar"),
|
||||
SubMsg = #{action => <<"subscribe">>,
|
||||
calendar_id => CalId},
|
||||
ok = test_ws_send(WS, SubMsg),
|
||||
case test_ws_recv(WS) of
|
||||
{ok, #{<<"status">> := <<"subscribed">>}} -> ok;
|
||||
{ok, Other} -> error({unexpected_response, Other});
|
||||
{error, timeout} -> error(timeout)
|
||||
end.
|
||||
|
||||
%% ============ WebSocket хелперы с отладкой ============
|
||||
test_ws_connect_debug(Url, Token) ->
|
||||
Path = case string:split(Url, "://", trailing) of
|
||||
|
||||
Reference in New Issue
Block a user