-module(admin_handler_event_stats_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). -define(TABLES, [admin, admin_audit, calendar, event, ticket]). -define(ADMIN_ID, <<"adm_test_1">>). -define(OWNER_ID, <<"owner_evt_stats">>). setup() -> eh_test_support:start_mnesia(), eh_test_support:ensure_tables(?TABLES), eh_test_support:ensure_jwt(), eh_test_support:seed_admin(#{id => ?ADMIN_ID}), ok. cleanup(_) -> eh_test_support:unload_cowboy(), eh_test_support:delete_tables(?TABLES), eh_test_support:stop_mnesia(), ok. admin_event_stats_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"GET stats – empty", {timeout, 60, fun test_stats_empty/0}}, {"GET stats – with events", {timeout, 60, fun test_stats_with_data/0}}, {"GET – unauthorized", {timeout, 60, fun test_unauthorized/0}}, {"POST – method not allowed", {timeout, 60, fun test_wrong_method/0}} ]}. test_stats_empty() -> {Status, _, Body} = eh_test_support:call(admin_handler_event_stats, #{ method => <<"GET">>, path => <<"/v1/admin/events/stats">>, auth => ?ADMIN_ID }), ?assertEqual(200, Status), Result = jsx:decode(Body, [return_maps]), ?assertEqual(0, maps:get(<<"total_events">>, Result)), ?assertEqual(#{}, maps:get(<<"events_by_type">>, Result)), ?assertEqual(#{}, maps:get(<<"events_by_status">>, Result)), ?assertEqual([], maps:get(<<"top_events_by_rating">>, Result)). test_stats_with_data() -> {ok, Cal} = core_calendar:create(?OWNER_ID, <<"Cal">>, <<"">>, auto), CalId = Cal#calendar.id, Start = eh_test_support:future_start(), {ok, E1} = core_event:create(CalId, <<"Rated">>, Start, 60), {ok, _} = core_event:create(CalId, <<"Other">>, Start, 30), {ok, _} = core_event:update(E1#event.id, [ {rating_avg, 4.8}, {rating_count, 5} ]), {Status, _, Body} = eh_test_support:call(admin_handler_event_stats, #{ method => <<"GET">>, path => <<"/v1/admin/events/stats">>, auth => ?ADMIN_ID }), ?assertEqual(200, Status), Result = jsx:decode(Body, [return_maps]), ?assertEqual(2, maps:get(<<"total_events">>, Result)), ByType = maps:get(<<"events_by_type">>, Result), ?assertEqual(2, maps:get(<<"single">>, ByType)), ByStatus = maps:get(<<"events_by_status">>, Result), ?assertEqual(2, maps:get(<<"active">>, ByStatus)), Top = maps:get(<<"top_events_by_rating">>, Result), ?assert(length(Top) >= 1), [First | _] = Top, ?assertEqual(E1#event.id, maps:get(<<"id">>, First)). test_unauthorized() -> {Status, _, _} = eh_test_support:call(admin_handler_event_stats, #{ method => <<"GET">>, path => <<"/v1/admin/events/stats">>, auth => none }), ?assertEqual(401, Status). test_wrong_method() -> {Status, _, _} = eh_test_support:call(admin_handler_event_stats, #{ method => <<"POST">>, path => <<"/v1/admin/events/stats">>, auth => ?ADMIN_ID }), ?assertEqual(405, Status).