%% Exact exception classification cannot be asserted through HTTP: application
%% panics and disappearing actor handles must have different failure behavior.
-module(albedo_daemon_request_test).
-include_lib("eunit/include/eunit.hrl").

closed_actor_calls_are_unavailable_test() ->
    lists:foreach(fun(Message) ->
        Reason = #{module => <<"gleam/erlang/process">>,
                   function => <<"perform_call">>, message => Message},
        ?assertEqual({error,nil}, albedo_daemon:http_request(fun() ->
            erlang:error(Reason)
        end))
    end, [<<"callee exited: ProcessDown(..., Normal)">>,
          <<"Callee subject had no owner">>]).

unrelated_errors_keep_their_reason_test() ->
    Reasons = [#{module => <<"application">>, function => <<"perform_call">>,
                 message => <<"callee exited: unrelated application error">>},
               #{module => <<"gleam/erlang/process">>,
                 function => <<"perform_call">>,
                 message => <<"callee did not send reply before timeout">>},
               application_bug],
    lists:foreach(fun(Reason) ->
        ?assertException(error,Reason,albedo_daemon:http_request(fun() ->
            erlang:error(Reason)
        end))
    end, Reasons),
    ?assertException(throw,application_bug,albedo_daemon:http_request(fun() ->
        throw(application_bug)
    end)).

ordinary_responses_pass_through_test() ->
    ?assertEqual({ok,response}, albedo_daemon:http_request(fun() -> response end)).
