%%%------------------------------------------------------------------- %%% @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(<>, Token), ?assertEqual(1, length(Page1)), Page2 = api_test_runner:admin_get(<>, Token), ?assertEqual(1, length(Page2)), Id1 = maps:get(<<"id">>, hd(Page1)), Id2 = maps:get(<<"id">>, hd(Page2)), ?assertNotEqual(Id1, Id2), ct:pal(" OK").