Files
EventHubBack/test/api_admins_SUITE.erl

150 lines
4.8 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 Common Test Suite для административного API.
%%%
%%% Поддерживает два режима запуска:
%%% - Локальный (CT_MODE=local или не задан): автоматически
%%% стартует EventHub, выполняет тесты и останавливает приложение.
%%% - Удалённый (CT_MODE=remote): подключается к уже работающему
%%% кластеру по URL, определённым в переменных окружения
%%% (API_HOST, ADMIN_API_HOST и т.д.).
%%%
%%% Запуск:
%%% rebar3 ct --suite=api_admin_SUITE
%%% или CT_MODE=remote rebar3 ct --suite=api_admin_SUITE
%%% @end
%%%-------------------------------------------------------------------
-module(api_admins_SUITE).
-compile(export_all).
-include_lib("common_test/include/ct.hrl").
%%%===================================================================
%%% Common Test callbacks
%%%===================================================================
%% @doc Возвращает список тестовых кейсов.
all() ->
[
admin_test_events,
admin_test_reviews,
admin_test_users,
admin_test_tickets,
admin_test_reports,
admin_test_subscriptions,
admin_test_banned_words,
admin_test_moderation,
admin_test_audit,
admin_test_stats,
admin_test_me,
admin_test_admins,
admin_test_websocket
].
%% @doc Инициализация сьюта.
%% В локальном режиме запускает приложение EventHub.
init_per_suite(Config) ->
case os:getenv("CT_MODE", "local") of
"remote" ->
ct:pal("Remote mode: assuming application is already running"),
inets:start(),
ssl:start(),
% Отключаем авто-редирект и проверку сертификатов
httpc:set_options([
{autoredirect, false},
{ssl, [{verify, verify_none}]}
]),
wait_for_remote(),
[{started_by_us, false} | Config];
_ ->
case lists:keymember(eventhub, 1, application:which_applications()) of
true ->
ct:pal("Local mode: application already running"),
[{started_by_us, false} | Config];
false ->
ct:pal("Local mode: starting application..."),
%% ok = application:load(eventhub),
{ok, _} = application:ensure_all_started(eventhub),
timer:sleep(1000),
[{started_by_us, true} | Config]
end
end.
%% @doc Завершение сьюта. В локальном режиме останавливает приложение.
end_per_suite(Config) ->
case proplists:get_value(started_by_us, Config, false) andalso
os:getenv("CT_MODE", "local") =/= "remote" of
true ->
application:stop(eventhub);
false ->
ok
end,
Config.
%%%===================================================================
%%% Тестовые кейсы
%%%===================================================================
%% @doc Тесты для событий.
admin_test_events(_Config) ->
admin_events_tests:test().
admin_test_reviews(_Config) ->
admin_reviews_tests:test().
admin_test_users(_Config) ->
admin_users_tests:test().
admin_test_tickets(_Config) ->
admin_tickets_tests:test().
admin_test_reports(_Config) ->
admin_reports_tests:test().
admin_test_subscriptions(_Config) ->
admin_subscriptions_tests:test().
admin_test_banned_words(_Config) ->
admin_banned_words_tests:test().
admin_test_moderation(_Config) ->
admin_moderation_tests:test().
admin_test_audit(_Config) ->
admin_audit_tests:test().
admin_test_stats(_Config) ->
admin_stats_tests:test().
admin_test_me(_Config) ->
admin_me_tests:test().
admin_test_admins(_Config) ->
admin_admins_tests:test().
admin_test_websocket(_Config) ->
admin_websocket_tests:test().
%%%===================================================================
%%% Внутренние функции
%%%===================================================================
-spec ct_mode() -> string().
ct_mode() ->
os:getenv("CT_MODE", "local").
%% @private Ожидание доступности удалённого API.
-spec wait_for_remote() -> ok.
wait_for_remote() ->
URL = os:getenv("ADMIN_API_HOST", "http://localhost:8445") ++ "/admin/health",
ct:pal("Waiting for remote API: ~s", [URL]),
wait_for_health(URL, 30).
wait_for_health(_URL, 0) ->
ct:fail("Remote API did not start within 30 seconds");
wait_for_health(URL, Retries) ->
case httpc:request(get, {URL, []}, [{timeout, 5000}, {ssl, [{verify, verify_none}]}], []) of
{ok, {{_, 200, _}, _, _}} -> ok;
_ ->
timer:sleep(1000),
wait_for_health(URL, Retries - 1)
end.