-module(admin_handler_ticket_stats_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). setup() -> ok = meck:new(cowboy_req, [non_strict]), ok = meck:new(handler_auth, [non_strict]), ok = meck:new(core_user, [non_strict]), ok = meck:new(core_ticket, [non_strict]), ok = meck:expect(cowboy_req, reply, fun(Code, Headers, Body, Req) -> put(test_reply, {Code, Headers, Body, Req}) end), ok. cleanup(_) -> meck:unload(core_ticket), meck:unload(core_user), meck:unload(handler_auth), meck:unload(cowboy_req). admin_ticket_stats_test_() -> {setup, fun setup/0, fun cleanup/1, [ {"GET /admin/tickets/stats – success", fun test_stats/0}, {"GET /admin/tickets/stats – forbidden", fun test_stats_forbidden/0}, {"POST /admin/tickets/stats – method not allowed", fun test_wrong_method/0} ]}. test_stats() -> ok = meck:expect(cowboy_req, method, fun(_) -> <<"GET">> end), ok = meck:expect(handler_auth, authenticate, fun(Req) -> {ok, <<"adm1">>, Req} end), AdminUser = #user{id = <<"adm1">>, role = admin}, ok = meck:expect(core_user, get_by_id, fun(<<"adm1">>) -> {ok, AdminUser} end), StatsData = #{ open => 5, in_progress => 3, resolved => 12, closed => 20 }, ok = meck:expect(core_ticket, stats, fun() -> StatsData end), {ok, _, _} = admin_handler_ticket_stats:init(req, []), {Status, _, RespBody, _} = erase(test_reply), ?assertEqual(200, Status), #{<<"open">> := 5, <<"resolved">> := 12} = jsx:decode(RespBody, [return_maps]). test_stats_forbidden() -> ok = meck:expect(cowboy_req, method, fun(_) -> <<"GET">> end), ok = meck:expect(handler_auth, authenticate, fun(Req) -> {error, 403, <<"Admin access required">>, Req} end), {ok, _, _} = admin_handler_ticket_stats:init(req, []), {Status, _, _, _} = erase(test_reply), ?assertEqual(403, Status). test_wrong_method() -> ok = meck:expect(cowboy_req, method, fun(_) -> <<"POST">> end), {ok, _, _} = admin_handler_ticket_stats:init(req, []), {Status, _, RespBody, _} = erase(test_reply), ?assertEqual(405, Status), #{<<"error">> := <<"Method not allowed">>} = jsx:decode(RespBody, [return_maps]).