Forgery is a slim yet extensible data generator in Elixir.
def deps() do
[{:forgery, "~> 0.1"}]
end
Full documentation can be found at https://hexdocs.pm/forgery.
Forgery provides a few simple APIs to work with:
defmodule User do
defstruct [:id, :name, :password]
end
defmodule MyFactory do
use Forgery
def make(:user, fields) do
fields
|> put_new_field(:id, lazy(make_unique_integer()))
|> put_new_field(:name, &("user#" <> Integer.to_string(&1.id)))
|> create_struct(User)
end
end
iex> import MyFactory
iex>
iex> %User{} = make(:user)
iex> %User{id: 42, name: "user#42"} = make(:user, id: 42)
iex> [%User{}, %User{}] = make_many(:user, 2)
And just as simple as that!
Forgery was built with easy Ecto integration in mind, though not limiting to it.
For example you use Ecto and have MyRepo
. You can add a function, says insert!
and insert_many!
, into the factory:
defmodule MyFactory do
def insert!(factory_name, fields \\ %{}) do
factory_name
|> make(fields)
|> MyRepo.insert!()
end
def insert_many!(factory_name, amount, fields \\ %{}) when amount >= 1 do
[%schema{} | _] = entities = make_many(factory_name, amount, fields)
{^amount, persisted_entities} = MyRepo.insert_all(schema, entities, returning: true)
persisted_entities
end
end
user = insert!(:user)
users = insert_many!(:user, 10, %{password: "1234567890"})
This software is licensed under the ISC license.