Files
EventHubBack/test/api/users/user_review_by_id_tests.erl

126 lines
5.6 KiB
Erlang
Raw Permalink 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 Тесты клиентского API для работы с конкретным отзывом.
%%%
%%% Покрывает эндпоинты:
%%% GET /v1/reviews/:id
%%% PUT /v1/reviews/:id
%%% DELETE /v1/reviews/:id
%%%
%%% Проверяет:
%%% - получение отзыва по ID
%%% - обновление отзыва (автором)
%%% - удаление отзыва (автором)
%%% - ошибку 403 при попытке изменения чужим пользователем
%%% - ошибку 404 для несуществующего отзыва
%%% - ошибку 401 без токена
%%% @end
%%%-------------------------------------------------------------------
-module(user_review_by_id_tests).
-include_lib("eunit/include/eunit.hrl").
-export([test/0]).
%%%===================================================================
%%% Главная тестовая функция
%%%===================================================================
-spec test() -> ok.
test() ->
ct:pal("=== User Review By ID Tests ==="),
OwnerToken = api_test_runner:get_user_token(),
ParticipantEmail = api_test_runner:unique_email(<<"reviewer">>),
ParticipantToken = api_test_runner:register_and_login(ParticipantEmail, <<"pass">>),
StrangerEmail = api_test_runner:unique_email(<<"stranger">>),
StrangerToken = api_test_runner:register_and_login(StrangerEmail, <<"pass">>),
% Создаём календарь, событие, бронирование и отзыв
CalId = api_test_runner:create_calendar(OwnerToken, #{title => <<"RevById">>}),
#{<<"id">> := EventId} = api_test_runner:client_post(
<<"/v1/calendars/", CalId/binary, "/events">>, OwnerToken,
#{title => <<"Event for 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 => 5,
comment => <<"Excellent!">>}),
test_get_review(ParticipantToken, ReviewId),
test_update_review(ParticipantToken, ReviewId),
test_update_review_forbidden(StrangerToken, ReviewId),
test_delete_review(ParticipantToken, ReviewId),
test_get_review_not_found(ParticipantToken),
test_get_review_unauthorized(ReviewId),
ct:pal("=== All user review by id tests passed ==="),
ok.
%%%===================================================================
%%% Тестовые функции
%%%===================================================================
%% @doc GET /v1/reviews/:id получение отзыва.
-spec test_get_review(binary(), binary()) -> ok.
test_get_review(Token, ReviewId) ->
ct:pal(" TEST: Get review by ID"),
Path = <<"/v1/reviews/", ReviewId/binary>>,
Review = api_test_runner:client_get(Path, Token),
?assertEqual(ReviewId, maps:get(<<"id">>, Review)),
?assertEqual(<<"Excellent!">>, maps:get(<<"comment">>, Review)),
ct:pal(" OK: got review").
%% @doc PUT /v1/reviews/:id обновление отзыва автором.
-spec test_update_review(binary(), binary()) -> ok.
test_update_review(Token, ReviewId) ->
ct:pal(" TEST: Update review"),
Path = <<"/v1/reviews/", ReviewId/binary>>,
Updated = api_test_runner:client_put(Path, Token,
#{comment => <<"Updated comment">>, rating => 4}),
?assertEqual(<<"Updated comment">>, maps:get(<<"comment">>, Updated)),
?assertEqual(4, maps:get(<<"rating">>, Updated)),
ct:pal(" OK").
%% @doc PUT /v1/reviews/:id попытка обновления чужим пользователем (403).
-spec test_update_review_forbidden(binary(), binary()) -> ok.
test_update_review_forbidden(StrangerToken, ReviewId) ->
ct:pal(" TEST: Update review by non-author"),
Path = <<"/v1/reviews/", ReviewId/binary>>,
Resp = api_test_runner:client_request(put, Path, StrangerToken,
jsx:encode(#{comment => <<"fail">>})),
?assertMatch({ok, 403, _, _}, Resp),
ct:pal(" OK: got 403").
%% @doc DELETE /v1/reviews/:id удаление отзыва автором.
-spec test_delete_review(binary(), binary()) -> ok.
test_delete_review(Token, ReviewId) ->
ct:pal(" TEST: Delete review"),
Path = <<"/v1/reviews/", ReviewId/binary>>,
% Удаляем
{ok, 200, _, _} = api_test_runner:client_request(delete, Path, Token),
% Проверяем, что отзыв больше недоступен
GetResp = api_test_runner:client_request(get, Path, Token),
?assertMatch({ok, 404, _, _}, GetResp),
ct:pal(" OK: review deleted").
%% @doc GET /v1/reviews/:id несуществующий отзыв (404).
-spec test_get_review_not_found(binary()) -> ok.
test_get_review_not_found(Token) ->
ct:pal(" TEST: Get non-existent review"),
Resp = api_test_runner:client_request(get, <<"/v1/reviews/fakeid">>, Token),
?assertMatch({ok, 404, _, _}, Resp),
ct:pal(" OK: got 404").
%% @doc GET /v1/reviews/:id без токена (401).
-spec test_get_review_unauthorized(binary()) -> ok.
test_get_review_unauthorized(ReviewId) ->
ct:pal(" TEST: Get review without token"),
Path = <<"/v1/reviews/", ReviewId/binary>>,
Resp = api_test_runner:client_request(get, Path, <<>>),
?assertMatch({ok, 401, _, _}, Resp),
ct:pal(" OK: got 401").