lib/doumi/test/ecto.ex

if Code.ensure_loaded?(Ecto) do
  defmodule Doumi.Test.Ecto do
    def reload(record, opts \\ []) do
      {repo, opts} = opts |> Keyword.pop(:repo, Application.get_env(:doumi_test, :default_repo))

      if repo == nil do
        raise ArgumentError, "No repo found in opts or application env"
      end

      clauses =
        record.__struct__.__schema__(:primary_key)
        |> Enum.map(fn primary_key ->
          {primary_key, Map.get(record, primary_key)}
        end)

      repo.get_by(record.__struct__, clauses, opts)
    end

    def reload!(record, opts \\ []) do
      case reload(record, opts) do
        nil -> raise ArgumentError, "Could not find #{inspect(record)} in the database"
        value -> value
      end
    end
  end
end