-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 = <>, 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)).