Packages
Bypass provides a quick way to create a custom plug that can be put in place instead of an actual HTTP server to return prebaked responses to client requests. This is helpful when you want to create a mock HTTP server and test how your HTTP client handles different types of server responses.
Current section
Files
Jump to
Current section
Files
lib/bypass.ex
defmodule Bypass do
defstruct pid: nil, port: nil
require Logger
def open do
{:ok, pid, port} = Supervisor.start_child(Bypass.Supervisor, [])
if debug_log_enabled?,
do: Logger.debug "[Bypass] Did open connection #{inspect pid} on port #{inspect port}"
ExUnit.Callbacks.on_exit({Bypass, pid}, fn ->
case Bypass.Instance.call(pid, :on_exit) do
:ok ->
:ok
:ok_call ->
:ok
{:error, :not_called} ->
raise ExUnit.AssertionError, "No HTTP request arrived at Bypass"
{:error, :unexpected_request} ->
raise ExUnit.AssertionError, "Bypass got an HTTP request but wasn't expecting one"
{:exit, {class, reason, stacktrace}} ->
:erlang.raise(class, reason, stacktrace)
end
end)
%Bypass{pid: pid, port: port}
end
def up(%Bypass{pid: pid}), do: Bypass.Instance.call(pid, :up)
def down(%Bypass{pid: pid}), do: Bypass.Instance.call(pid, :down)
def expect(%Bypass{pid: pid}, fun), do: Bypass.Instance.call(pid, {:expect, fun})
def pass(%Bypass{pid: pid}), do: Bypass.Instance.call(pid, {:put_expect_result, :ok})
@doc false
def debug_log_enabled?, do: Application.fetch_env!(:bypass, :enable_debug_log)
end