Files
EventHubBack/test/api/users/user_verification_tests.erl
T

62 lines
3.1 KiB
Erlang

%%%-------------------------------------------------------------------
%%% @doc Тесты процесса подтверждения регистрации.
%%%
%%% Проверяет:
%%% - регистрация создаёт пользователя со статусом `pending`
%%% - вход до подтверждения возвращает 403
%%% - получение верификационного токена через админку
%%% - подтверждение аккаунта через публичный эндпоинт
%%% - после подтверждения вход успешен
%%% - повторное использование токена возвращает ошибку
%%% - невалидный токен возвращает 404
%%% @end
%%%-------------------------------------------------------------------
-module(user_verification_tests).
-include_lib("eunit/include/eunit.hrl").
-export([test/0]).
-export([verification_test/0]).
verification_test() -> test().
-spec test() -> ok.
test() ->
ct:pal("=== User Verification Tests ==="),
AdminToken = api_test_runner:get_admin_token(),
Email = api_test_runner:unique_email(<<"verify">>),
Password = <<"TestPass123">>,
% 1. Регистрируем пользователя (должен получить статус pending)
{ok, 201, _, RegBody} = api_test_runner:client_request(post, <<"/v1/register">>, <<>>,
jsx:encode(#{email => Email, password => Password})),
#{<<"user">> := #{<<"id">> := UserId, <<"status">> := UserStatus}} =
jsx:decode(list_to_binary(RegBody), [return_maps]),
?assertEqual(<<"pending">>, UserStatus),
% 2. Попытка входа до подтверждения – должна вернуть 403
{ok, 403, _, _} = api_test_runner:client_request(post, <<"/v1/login">>, <<>>,
jsx:encode(#{email => Email, password => Password})),
% 3. Получаем верификационный токен через админку
#{<<"token">> := Token} = api_test_runner:admin_get(
<<"/v1/admin/users/", UserId/binary, "/verification-token">>, AdminToken),
% 4. Подтверждаем аккаунт через публичный эндпоинт
{ok, 200, _, _} = api_test_runner:client_request(post, <<"/v1/verify">>, <<>>,
jsx:encode(#{<<"token">> => Token})),
% 5. Теперь вход должен быть успешным
{ok, 200, _, LoginBody} = api_test_runner:client_request(post, <<"/v1/login">>, <<>>,
jsx:encode(#{email => Email, password => Password})),
#{<<"token">> := AuthToken} = jsx:decode(list_to_binary(LoginBody), [return_maps]),
?assert(is_binary(AuthToken)),
% 6. Повторное использование того же токена – ошибка 404
{ok, 404, _, _} = api_test_runner:client_request(post, <<"/v1/verify">>, <<>>,
jsx:encode(#{<<"token">> => Token})),
% 7. Невалидный токен – ошибка 404
{ok, 404, _, _} = api_test_runner:client_request(post, <<"/v1/verify">>, <<>>,
jsx:encode(#{<<"token">> => <<"invalid_token">>})),
ct:pal("=== All user verification tests passed ==="),
ok.