defmodule Sham do defstruct pid: nil, port: nil def start(opts \\ []) do case DynamicSupervisor.start_child(Sham.Supervisor, {Sham.Instance, opts}) do {:ok, pid} -> {:ok, port} = GenServer.call(pid, :setup) ExUnit.Callbacks.on_exit({Sham.Instance, pid}, fn -> case GenServer.call(pid, :on_exit) do :ok -> :ok {:error, error} -> raise ExUnit.AssertionError, error {:exception, {exception, stacktrace}} -> reraise exception, stacktrace {:error, expected, actual} -> raise ExUnit.AssertionError, "TestServer expected #{inspect(expected)} but received #{inspect(actual)}" end end) %Sham{pid: pid, port: port} other -> other end end def expect(sham, callback) do expect(sham, nil, nil, callback) end def expect(%{pid: pid} = sham, method, path, callback) when is_pid(pid) and is_function(callback, 1) do :ok = GenServer.call(pid, {:expect, method, path, callback}) sham end def expect_once(sham, callback) do expect_once(sham, nil, nil, callback) end def expect_once(%{pid: pid} = sham, method, path, callback) when is_pid(pid) and is_function(callback, 1) do :ok = GenServer.call(pid, {:expect_once, method, path, callback}) sham end def stub(sham, callback) do stub(sham, nil, nil, callback) end def stub(%{pid: pid} = sham, method, path, callback) when is_pid(pid) and is_function(callback, 1) do :ok = GenServer.call(pid, {:stub, method, path, callback}) sham end def pass(%{pid: pid} = sham) do :ok = GenServer.call(pid, :pass) sham end end