%%%------------------------------------------------------------------- %%% @doc Тесты административного API для управления бан-словами. %%% %%% Покрывает эндпоинты: %%% GET /v1/admin/banned-words %%% POST /v1/admin/banned-words %%% DELETE /v1/admin/banned-words/:word %%% %%% Проверяет: %%% - получение списка слов %%% - добавление нового слова %%% - удаление слова %%% - пагинацию %%% @end %%%------------------------------------------------------------------- -module(admin_banned_words_tests). -include_lib("eunit/include/eunit.hrl"). -export([test/0]). %%%=================================================================== %%% Главная тестовая функция %%%=================================================================== -spec test() -> ok. test() -> ct:pal("=== Admin Banned Words Tests ==="), Token = api_test_runner:get_admin_token(), % Добавляем два исходных слова Unique = integer_to_binary(erlang:system_time()), Word1 = <<"badword1_", Unique/binary>>, Word2 = <<"badword2_", Unique/binary>>, api_test_runner:admin_post(<<"/v1/admin/banned-words">>, Token, #{<<"word">> => Word1}), api_test_runner:admin_post(<<"/v1/admin/banned-words">>, Token, #{<<"word">> => Word2}), test_list_words(Token, Word1, Word2), test_add_word(Token), test_words_pagination(Token), test_delete_word(Token, Word1), test_delete_word(Token, Word2), ct:pal("=== All admin banned words tests passed ==="), ok. %%%=================================================================== %%% Тестовые функции %%%=================================================================== %% @doc GET /v1/admin/banned-words – список всех слов. -spec test_list_words(binary(), binary(), binary()) -> ok. test_list_words(Token, Word1, Word2) -> ct:pal(" TEST: List all banned words"), Words = api_test_runner:admin_get(<<"/v1/admin/banned-words">>, Token), ?assert(is_list(Words)), ?assert(length(Words) >= 2), ?assert(lists:any(fun(W) -> maps:get(<<"word">>, W) =:= Word1 orelse maps:get(<<"word">>, W) =:= Word2 end, Words)), ct:pal(" OK: ~p words", [length(Words)]). %% @doc POST /v1/admin/banned-words – добавление нового слова. -spec test_add_word(binary()) -> ok. test_add_word(Token) -> ct:pal(" TEST: Add a new banned word"), Unique = integer_to_binary(erlang:system_time()), NewWord = <<"newbadword", Unique/binary>>, Result = api_test_runner:admin_post(<<"/v1/admin/banned-words">>, Token, #{<<"word">> => NewWord}), ?assertEqual(<<"added">>, maps:get(<<"status">>, Result)), Words = api_test_runner:admin_get(<<"/v1/admin/banned-words">>, Token), ?assert(lists:any(fun(W) -> maps:get(<<"word">>, W) =:= NewWord end, Words)), ct:pal(" OK"). %% @doc DELETE /v1/admin/banned-words/:word – удаление слова. -spec test_delete_word(binary(), binary()) -> ok. test_delete_word(Token, Word) -> ct:pal(" TEST: Delete a banned word"), Path = <<"/v1/admin/banned-words/", Word/binary>>, Result = api_test_runner:admin_delete(Path, Token), ?assertEqual(<<"deleted">>, maps:get(<<"status">>, Result)), Words = api_test_runner:admin_get(<<"/v1/admin/banned-words">>, Token), ?assertNot(lists:any(fun(W) -> maps:get(<<"word">>, W) =:= Word end, Words)), ct:pal(" OK"). %% @doc GET /v1/admin/banned-words?limit=...&offset=... – пагинация. -spec test_words_pagination(binary()) -> ok. test_words_pagination(Token) -> ct:pal(" TEST: Banned words pagination"), Page1 = api_test_runner:admin_get(<<"/v1/admin/banned-words?limit=1&offset=0">>, Token), ?assert(length(Page1) >= 1), Page2 = api_test_runner:admin_get(<<"/v1/admin/banned-words?limit=1&offset=1">>, Token), ?assert(length(Page2) >= 1), Id1 = maps:get(<<"id">>, hd(Page1)), Id2 = maps:get(<<"id">>, hd(Page2)), ?assertNotEqual(Id1, Id2), ct:pal(" OK").