%%%------------------------------------------------------------------- %%% @doc Тесты административного API для управления пользователями. %%% @end %%%------------------------------------------------------------------- -module(admin_users_tests). -include_lib("eunit/include/eunit.hrl"). -export([test/0]). test() -> ct:pal("=== Admin Users Tests ==="), Token = api_test_runner:get_admin_token(), %% Создаём тестового пользователя Email = api_test_runner:unique_email(<<"usertest">>), UserToken = api_test_runner:register_and_login(Email, <<"testpass">>), Me = api_test_runner:client_get(<<"/v1/user/me">>, UserToken), UserId = maps:get(<<"id">>, Me), test_list_users(Token), test_get_user(Token, UserId), test_update_user(Token, UserId), test_filter_users(Token), test_delete_user(Token, UserId), ct:pal("=== All admin users tests passed ==="), ok. test_list_users(Token) -> ct:pal(" TEST: List all users"), Users = api_test_runner:admin_get(<<"/v1/admin/users">>, Token), ?assert(is_list(Users)), ?assert(length(Users) >= 1), ct:pal(" OK: ~p users", [length(Users)]). test_get_user(Token, UserId) -> ct:pal(" TEST: Get user by ID"), Path = <<"/v1/admin/users/", UserId/binary>>, User = api_test_runner:admin_get(Path, Token), ?assertEqual(UserId, maps:get(<<"id">>, User)), ct:pal(" OK: ~s", [maps:get(<<"email">>, User)]). test_update_user(Token, UserId) -> ct:pal(" TEST: Update user (change role and status)"), Path = <<"/v1/admin/users/", UserId/binary>>, Updated = api_test_runner:admin_put(Path, Token, #{ <<"role">> => <<"bot">>, <<"status">> => <<"frozen">>, <<"reason">> => <<"Test freeze">> }), ?assertEqual(<<"bot">>, maps:get(<<"role">>, Updated)), ?assertEqual(<<"frozen">>, maps:get(<<"status">>, Updated)), ct:pal(" OK"). test_filter_users(Token) -> ct:pal(" TEST: Filter users by status=frozen"), Users = api_test_runner:admin_get(<<"/v1/admin/users?status=frozen">>, Token), ?assert(is_list(Users)), [?assertEqual(<<"frozen">>, maps:get(<<"status">>, U)) || U <- Users], ct:pal(" OK: ~p frozen users", [length(Users)]). test_delete_user(Token, UserId) -> ct:pal(" TEST: Delete (soft-delete) user"), Path = <<"/v1/admin/users/", UserId/binary>>, Deleted = api_test_runner:admin_delete(Path, Token), ?assertEqual(<<"deleted">>, maps:get(<<"status">>, Deleted)), ct:pal(" OK").