-module(core_ticket_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). setup() -> mnesia:start(), mnesia:create_table(ticket, [ {attributes, record_info(fields, ticket)}, {ram_copies, [node()]} ]), ok. cleanup(_) -> mnesia:delete_table(ticket), mnesia:stop(), ok. core_ticket_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"Create ticket test", fun test_create_ticket/0}, {"Update existing ticket test", fun test_update_ticket/0}, {"Get ticket by id test", fun test_get_by_id/0}, {"Get ticket by error hash test", fun test_get_by_error_hash/0}, {"List all tickets test", fun test_list_all/0}, {"List by status test", fun test_list_by_status/0}, {"Update status test", fun test_update_status/0}, {"Assign ticket test", fun test_assign_ticket/0}, {"Add resolution test", fun test_add_resolution/0} ]}. test_create_ticket() -> ErrorMsg = <<"Test error">>, Stacktrace = <<"line 1\nline 2">>, Context = #{user_id => <<"user123">>}, {ok, Ticket} = core_ticket:create_or_update(ErrorMsg, Stacktrace, Context), ?assertEqual(ErrorMsg, Ticket#ticket.error_message), ?assertEqual(Stacktrace, Ticket#ticket.stacktrace), ?assertEqual(1, Ticket#ticket.count), ?assertEqual(open, Ticket#ticket.status), ?assert(is_binary(Ticket#ticket.id)), ?assert(is_binary(Ticket#ticket.error_hash)). test_update_ticket() -> ErrorMsg = <<"Test error">>, Stacktrace = <<"line 1">>, Context = #{}, {ok, Ticket1} = core_ticket:create_or_update(ErrorMsg, Stacktrace, Context), ?assertEqual(1, Ticket1#ticket.count), {ok, Ticket2} = core_ticket:create_or_update(ErrorMsg, Stacktrace, Context), ?assertEqual(Ticket1#ticket.id, Ticket2#ticket.id), ?assertEqual(2, Ticket2#ticket.count), ?assert(Ticket2#ticket.last_seen >= Ticket1#ticket.last_seen). test_get_by_id() -> {ok, Ticket} = core_ticket:create_or_update(<<"Error">>, <<"">>, #{}), {ok, Found} = core_ticket:get_by_id(Ticket#ticket.id), ?assertEqual(Ticket#ticket.id, Found#ticket.id), {error, not_found} = core_ticket:get_by_id(<<"nonexistent">>). test_get_by_error_hash() -> ErrorMsg = <<"Unique error">>, Stacktrace = <<"stack">>, {ok, Ticket} = core_ticket:create_or_update(ErrorMsg, Stacktrace, #{}), {ok, Found} = core_ticket:get_by_error_hash(Ticket#ticket.error_hash), ?assertEqual(Ticket#ticket.id, Found#ticket.id), {error, not_found} = core_ticket:get_by_error_hash(<<"badhash">>). test_list_all() -> {ok, _} = core_ticket:create_or_update(<<"Error 1">>, <<"">>, #{}), {ok, _} = core_ticket:create_or_update(<<"Error 2">>, <<"">>, #{}), {ok, _} = core_ticket:create_or_update(<<"Error 3">>, <<"">>, #{}), {ok, Tickets} = core_ticket:list_all(), ?assertEqual(3, length(Tickets)). test_list_by_status() -> {ok, T1} = core_ticket:create_or_update(<<"E1">>, <<"">>, #{}), {ok, T2} = core_ticket:create_or_update(<<"E2">>, <<"">>, #{}), core_ticket:update_status(T2#ticket.id, resolved), {ok, Open} = core_ticket:list_by_status(open), ?assertEqual(1, length(Open)), {ok, Resolved} = core_ticket:list_by_status(resolved), ?assertEqual(1, length(Resolved)). test_update_status() -> {ok, Ticket} = core_ticket:create_or_update(<<"Error">>, <<"">>, #{}), {ok, Updated} = core_ticket:update_status(Ticket#ticket.id, in_progress), ?assertEqual(in_progress, Updated#ticket.status), {ok, Resolved} = core_ticket:update_status(Ticket#ticket.id, resolved), ?assertEqual(resolved, Resolved#ticket.status). test_assign_ticket() -> AdminId = <<"admin123">>, {ok, Ticket} = core_ticket:create_or_update(<<"Error">>, <<"">>, #{}), {ok, Assigned} = core_ticket:assign(Ticket#ticket.id, AdminId), ?assertEqual(AdminId, Assigned#ticket.assigned_to), ?assertEqual(in_progress, Assigned#ticket.status). test_add_resolution() -> Note = <<"Fixed in version 1.0">>, {ok, Ticket} = core_ticket:create_or_update(<<"Error">>, <<"">>, #{}), {ok, Updated} = core_ticket:add_resolution(Ticket#ticket.id, Note), ?assertEqual(Note, Updated#ticket.resolution_note).