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.

Link to this section Types

@type amount() :: pos_integer()
@type generator_name() :: atom() | String.t()
@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

Link to this callback

build!(generator_name, overwrites)

View Source (since 0.2.0)
@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.
Link to this callback

build(generator_name, overwrites)

View Source
@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}
Link to this callback

build_list!(amount, generator_name, overwrites)

View Source (since 0.2.0)
@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.

Link to this callback

build_list(amount, generator_name, overwrites)

View Source
@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"}]
Link to this callback

insert!(generator_name, overwrites, insert_opts)

View Source (since 0.2.0)
@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.

Link to this callback

insert(generator_name, overwrites, insert_opts)

View Source
@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"}
Link to this callback

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.

Link to this callback

insert_list(amount, generator_name, overwrites, insert_opts)

View Source
@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"}]