View Source EctoStreamFactory behaviour (EctoStreamFactory v0.2.2)
Defines a factory that can be used in tests and database seeds files.
examples
Examples
defmodule MyApp.Factory do
use EctoStreamFactory, repo: MyApp.Repo
def user_generator do
gen all name <- string(:alphanumeric, min_length: 1),
age <- integer(15..80) do
%User{name: name, age: age}
end
end
def post_generator do
gen all author <- user_generator(),
body <- string(:alphanumeric, min_length: 10) do
%Post{author: author, body: body}
end
end
end
Link to this section Summary
Types
Same as options for Ecto.Repo.insert/2
.
Keyword list or map where values can be of any literal types or one arity functions that generate sequential data.
Callbacks
Same as build/2
, but raises an error if some key in overwrites
does not exist in the generated struct, map or keyword list.
Takes a single instance from a StreamData gen/1 generator.
Same as build_list/3
, but raises an error if some key in overwites
does not exist in the generated entities.
Same as build/2
, but instantiates a list of structs.
Same as insert/3
, but raises an error if some key in overwites
does not exist in the generated struct.
Similar to build/2
, but expects a generator to return an Ecto.Schema struct to insert it into the database.
Same as insert_list/4
, but raises an error if some key in overwites
does not exist in the generated structs.
Same as insert/3
, but inserts a list of structs.
Link to this section Types
@type amount() :: pos_integer()
@type insert_opts() :: Keyword.t()
Same as options for Ecto.Repo.insert/2
.
@type overwrite_value() :: term() | (pos_integer() -> term())
@type overwrites() :: [{atom(), overwrite_value()}] | %{required(term()) => overwrite_value()}
Keyword list or map where values can be of any literal types or one arity functions that generate sequential data.
Link to this section Callbacks
@callback build!(generator_name(), overwrites()) :: term()
Same as build/2
, but raises an error if some key in overwrites
does not exist in the generated struct, map or keyword list.
examples
Examples
iex> Factory.build!(:user)
%User{id: nil, name: "b", age: 28}
iex> Factory.build!(:user, name: "foo", weight: 101)
** (EctoStreamFactory.MissingKeyError) MyApp.Factory.user_generator does not generate :weight field.
@callback build(generator_name(), overwrites()) :: term()
Takes a single instance from a StreamData gen/1 generator.
If the generator returs a struct, map or keyword list, it also merges the result with overwrites
.
examples
Examples
iex> Factory.build(:user)
%User{id: nil, name: "a", age: 33}
iex> Factory.build(:user, name: "foo")
%User{id: nil, name: "foo", age: 49}
@callback build_list!(amount(), generator_name(), overwrites()) :: [term(), ...]
Same as build_list/3
, but raises an error if some key in overwites
does not exist in the generated entities.
@callback build_list(amount(), generator_name(), overwrites()) :: [term(), ...]
Same as build/2
, but instantiates a list of structs.
examples
Examples
iex> Factory.build_list(2, :user, name: fn n -> "user#{n}" end)
[%User{id: nil, name: "user1"}, %User{id: nil, name: "user2"}]
@callback insert!(generator_name(), overwrites(), insert_opts()) :: Ecto.Schema.t()
Same as insert/3
, but raises an error if some key in overwites
does not exist in the generated struct.
@callback insert(generator_name(), overwrites(), insert_opts()) :: Ecto.Schema.t()
Similar to build/2
, but expects a generator to return an Ecto.Schema struct to insert it into the database.
examples
Examples
iex> Factory.insert(:user, [email: "duplicated@example.com"], on_conflict: :nothing)
%User{id: 2, email: "duplicated@example.com"}
insert_list!(amount, generator_name, overwrites, insert_opts)
View Source (since 0.2.0)@callback insert_list!(amount(), generator_name(), overwrites(), insert_opts()) :: [ Ecto.Schema.t(), ... ]
Same as insert_list/4
, but raises an error if some key in overwites
does not exist in the generated structs.
@callback insert_list(amount(), generator_name(), overwrites(), insert_opts()) :: [ Ecto.Schema.t(), ... ]
Same as insert/3
, but inserts a list of structs.
examples
Examples
iex> Factory.insert_list(3, :user, role: "admin")
[%User{id: 3, role: "admin"}, %User{id: 4, role: "admin"}, %User{id: 5, role: "admin"}]