Current section

Files

Jump to
placebo lib placebo server.ex
Raw

lib/placebo/server.ex

defmodule Placebo.Server do
use GenServer
def start_link(_args) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init(_args) do
{:ok, Map.new()}
end
## CLIENT
def clear, do: GenServer.cast(__MODULE__, :clear)
def get, do: GenServer.call(__MODULE__, :get)
def is_mock?(module), do: GenServer.call(__MODULE__, {:is_new, module})
def add_expectation(%Placebo.Mock{} = mock) do
GenServer.cast(__MODULE__, {:add, mock})
end
## SERVER
def handle_call(:get, _from, state) do
reply(state, state)
end
def handle_call({:is_new, module}, _from, state) do
Map.has_key?(state, module)
|> reply(state)
end
def handle_cast(:clear, _state) do
Map.new()
|> noreply()
end
def handle_cast({:add, %Placebo.Mock{} = mock}, state) do
Map.put(state, mock.module, determine_value(state, mock))
|> noreply()
end
defp determine_value(state, mock) do
current_value = Map.get(state, mock.module, [])
case mock.action do
:expect -> [ %Placebo.Expectation{module: mock.module, function: mock.function, args: mock.args} | current_value ]
_ -> current_value
end
end
defp noreply(new_state), do: {:noreply, new_state}
defp reply(value, new_state), do: {:reply, value, new_state}
end