Skip to content

alanpeabody/blacksmith

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

blacksmith

Data generation framework for Elixir.

In testing, sometimes it's useful to create records in the form of maps. Blacksmith makes it easy.

First, install Blacksmith:

Right now, you'll use mix with a git dependency. In your mix.exs file, add the blacksmith dependency:

def deps do
  [{:blacksmith, git: "git://github.com/batate/blacksmith.git"}]
end

To use Faker to generate fake data you will also have to add :faker or :blacksmith to your application list:

def application do
  [applications: applications(Mix.env)]
end

defp applications(:test), do: applications(:all) ++ [:blacksmith]
defp applications(_all),  do: [:logger]

Next, tell Blacksmith how to save one record, or many records:

defmodule do Blacksmith.Config
  def save(repo, model) do
    repo |> save( model )
  end
  
  def save_all(repo, list_of_models) do
    repo |> save_all( list_of_models )
  end
end

Next, perhaps in test_helper for convenience or somewhere in lib for speed, register each of your new models with Forge. Use Faker for fake values:

defmodule Forge do
  use Blacksmith
  
  
  register :user, 
    name: Faker.Name.first_name,          
    type: :map, 
    email: Faker.Internet.email, 
    description: Faker.Lorem.sentence, 
    roles: [], 
    always_the_same: "string"
    
  # this will create a user with roles set to [:admin]
  register :admin, 
    type: :blacksmith, 
    prototype: user,
    roles: ["admin"]
end

Now you can create a user, generating all of the default values:

  user = Forge.user

or a saved user, with the name attribute overridden, and a new attribute of favorite_language:

  user = Forge.saved_user Models.User, name: "Will Override", favorite_language: "Elixir"

or a list of 5 users

  user = Forge.user_list 5

or a saved list of 5 admins

  admin = Forge.saved_admin_list repo, 5

Create a list using a few common data elements:

  Forge.having survey_id: some_survey.id, author: Forge.user do
    question = Forge.question   # will share the same survey id and user from above
  end

Next release: allow nesting of having blacks.

About

Data generation framework for Elixir

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Elixir 100.0%