Files
EventHubBack/test/unit/logic_ticket_tests.erl

105 lines
3.8 KiB
Erlang

-module(logic_ticket_tests).
-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()]}]),
ok.
cleanup(_) ->
mnesia:delete_table(ticket),
mnesia:delete_table(user),
mnesia:stop(),
ok.
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}
]}.
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.
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, Ticket2} = logic_ticket:report_error(<<"Test error">>, <<"stack">>, #{}),
?assertEqual(2, Ticket2#ticket.count).
test_list_tickets_admin_only() ->
AdminId = create_test_user(admin),
UserId = create_test_user(user),
{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_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).
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).
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).
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).
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),
?assertEqual(3, maps:get(total_tickets, Stats)),
?assertEqual(2, maps:get(open, Stats)),
?assertEqual(1, maps:get(resolved, Stats)),
?assertEqual(3, maps:get(total_errors, Stats)).