Skip to content

Factories for elixir to help create data models at random, this works for any type of ecto structs

License

Notifications You must be signed in to change notification settings

theblitzapp/factory_ex

Repository files navigation

FactoryEx

Coverage Test Dialyzer Credo codecov Hex version badge

Installation

Available in Hex, the package can be installed by adding factory_ex to your list of dependencies in mix.exs:

def deps do
  [
    {:factory_ex, "~> 0.1.0"}
  ]
end

Documentation can be found at https://hexdocs.pm/factory_ex.

Using

For defining your own factories just implement schema/0, repo/0 and build/0 callback e.g:

defmodule MyFactory do
  @behaviour FactoryEx

  def schema, do: MySchema

  def repo, do: MyRepo

  def build(params \\ %{}) do
    default = %{
      foo: 21,
      bar: 42
    }

    Map.merge(default, params)
  end
end

And then using it in your tests as:

# For getting a default parameter struct.
FactoryEx.build(MyFactory)

# For getting a default parameter struct with a modification.
FactoryEx.build(MyFactory, foo: 42)

# For getting a default parameter struct and not validating the changeset
FactoryEx.build(MyFactory, [foo: 42], validate?: false)

# For getting a default parameter map.
FactoryEx.build_params(MyFactory)

# For getting a default parameter map with a modification..
FactoryEx.build_params(MyFactory, foo: 10)

# For getting a default parameter map and not validating the changeset
FactoryEx.build_params(MyFactory, foo: 10, validate?: false)

# For getting multiple default parameter maps
FactoryEx.build_many_params(MyFactory, [foo: 42])

# For getting an invalid parameter maps
FactoryEx.build_invalid_params(MyFactory, [foo: 42])

# For inserting a default schema.
FactoryEx.insert!(MyFactory)

# For inserting a default schema with a modification.
FactoryEx.insert!(MyFactory, foo: 42)

# For inserting multiple default schema
FactoryEx.insert_many!(10, MyFactory, foo: 42)

Using FactoryEx.SchemaCounter

In order to avoid duplicate data on fields and guarentee unique data, we can use FactoryEx.SchemaCounter to generate unique integers to append to our fields.

For example our factory could look like the following:

defmodule MyFactory do
  @behaviour FactoryEx

  def schema, do: MySchema

  def repo, do: MyRepo

  def build(params \\ %{}) do
    default = %{
      foo: FactoryEx.SchemaCounter.next("my_factory_foo"),
      bar: FactoryEx.SchemaCounter.next("my_factory_bar")
    }

    Map.merge(default, params)
  end
end

To utilize FactoryEx.SchemaCounter, we must call FactoryEx.SchemaCounter.start() in the test/test_helper.exs file.

Generating Factories

FactoryEx comes with a helpful mix command to generate factories into our application

$ mix factory_ex.gen --repo FactoryEx.Support.Repo FactoryEx.Support.Accounts.User
$ mix factory_ex.gen --repo FactoryEx.Support.Repo FactoryEx.Support.{Accounts.{User,Role},Authentication.{Token,Session}}

To read more info run mix factory_ex.gen

About

Factories for elixir to help create data models at random, this works for any type of ecto structs

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages