Перенести все админские эндпоинты на порт 8445 и добавить отдельную авторизацию для админов. Часть 2. Final #3
This commit is contained in:
@@ -2,104 +2,106 @@
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
-include("records.hrl").
|
||||
|
||||
%% ----------------------------------------------------------------
|
||||
%% Фикстуры
|
||||
%% ----------------------------------------------------------------
|
||||
setup() ->
|
||||
mnesia:start(),
|
||||
mnesia:create_table(user, [{attributes, record_info(fields, user)}, {ram_copies, [node()]}]),
|
||||
mnesia:create_table(ticket, [{attributes, record_info(fields, ticket)}, {ram_copies, [node()]}]),
|
||||
catch mnesia:stop(),
|
||||
case mnesia:start() of
|
||||
{atomic, ok} -> ok;
|
||||
ok -> ok
|
||||
end,
|
||||
{atomic, ok} = mnesia:create_table(user, [
|
||||
{attributes, record_info(fields, user)}, {ram_copies, [node()]}]),
|
||||
{atomic, ok} = mnesia:create_table(ticket, [
|
||||
{attributes, record_info(fields, ticket)}, {ram_copies, [node()]}]),
|
||||
% Создаём админа и обычного пользователя
|
||||
Admin = #user{id = <<"admin1">>, email = <<"a@a.a">>, password_hash = <<"h">>,
|
||||
role = admin, status = active,
|
||||
created_at = calendar:universal_time(), updated_at = calendar:universal_time()},
|
||||
User = #user{id = <<"user1">>, email = <<"u@u.u">>, password_hash = <<"h">>,
|
||||
role = user, status = active,
|
||||
created_at = calendar:universal_time(), updated_at = calendar:universal_time()},
|
||||
mnesia:dirty_write(Admin),
|
||||
mnesia:dirty_write(User),
|
||||
ok.
|
||||
|
||||
cleanup(_) ->
|
||||
mnesia:delete_table(ticket),
|
||||
mnesia:delete_table(user),
|
||||
mnesia:stop(),
|
||||
ok.
|
||||
mnesia:delete_table(ticket),
|
||||
mnesia:stop().
|
||||
|
||||
%% ----------------------------------------------------------------
|
||||
%% Тесты
|
||||
%% ----------------------------------------------------------------
|
||||
logic_ticket_test_() ->
|
||||
{foreach,
|
||||
fun setup/0,
|
||||
fun cleanup/1,
|
||||
[
|
||||
{"Report error test", fun test_report_error/0},
|
||||
{"List tickets admin only", fun test_list_tickets_admin_only/0},
|
||||
{"Update status test", fun test_update_status/0},
|
||||
{"Assign ticket test", fun test_assign_ticket/0},
|
||||
{"Resolve ticket test", fun test_resolve_ticket/0},
|
||||
{"Close ticket test", fun test_close_ticket/0},
|
||||
{"Get statistics test", fun test_get_statistics/0}
|
||||
]}.
|
||||
{foreach, fun setup/0, fun cleanup/1, [
|
||||
{"Report error creates ticket", fun test_report_error/0},
|
||||
{"Report duplicate error increments count", fun test_report_duplicate/0},
|
||||
{"List tickets as admin", fun test_list_tickets/0},
|
||||
{"List tickets as non-admin returns error", fun test_list_tickets_forbidden/0},
|
||||
{"Update status as admin", fun test_update_status/0},
|
||||
{"Assign ticket as admin", fun test_assign_ticket/0},
|
||||
{"Resolve ticket as admin", fun test_resolve_ticket/0},
|
||||
{"Close ticket as admin", fun test_close_ticket/0},
|
||||
{"Get statistics as admin", fun test_get_statistics/0}
|
||||
]}.
|
||||
|
||||
create_test_user(Role) ->
|
||||
UserId = base64:encode(crypto:strong_rand_bytes(16), #{mode => urlsafe, padding => false}),
|
||||
User = #user{id = UserId, email = <<UserId/binary, "@test.com">>, password_hash = <<"hash">>,
|
||||
role = Role, status = active, created_at = calendar:universal_time(), updated_at = calendar:universal_time()},
|
||||
mnesia:dirty_write(User),
|
||||
UserId.
|
||||
%% --- Вспомогательная функция для создания тикета ---
|
||||
report(ErrorMsg) ->
|
||||
logic_ticket:report_error(ErrorMsg, <<"stack">>, #{}).
|
||||
|
||||
%% --- Тесты ---
|
||||
|
||||
test_report_error() ->
|
||||
{ok, Ticket} = logic_ticket:report_error(<<"Test error">>, <<"stack">>, #{}),
|
||||
?assertEqual(<<"Test error">>, Ticket#ticket.error_message),
|
||||
?assertEqual(1, Ticket#ticket.count),
|
||||
{ok, Ticket} = report(<<"Error1">>),
|
||||
?assertEqual(<<"Error1">>, Ticket#ticket.error_message),
|
||||
?assertEqual(1, Ticket#ticket.count).
|
||||
|
||||
{ok, Ticket2} = logic_ticket:report_error(<<"Test error">>, <<"stack">>, #{}),
|
||||
?assertEqual(2, Ticket2#ticket.count).
|
||||
test_report_duplicate() ->
|
||||
{ok, T1} = report(<<"Dup">>),
|
||||
?assertEqual(1, T1#ticket.count),
|
||||
{ok, T2} = report(<<"Dup">>),
|
||||
?assertEqual(2, T2#ticket.count),
|
||||
% Проверяем, что это тот же тикет, а не новый
|
||||
?assertEqual(T1#ticket.id, T2#ticket.id).
|
||||
|
||||
test_list_tickets_admin_only() ->
|
||||
AdminId = create_test_user(admin),
|
||||
UserId = create_test_user(user),
|
||||
test_list_tickets() ->
|
||||
{ok, _} = report(<<"E1">>),
|
||||
Tickets = logic_ticket:list_tickets(<<"admin1">>),
|
||||
?assert(length(Tickets) =:= 1).
|
||||
|
||||
{ok, _} = logic_ticket:report_error(<<"E1">>, <<"">>, #{}),
|
||||
{ok, _} = logic_ticket:report_error(<<"E2">>, <<"">>, #{}),
|
||||
|
||||
{ok, Tickets} = logic_ticket:list_tickets(AdminId),
|
||||
?assertEqual(2, length(Tickets)),
|
||||
|
||||
{error, access_denied} = logic_ticket:list_tickets(UserId).
|
||||
test_list_tickets_forbidden() ->
|
||||
{error, access_denied} = logic_ticket:list_tickets(<<"user1">>).
|
||||
|
||||
test_update_status() ->
|
||||
AdminId = create_test_user(admin),
|
||||
UserId = create_test_user(user),
|
||||
{ok, Ticket} = logic_ticket:report_error(<<"Error">>, <<"">>, #{}),
|
||||
|
||||
{ok, Updated} = logic_ticket:update_status(AdminId, Ticket#ticket.id, in_progress),
|
||||
?assertEqual(in_progress, Updated#ticket.status),
|
||||
|
||||
{error, access_denied} = logic_ticket:update_status(UserId, Ticket#ticket.id, resolved).
|
||||
{ok, Ticket} = report(<<"E2">>),
|
||||
{ok, Updated} = logic_ticket:update_status(<<"admin1">>, Ticket#ticket.id, <<"closed">>),
|
||||
?assertEqual(closed, Updated#ticket.status).
|
||||
|
||||
test_assign_ticket() ->
|
||||
AdminId = create_test_user(admin),
|
||||
AssignToId = create_test_user(admin),
|
||||
{ok, Ticket} = logic_ticket:report_error(<<"Error">>, <<"">>, #{}),
|
||||
|
||||
{ok, Assigned} = logic_ticket:assign_ticket(AdminId, Ticket#ticket.id, AssignToId),
|
||||
?assertEqual(AssignToId, Assigned#ticket.assigned_to),
|
||||
?assertEqual(in_progress, Assigned#ticket.status).
|
||||
{ok, Ticket} = report(<<"E3">>),
|
||||
{ok, Updated} = logic_ticket:assign_ticket(<<"admin1">>, Ticket#ticket.id, <<"dev1">>),
|
||||
?assertEqual(<<"dev1">>, Updated#ticket.assigned_to).
|
||||
|
||||
test_resolve_ticket() ->
|
||||
AdminId = create_test_user(admin),
|
||||
{ok, Ticket} = logic_ticket:report_error(<<"Error">>, <<"">>, #{}),
|
||||
|
||||
{ok, Resolved} = logic_ticket:resolve_ticket(AdminId, Ticket#ticket.id, <<"Fixed">>),
|
||||
?assertEqual(<<"Fixed">>, Resolved#ticket.resolution_note),
|
||||
?assertEqual(resolved, Resolved#ticket.status).
|
||||
{ok, Ticket} = report(<<"E4">>),
|
||||
{ok, Updated} = logic_ticket:resolve_ticket(<<"admin1">>, Ticket#ticket.id, <<"Fixed">>),
|
||||
?assertEqual(closed, Updated#ticket.status),
|
||||
?assertEqual(<<"Fixed">>, Updated#ticket.resolution_note).
|
||||
|
||||
test_close_ticket() ->
|
||||
AdminId = create_test_user(admin),
|
||||
{ok, Ticket} = logic_ticket:report_error(<<"Error">>, <<"">>, #{}),
|
||||
|
||||
{ok, Closed} = logic_ticket:close_ticket(AdminId, Ticket#ticket.id),
|
||||
?assertEqual(closed, Closed#ticket.status).
|
||||
{ok, Ticket} = report(<<"E5">>),
|
||||
{ok, Updated} = logic_ticket:close_ticket(<<"admin1">>, Ticket#ticket.id),
|
||||
?assertEqual(closed, Updated#ticket.status).
|
||||
|
||||
test_get_statistics() ->
|
||||
AdminId = create_test_user(admin),
|
||||
|
||||
{ok, _} = logic_ticket:report_error(<<"E1">>, <<"">>, #{}),
|
||||
{ok, _} = logic_ticket:report_error(<<"E2">>, <<"">>, #{}),
|
||||
{ok, T3} = logic_ticket:report_error(<<"E3">>, <<"">>, #{}),
|
||||
|
||||
logic_ticket:update_status(AdminId, T3#ticket.id, resolved),
|
||||
|
||||
Stats = logic_ticket:get_statistics(AdminId),
|
||||
{ok, _} = report(<<"E6">>),
|
||||
{ok, _} = report(<<"E7">>),
|
||||
{ok, T3} = report(<<"E8">>),
|
||||
logic_ticket:close_ticket(<<"admin1">>, T3#ticket.id),
|
||||
Stats = logic_ticket:get_statistics(<<"admin1">>),
|
||||
?assertEqual(3, maps:get(total_tickets, Stats)),
|
||||
?assertEqual(2, maps:get(open, Stats)),
|
||||
?assertEqual(1, maps:get(resolved, Stats)),
|
||||
?assertEqual(1, maps:get(closed, Stats)),
|
||||
?assertEqual(3, maps:get(total_errors, Stats)).
|
||||
Reference in New Issue
Block a user