119 lines
5.0 KiB
Erlang
119 lines
5.0 KiB
Erlang
%%%-------------------------------------------------------------------
|
||
%%% @doc Тесты административного API для управления событиями.
|
||
%%% Покрывает эндпоинты:
|
||
%%% GET /v1/admin/events
|
||
%%% GET /v1/admin/events/:id
|
||
%%% PUT /v1/admin/events/:id
|
||
%%% DELETE /v1/admin/events/:id
|
||
%%% @end
|
||
%%%-------------------------------------------------------------------
|
||
-module(admin_events_tests).
|
||
-include_lib("eunit/include/eunit.hrl").
|
||
|
||
-export([test/0]).
|
||
|
||
%%%===================================================================
|
||
%%% EUnit test generator
|
||
%%%===================================================================
|
||
|
||
test() ->
|
||
ct:pal("=== Admin Events Tests ==="),
|
||
Token = api_test_runner:get_admin_token(),
|
||
UserToken = api_test_runner:get_user_token(),
|
||
|
||
%% Создаём тестовый календарь и два события
|
||
CalId = api_test_runner:create_calendar(UserToken, #{title => <<"EventsTestCal">>}),
|
||
Event1Id = api_test_runner:create_event(UserToken, CalId, #{
|
||
title => <<"Test Event Alpha">>,
|
||
start_time => api_test_runner:future_date(),
|
||
duration => 60
|
||
}),
|
||
Event2Id = api_test_runner:create_event(UserToken, CalId, #{
|
||
title => <<"Beta Event">>,
|
||
start_time => api_test_runner:future_date(),
|
||
duration => 60
|
||
}),
|
||
|
||
%% Выполняем тесты
|
||
test_list_events(Token, CalId, Event1Id, Event2Id),
|
||
test_get_event(Token, Event1Id),
|
||
test_update_event(Token, Event1Id),
|
||
test_delete_event(Token, Event2Id),
|
||
test_filter_events(Token, CalId),
|
||
test_search_events(Token, CalId),
|
||
test_event_pagination(Token, CalId),
|
||
test_delete_event(Token, Event1Id),
|
||
|
||
ct:pal("=== All admin events tests passed ==="),
|
||
ok.
|
||
|
||
%%%===================================================================
|
||
%%% Тестовые функции
|
||
%%%===================================================================
|
||
|
||
%% @doc GET /v1/admin/events – список событий (базовая проверка).
|
||
test_list_events(Token, _CalId, _Event1Id, _Event2Id) ->
|
||
ct:pal(" TEST: List all events"),
|
||
Events = api_test_runner:admin_get(<<"/v1/admin/events">>, Token),
|
||
?assert(is_list(Events)),
|
||
?assert(length(Events) >= 2),
|
||
ct:pal(" OK: ~p events found", [length(Events)]).
|
||
|
||
%% @doc GET /v1/admin/events/:id – получение события по ID.
|
||
test_get_event(Token, EventId) ->
|
||
ct:pal(" TEST: Get event by ID"),
|
||
Path = <<"/v1/admin/events/", EventId/binary>>,
|
||
Event = api_test_runner:admin_get(Path, Token),
|
||
?assertEqual(EventId, maps:get(<<"id">>, Event)),
|
||
?assertEqual(<<"active">>, maps:get(<<"status">>, Event)),
|
||
ct:pal(" OK: ~s", [maps:get(<<"title">>, Event)]).
|
||
|
||
%% @doc PUT /v1/admin/events/:id – обновление события.
|
||
test_update_event(Token, EventId) ->
|
||
ct:pal(" TEST: Update event"),
|
||
Path = <<"/v1/admin/events/", EventId/binary>>,
|
||
Updates = #{<<"title">> => <<"Updated by admin">>, <<"description">> => <<"Test update">>},
|
||
Updated = api_test_runner:admin_put(Path, Token, Updates),
|
||
?assertEqual(<<"Updated by admin">>, maps:get(<<"title">>, Updated)),
|
||
?assertEqual(<<"Test update">>, maps:get(<<"description">>, Updated)),
|
||
ct:pal(" OK").
|
||
|
||
%% @doc DELETE /v1/admin/events/:id – удаление события.
|
||
test_delete_event(Token, EventId) ->
|
||
ct:pal(" TEST: Delete event"),
|
||
Path = <<"/v1/admin/events/", EventId/binary>>,
|
||
Deleted = api_test_runner:admin_delete(Path, Token),
|
||
?assertEqual(<<"deleted">>, maps:get(<<"status">>, Deleted)),
|
||
ct:pal(" OK").
|
||
|
||
%% @doc GET /v1/admin/events?status=active – фильтрация по статусу.
|
||
test_filter_events(Token, CalId) ->
|
||
ct:pal(" TEST: Filter events by status=active"),
|
||
Path = <<"/v1/admin/events?calendar_id=", CalId/binary, "&status=active">>,
|
||
Events = api_test_runner:admin_get(Path, Token),
|
||
?assert(is_list(Events)),
|
||
[?assertEqual(<<"active">>, maps:get(<<"status">>, E)) || E <- Events],
|
||
ct:pal(" OK: ~p events", [length(Events)]).
|
||
|
||
%% @doc GET /v1/admin/events?q=... – поиск по подстроке.
|
||
test_search_events(Token, CalId) ->
|
||
ct:pal(" TEST: Search events by title substring"),
|
||
Path = <<"/v1/admin/events?calendar_id=", CalId/binary, "&q=Updated">>,
|
||
Events = api_test_runner:admin_get(Path, Token),
|
||
?assert(is_list(Events)),
|
||
?assert(length(Events) >= 1),
|
||
[?assertNotEqual(nomatch, binary:match(maps:get(<<"title">>, E), <<"Updated">>)) || E <- Events],
|
||
ct:pal(" OK: ~p results", [length(Events)]).
|
||
|
||
%% @doc GET /v1/admin/events?limit=...&offset=... – пагинация.
|
||
test_event_pagination(Token, CalId) ->
|
||
ct:pal(" TEST: Event pagination"),
|
||
Base = <<"/v1/admin/events?calendar_id=", CalId/binary, "&status=all&sort=title&order=asc">>,
|
||
Page1 = api_test_runner:admin_get(<<Base/binary, "&limit=1&offset=0">>, Token),
|
||
?assertEqual(1, length(Page1)),
|
||
Page2 = api_test_runner:admin_get(<<Base/binary, "&limit=1&offset=1">>, Token),
|
||
?assertEqual(1, length(Page2)),
|
||
Id1 = maps:get(<<"id">>, hd(Page1)),
|
||
Id2 = maps:get(<<"id">>, hd(Page2)),
|
||
?assertNotEqual(Id1, Id2),
|
||
ct:pal(" OK"). |