%%%------------------------------------------------------------------- %%% @doc Тесты клиентского API для получения своих отзывов. %%% %%% Покрывает эндпоинты: %%% GET /v1/user/reviews %%% %%% Проверяет: %%% - получение списка отзывов текущего пользователя %%% - наличие созданного отзыва в ответе %%% - ошибку 401 при отсутствии токена %%% @end %%%------------------------------------------------------------------- -module(user_my_reviews_tests). -include_lib("eunit/include/eunit.hrl"). -export([test/0]). %%%=================================================================== %%% Главная тестовая функция %%%=================================================================== -spec test() -> ok. test() -> ct:pal("=== User My Reviews Tests ==="), OwnerToken = api_test_runner:get_user_token(), ParticipantEmail = api_test_runner:unique_email(<<"myreviewer">>), ParticipantToken = api_test_runner:register_and_login(ParticipantEmail, <<"pass">>), % Создаём календарь и событие CalId = api_test_runner:create_calendar(OwnerToken, #{title => <<"MyRevTest">>}), #{<<"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">>, duration => 60}), % Бронируем, подтверждаем, оставляем отзыв #{<<"id">> := BookingId} = api_test_runner:client_post( <<"/v1/events/", EventId/binary, "/bookings">>, ParticipantToken, #{}), api_test_runner:client_put(<<"/v1/bookings/", BookingId/binary>>, OwnerToken, #{action => <<"confirm">>}), #{<<"id">> := ReviewId} = api_test_runner:client_post( <<"/v1/reviews">>, ParticipantToken, #{target_type => <<"event">>, target_id => EventId, rating => 4, comment => <<"Nice event!">>}), test_get_my_reviews(ParticipantToken, ReviewId), test_get_my_reviews_unauthorized(), ct:pal("=== All user my reviews tests passed ==="), ok. %%%=================================================================== %%% Тестовые функции %%%=================================================================== %% @doc Успешное получение своих отзывов: 200 OK, содержит отзыв. -spec test_get_my_reviews(binary(), binary()) -> ok. test_get_my_reviews(Token, ExpectedReviewId) -> ct:pal(" TEST: Get my reviews"), Reviews = api_test_runner:client_get(<<"/v1/user/reviews">>, Token), ?assert(is_list(Reviews)), ?assert(length(Reviews) >= 1), ?assert(lists:any(fun(R) -> maps:get(<<"id">>, R) =:= ExpectedReviewId end, Reviews)), ct:pal(" OK: review ~s found in list", [ExpectedReviewId]). %% @doc Запрос без токена: 401 Unauthorized. -spec test_get_my_reviews_unauthorized() -> ok. test_get_my_reviews_unauthorized() -> ct:pal(" TEST: Get my reviews without token"), Resp = api_test_runner:client_request(get, <<"/v1/user/reviews">>, <<>>), ?assertMatch({ok, 401, _, _}, Resp), ct:pal(" OK: got 401").