-module(core_report_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). setup() -> mnesia:start(), mnesia:create_table(report, [ {attributes, record_info(fields, report)}, {ram_copies, [node()]} ]), ok. cleanup(_) -> mnesia:delete_table(report), mnesia:stop(), ok. core_report_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"Create report test", fun test_create_report/0}, {"Get report by id test", fun test_get_by_id/0}, {"List reports by target test", fun test_list_by_target/0}, {"List reports by reporter test", fun test_list_by_reporter/0}, {"Update report status test", fun test_update_status/0}, {"Get count by target test", fun test_get_count_by_target/0} ]}. test_create_report() -> ReporterId = <<"user123">>, TargetType = event, TargetId = <<"event123">>, Reason = <<"Inappropriate content">>, {ok, Report} = core_report:create(ReporterId, TargetType, TargetId, Reason), ?assertEqual(ReporterId, Report#report.reporter_id), ?assertEqual(TargetType, Report#report.target_type), ?assertEqual(TargetId, Report#report.target_id), ?assertEqual(Reason, Report#report.reason), ?assertEqual(pending, Report#report.status), ?assertEqual(undefined, Report#report.resolved_at), ?assertEqual(undefined, Report#report.resolved_by), ?assert(is_binary(Report#report.id)). test_get_by_id() -> ReporterId = <<"user123">>, {ok, Report} = core_report:create(ReporterId, event, <<"ev1">>, <<"Bad">>), {ok, Found} = core_report:get_by_id(Report#report.id), ?assertEqual(Report#report.id, Found#report.id), {error, not_found} = core_report:get_by_id(<<"nonexistent">>). test_list_by_target() -> User1 = <<"user1">>, User2 = <<"user2">>, EventId = <<"event123">>, {ok, _} = core_report:create(User1, event, EventId, <<"Reason 1">>), {ok, _} = core_report:create(User2, event, EventId, <<"Reason 2">>), {ok, _} = core_report:create(User1, calendar, <<"cal1">>, <<"Reason 3">>), {ok, Reports} = core_report:list_by_target(event, EventId), ?assertEqual(2, length(Reports)). test_list_by_reporter() -> User1 = <<"user1">>, User2 = <<"user2">>, {ok, _} = core_report:create(User1, event, <<"ev1">>, <<"">>), {ok, _} = core_report:create(User1, event, <<"ev2">>, <<"">>), {ok, _} = core_report:create(User2, event, <<"ev3">>, <<"">>), {ok, Reports} = core_report:list_by_reporter(User1), ?assertEqual(2, length(Reports)). test_update_status() -> ReporterId = <<"user123">>, AdminId = <<"admin123">>, {ok, Report} = core_report:create(ReporterId, event, <<"ev1">>, <<"">>), {ok, Updated} = core_report:update_status(Report#report.id, reviewed, AdminId), ?assertEqual(reviewed, Updated#report.status), ?assertEqual(AdminId, Updated#report.resolved_by), ?assert(Updated#report.resolved_at =/= undefined). test_get_count_by_target() -> User1 = <<"user1">>, User2 = <<"user2">>, EventId = <<"event123">>, ?assertEqual(0, core_report:get_count_by_target(event, EventId)), {ok, _} = core_report:create(User1, event, EventId, <<"">>), ?assertEqual(1, core_report:get_count_by_target(event, EventId)), {ok, _} = core_report:create(User2, event, EventId, <<"">>), ?assertEqual(2, core_report:get_count_by_target(event, EventId)).