-module(api_tickets_tests). -export([test/0]). -define(ADMIN_BASE_URL, "http://localhost:8445"). -define(BASE_URL, "http://localhost:8080"). test() -> io:format("Testing tickets API...~n"), Token = api_test_runner:get_user_token(), AdminToken = api_test_runner:get_admin_token(), %% TEST 1: Create ticket (user) io:format(" TEST 1: Create ticket... "), TicketId = api_test_runner:extract_json( api_test_runner:http_post("/v1/tickets", #{error_message => <<"Bug">>, stacktrace => <<"Something broke">>}, Token), <<"id">>), io:format("OK~n"), %% TEST 2: Get my tickets (user) io:format(" TEST 2: Get my tickets... "), {ok, {{_, 200, _}, _, _}} = api_test_runner:http_get("/v1/tickets", Token), io:format("OK~n"), %% TEST 3: Get single ticket (user) io:format(" TEST 3: Get single ticket... "), {ok, {{_, 200, _}, _, _}} = api_test_runner:http_get( "/v1/tickets/" ++ binary_to_list(TicketId), Token), io:format("OK~n"), %% TEST 4: Admin lists all tickets io:format(" TEST 4: Admin lists all tickets... "), {ok, {{_, 200, _}, _, _}} = httpc:request(get, {?ADMIN_BASE_URL ++ "/v1/admin/tickets", [{"Authorization", "Bearer " ++ binary_to_list(AdminToken)}]}, [], []), io:format("OK~n"), %% TEST 5: Admin updates ticket status io:format(" TEST 5: Admin updates ticket status... "), {ok, {{_, 200, _}, _, _}} = httpc:request(put, {?ADMIN_BASE_URL ++ "/v1/admin/tickets/" ++ binary_to_list(TicketId), [{"Authorization", "Bearer " ++ binary_to_list(AdminToken)}], "application/json", jsx:encode(#{status => <<"in_progress">>})}, [], []), io:format("OK~n"), %% TEST 6: Admin assigns ticket io:format(" TEST 6: Admin assigns ticket... "), {ok, {{_, 200, _}, _, _}} = httpc:request(put, {?ADMIN_BASE_URL ++ "/v1/admin/tickets/" ++ binary_to_list(TicketId), [{"Authorization", "Bearer " ++ binary_to_list(AdminToken)}], "application/json", jsx:encode(#{assigned_to => AdminToken})}, [], []), io:format("OK~n"), %% TEST 7: Admin views ticket stats io:format(" TEST 7: Admin views ticket stats... "), {ok, {{_, 200, _}, _, _}} = httpc:request(get, {?ADMIN_BASE_URL ++ "/v1/admin/tickets/stats", [{"Authorization", "Bearer " ++ binary_to_list(AdminToken)}]}, [], []), io:format("OK~n"), %% TEST 8: Admin deletes ticket io:format(" TEST 8: Admin deletes ticket... "), {ok, {{_, 200, _}, _, _}} = httpc:request(delete, {?ADMIN_BASE_URL ++ "/v1/admin/tickets/" ++ binary_to_list(TicketId), [{"Authorization", "Bearer " ++ binary_to_list(AdminToken)}]}, [], []), io:format("OK~n"), io:format("~n✅ Tickets API tests passed!~n"), {?MODULE, ok}.