lib/tai/test_support/mocks/server.ex

defmodule Tai.TestSupport.Mocks.Server do
  use GenServer

  def start_link(_) do
    {:ok, pid} = GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
    GenServer.call(pid, :create_ets_table)
    {:ok, pid}
  end

  def init(:ok) do
    {:ok, :ok}
  end

  def handle_call(:create_ets_table, _from, state) do
    :ets.new(__MODULE__, [:set, :protected, :named_table])
    {:reply, :ok, state}
  end

  def handle_call({:insert, key, response}, _from, state) do
    record = {key, response}
    :ets.insert(__MODULE__, record)
    {:reply, :ok, state}
  end

  def handle_call({:eject, key}, _from, state) do
    result =
      with [{_k, response}] <- :ets.lookup(__MODULE__, key) do
        :ets.delete(__MODULE__, key)
        {:ok, response}
      else
        [] ->
          {:error, :not_found}
      end

    {:reply, result, state}
  end

  def insert(key, response) do
    GenServer.call(__MODULE__, {:insert, key, response})
  end

  def eject(key) do
    GenServer.call(__MODULE__, {:eject, key})
  end
end