%%%------------------------------------------------------------------- %%% @doc Тесты административного API для обновления токена. %%% Покрывает эндпоинт: %%% POST /v1/admin/refresh %%% @end %%%------------------------------------------------------------------- -module(admin_refresh_tests). -include_lib("eunit/include/eunit.hrl"). -export([test/0]). -spec test() -> ok. test() -> ct:pal("=== Admin Refresh Tests ==="), RefreshToken = api_test_runner:get_admin_refresh_token(), test_successful_refresh(RefreshToken), test_invalid_refresh_token(), test_missing_refresh_token(), ct:pal("=== All admin refresh tests passed ==="), ok. -spec test_successful_refresh(binary()) -> ok. test_successful_refresh(RefreshToken) -> ct:pal(" TEST: Successful admin token refresh"), Resp = api_test_runner:admin_request(post, <<"/v1/admin/refresh">>, <<>>, jsx:encode(#{refresh_token => RefreshToken})), {ok, 200, _, Body} = Resp, #{<<"token">> := NewToken, <<"refresh_token">> := NewRefresh} = jsx:decode(list_to_binary(Body), [return_maps]), ?assert(is_binary(NewToken)), ?assert(is_binary(NewRefresh)), ?assertNotEqual(RefreshToken, NewRefresh), ct:pal(" OK: got new admin token pair"). -spec test_invalid_refresh_token() -> ok. test_invalid_refresh_token() -> ct:pal(" TEST: Invalid admin refresh token"), Resp = api_test_runner:admin_request(post, <<"/v1/admin/refresh">>, <<>>, jsx:encode(#{refresh_token => <<"bad">>})), {ok, 401, _, _} = Resp, ct:pal(" OK: got 401"). -spec test_missing_refresh_token() -> ok. test_missing_refresh_token() -> ct:pal(" TEST: Missing refresh_token field for admin"), Resp = api_test_runner:admin_request(post, <<"/v1/admin/refresh">>, <<>>, jsx:encode(#{})), ?assertMatch({ok, 400, _, _}, Resp), ct:pal(" OK: got 400").