Created
February 9, 2018 09:25
-
-
Save aptinio/955e22432f654fb3a21f53ab891a237b to your computer and use it in GitHub Desktop.
Roll your own factory for Ecto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Foo.Factory do | |
alias Foo.Blog.{Post, Comment} | |
def params_for(Post) do | |
%{ | |
title: Faker.Lorem.sentence(), | |
body: Faker.Lorem.paragraph() | |
} | |
end | |
def params_for(Comment) do | |
%{ | |
post: build(Post), | |
body: Faker.Name.paragraph() | |
} | |
end | |
def build(schema, params \\ []) do | |
struct!(schema, Enum.into(params, params_for(schema))) | |
end | |
def insert!(schema, params \\ []) do | |
fields = schema |> build(params) |> Foo.Repo.insert!() |> Map.take(schema.__schema__(:fields)) | |
put_in(struct!(schema, fields).__meta__.state, :loaded) | |
end | |
end | |
# Examples: | |
import Foo.Factory | |
alias Blog.{Post, Comment} | |
params = params_for(Post) | |
post_1 = build(Post) | |
post_2 = build(Post, title: "Title I set on new post") | |
post_3 = insert!(Post) | |
post_4 = insert!(Post, title: "Title I set on inserted post") | |
comment_1 = insert!(Comment) | |
comment_2 = insert!(Comment, body: "A new post will be inserted with this comment") | |
comment_2 = insert!(Comment, post: post_1, body: "post_1 will be inserted with this comment") | |
comment_2 = insert!(Comment, post: post_3, body: "This will be associated to post_3") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment