Current section
Files
Jump to
Current section
Files
lib/mox_env.ex
defmodule MoxEnv do
@callback get(key, default) :: term | default when key: atom, default: term
defmacro __using__(opts \\ []) do
module = Keyword.fetch!(opts, :config)
quote do
@behaviour MoxEnv
@server Mox.Server
def get(key, default \\ nil) do
case call({:fetch_fun_to_dispatch, [self() | caller_pids()], make_key(key)}) do
{:ok, fun} -> fun.()
:no_expectation -> unquote(module).get(key, default)
end
catch
:exit, {:noproc, _} ->
unquote(module).get(key, default)
end
def put_env(key, value, owner_pid \\ self()) do
call({:add_expectation, owner_pid, make_key(key), make_value(value)})
end
def allow_env(pid, owner \\ self()) do
call({:allow, __MODULE__, owner, pid})
end
def set_env_from_context(context) do
IO.puts(
:stderr,
"#{inspect(__MODULE__)}.set_env_from_context/1 is deprecated, please use Mox.set_mox_from_context/1 instead\n" <>
Exception.format_stacktrace()
)
Mox.set_mox_from_context(context)
end
defp make_key(config_key) do
{__MODULE__, config_key, 0}
end
defp make_value(value) do
{0, [], fn -> value end}
end
defp call(message) do
GenServer.call(@server, message)
end
defp caller_pids do
case Process.get(:"$callers") do
nil -> []
pids when is_list(pids) -> pids
end
end
end
end
end