This commit is contained in:
@@ -90,19 +90,26 @@ test_add_word(Token) ->
|
||||
NewWord = <<"newbadword", Unique/binary>>,
|
||||
Result = api_test_runner:admin_post(<<"/v1/admin/banned-words">>, Token, #{<<"word">> => NewWord}),
|
||||
?assertEqual(<<"added">>, maps:get(<<"status">>, Result)),
|
||||
Words = api_test_runner:admin_get(<<"/v1/admin/banned-words">>, Token),
|
||||
?assert(lists:any(fun(W) -> maps:get(<<"word">>, W) =:= NewWord end, Words)),
|
||||
% Проверяем, что слово найдено через поиск по точному совпадению
|
||||
Found = api_test_runner:admin_get(<<"/v1/admin/banned-words?q=", NewWord/binary>>, Token),
|
||||
?assertEqual(1, length(Found)),
|
||||
?assertEqual(NewWord, maps:get(<<"word">>, hd(Found))),
|
||||
ct:pal(" OK").
|
||||
|
||||
%% @doc PUT /v1/admin/banned-words/:word – редактирование слова.
|
||||
test_update_word(Token, Word) ->
|
||||
ct:pal(" TEST: Update a banned word"),
|
||||
NewWord = <<Word/binary, "_updated">>,
|
||||
Result = api_test_runner:admin_put(<<"/v1/admin/banned-words/", Word/binary>>, Token, #{<<"word">> => NewWord}),
|
||||
Path = <<"/v1/admin/banned-words/", Word/binary>>,
|
||||
Result = api_test_runner:admin_put(Path, Token, #{<<"word">> => NewWord}),
|
||||
?assertEqual(<<"updated">>, maps:get(<<"status">>, Result)),
|
||||
Words = api_test_runner:admin_get(<<"/v1/admin/banned-words">>, Token),
|
||||
?assertNot(lists:any(fun(W) -> maps:get(<<"word">>, W) =:= Word end, Words)),
|
||||
?assert(lists:any(fun(W) -> maps:get(<<"word">>, W) =:= NewWord end, Words)),
|
||||
% Проверяем, что новое слово существует (поиск возвращает ровно 1 запись)
|
||||
NewSearch = api_test_runner:admin_get(<<"/v1/admin/banned-words?q=", NewWord/binary>>, Token),
|
||||
?assertEqual(1, length(NewSearch)),
|
||||
?assertEqual(NewWord, maps:get(<<"word">>, hd(NewSearch))),
|
||||
% Проверяем, что старое слово отсутствует: все найденные слова не равны старому
|
||||
OldSearch = api_test_runner:admin_get(<<"/v1/admin/banned-words?q=", Word/binary>>, Token),
|
||||
?assert(lists:all(fun(W) -> maps:get(<<"word">>, W) =/= Word end, OldSearch)),
|
||||
ct:pal(" OK").
|
||||
|
||||
%% @doc POST /v1/admin/banned-words/batch – массовая загрузка.
|
||||
|
||||
@@ -224,8 +224,13 @@ test_calendar_stats(Token) ->
|
||||
|
||||
test_node_metrics_history(Token) ->
|
||||
ct:pal(" TEST: Node metrics history"),
|
||||
From = <<"2026-01-01T00:00:00Z">>,
|
||||
To = <<"2026-12-31T23:59:59Z">>,
|
||||
Now = calendar:universal_time(),
|
||||
FromSec = calendar:datetime_to_gregorian_seconds(Now) - 300,
|
||||
ToSec = calendar:datetime_to_gregorian_seconds(Now) + 300,
|
||||
FromDT = calendar:gregorian_seconds_to_datetime(FromSec),
|
||||
ToDT = calendar:gregorian_seconds_to_datetime(ToSec),
|
||||
From = handler_utils:datetime_to_iso8601(FromDT),
|
||||
To = handler_utils:datetime_to_iso8601(ToDT),
|
||||
Path = <<"/v1/admin/nodes/metrics?from=", From/binary, "&to=", To/binary>>,
|
||||
{ok, 200, _, Body} = api_test_runner:admin_request(get, Path, Token, <<"">>),
|
||||
Metrics = jsx:decode(list_to_binary(Body), [return_maps]),
|
||||
@@ -237,4 +242,6 @@ test_node_metrics_history(Token) ->
|
||||
?assert(maps:is_key(<<"timestamp">>, First)),
|
||||
?assert(maps:is_key(<<"node">>, First)),
|
||||
?assert(maps:is_key(<<"memory_total">>, First)),
|
||||
?assert(maps:is_key(<<"memory_available">>, First)),
|
||||
?assert(maps:is_key(<<"cpu_utilization">>, First)),
|
||||
ct:pal(" OK: ~p metrics received", [length(Metrics)]).
|
||||
@@ -41,7 +41,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, UserToken,
|
||||
#{title => <<"WS Test Event">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
|
||||
WsUrl = api_test_runner:get_base_ws_url() ++ "/ws",
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
client_delete/2,
|
||||
admin_patch/3]).
|
||||
-export([verify_user/2]).
|
||||
-export([future_date_iso8601/0]).
|
||||
|
||||
%%%===================================================================
|
||||
%%% Конфигурация окружения (CT_MODE, ...)
|
||||
@@ -201,7 +202,7 @@ request(BaseUrl, Method, Path, Token, Body, Prefix) ->
|
||||
delete -> {URL, Headers};
|
||||
_ -> {URL, Headers, "application/json", Body}
|
||||
end,
|
||||
Response = httpc:request(Method, RequestArg, [{timeout, 15000}, {ssl, [{verify, verify_none}]}], []),
|
||||
Response = httpc:request(Method, RequestArg, [{timeout, 25000}, {ssl, [{verify, verify_none}]}], []),
|
||||
case Response of
|
||||
{ok, {{_, Status, _}, RespHeaders, RespBody}} ->
|
||||
ct:pal("~s RESPONSE: ~p ~s", [Prefix, Status, RespBody]),
|
||||
@@ -280,6 +281,13 @@ future_date() ->
|
||||
Seconds = calendar:datetime_to_gregorian_seconds(calendar:universal_time()) + 86400,
|
||||
calendar:gregorian_seconds_to_datetime(Seconds).
|
||||
|
||||
-spec future_date_iso8601() -> binary().
|
||||
future_date_iso8601() ->
|
||||
Seconds = calendar:datetime_to_gregorian_seconds(calendar:universal_time()) + 86400,
|
||||
{{Y,M,D},{H,Min,S}} = calendar:gregorian_seconds_to_datetime(Seconds),
|
||||
iolist_to_binary(io_lib:format("~4..0B-~2..0B-~2..0BT~2..0B:~2..0B:~2..0BZ",
|
||||
[Y, M, D, H, Min, S])).
|
||||
|
||||
-spec register_and_login(binary(), binary()) -> binary().
|
||||
register_and_login(Email, Password) ->
|
||||
% 1. Регистрируем пользователя
|
||||
|
||||
@@ -35,7 +35,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, OwnerToken,
|
||||
#{title => <<"Event to book">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
|
||||
test_create_booking(ParticipantToken, EventId),
|
||||
@@ -81,7 +81,7 @@ test_confirm_booking(OwnerToken, EventId) ->
|
||||
|
||||
%% @doc Отмена бронирования участником: 200 OK.
|
||||
-spec test_cancel_booking(binary(), binary()) -> ok.
|
||||
test_cancel_booking(OwnerToken, EventId) ->
|
||||
test_cancel_booking(_OwnerToken, EventId) ->
|
||||
ct:pal(" TEST: Cancel booking as participant"),
|
||||
% Создаём нового участника, у которого нет бронирований
|
||||
CancelUserEmail = api_test_runner:unique_email(<<"canceluser">>),
|
||||
|
||||
@@ -36,7 +36,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, Token,
|
||||
#{title => <<"Test Event">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
|
||||
test_get_event(Token, EventId),
|
||||
|
||||
@@ -30,7 +30,7 @@ test_create_single_event(Token, CalId) ->
|
||||
Path = <<"/v1/calendars/", CalId/binary, "/events">>,
|
||||
Body = jsx:encode(#{
|
||||
title => <<"Single Event">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60
|
||||
}),
|
||||
Resp = api_test_runner:client_request(post, Path, Token, Body),
|
||||
@@ -58,7 +58,7 @@ test_create_recurring_event(Token, CalId) ->
|
||||
Path = <<"/v1/calendars/", CalId/binary, "/events">>,
|
||||
Body = jsx:encode(#{
|
||||
title => <<"Weekly Meeting">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60,
|
||||
recurrence => #{
|
||||
freq => <<"WEEKLY">>,
|
||||
|
||||
@@ -31,7 +31,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, OwnerToken,
|
||||
#{title => <<"Event for my booking">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
|
||||
% Бронируем событие от имени участника и подтверждаем
|
||||
|
||||
@@ -31,7 +31,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, OwnerToken,
|
||||
#{title => <<"Event for my review">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
|
||||
% Бронируем, подтверждаем, оставляем отзыв
|
||||
|
||||
@@ -32,7 +32,7 @@ test() ->
|
||||
#{<<"id">> := RecurringId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, OwnerToken,
|
||||
#{title => <<"Weekly Standup">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 30,
|
||||
recurrence => #{freq => <<"WEEKLY">>, interval => 1}}),
|
||||
|
||||
@@ -73,7 +73,7 @@ test_cancel_occurrence_on_single_event(Token, CalId) ->
|
||||
#{<<"id">> := SingleId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, Token,
|
||||
#{title => <<"Single">>,
|
||||
start_time => <<"2026-06-02T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 30}),
|
||||
Path = <<"/v1/events/", SingleId/binary, "/occurrences/2026-06-02T10:00:00Z">>,
|
||||
Resp = api_test_runner:client_request(delete, Path, Token),
|
||||
|
||||
@@ -31,7 +31,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, UserToken,
|
||||
#{title => <<"Event to report">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
|
||||
test_create_report(UserToken, EventId),
|
||||
|
||||
@@ -38,7 +38,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, OwnerToken,
|
||||
#{title => <<"Event for review">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
#{<<"id">> := BookingId} = api_test_runner:client_post(
|
||||
<<"/v1/events/", EventId/binary, "/bookings">>, ParticipantToken, #{}),
|
||||
|
||||
@@ -35,7 +35,7 @@ test() ->
|
||||
#{<<"id">> := EventId} = api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, OwnerToken,
|
||||
#{title => <<"Event for review">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60}),
|
||||
|
||||
% Бронируем и подтверждаем участие
|
||||
|
||||
@@ -33,13 +33,13 @@ test() ->
|
||||
api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, Token,
|
||||
#{title => <<"Python Workshop">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60,
|
||||
tags => [<<"python">>, <<"workshop">>]}),
|
||||
api_test_runner:client_post(
|
||||
<<"/v1/calendars/", CalId/binary, "/events">>, Token,
|
||||
#{title => <<"JavaScript Meetup">>,
|
||||
start_time => <<"2026-06-15T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60,
|
||||
tags => [<<"javascript">>]}),
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ test() ->
|
||||
CalId = api_test_runner:create_calendar(UserToken, #{title => <<"WS Test Calendar">>, type => <<"commercial">>}),
|
||||
_EventId = api_test_runner:create_event(UserToken, CalId, #{
|
||||
title => <<"WS Test Event">>,
|
||||
start_time => <<"2026-06-01T10:00:00Z">>,
|
||||
start_time => api_test_runner:future_date_iso8601(),
|
||||
duration => 60
|
||||
}),
|
||||
|
||||
|
||||
Reference in New Issue
Block a user