Factori - Test data without boilerplate based on your database schema

factori is a library to generate fake data for your tests based on your database schema.

Instead of having to implement a Faker mapper for each data structure in your application, factori enables you to just bootstrap a factory module based on a PostgreSQL database. :boom:

Classic ex_machina factory module in every project:

defmodule Factory do
  use ExMachina.Ecto, repo: MyApp.Repo

  def user_factory do
    %MyApp.User{
      first_name: Faker.first_name(),
      admin: Enum.random([true, false])
    }
  end
end

# Then use it in your test cases:

Factory.insert(:user)

Couple of things that factori tries to fix:

  • No more forgetting to add a Faker generator for a new field added
  • Automatic association handling based on foreign key
  • Random data based on database built-in constraint (column size, nullability)
  • No more “magic” API that calls the right function based on the suffix _factory
  • Easily add “named” variant of data (example: insert an admin user)

The result is pretty simple for the user:

defmodule MyAppTest.Factory do
  use Factori, repo: MyApp.Repo, mappings: [Factori.Mapping.Faker]
end

user = MyAppTest.Factory.insert("users")
user.first_name # => "Lorem"
user.last_name # => "Ipsum"

Go check the docs to see all the possibilities with named variants, structs, overrides, mapping, transform, etc :tada: This is an early release, I’m open to comments and API changes :smile:

12 Likes