README.md

# ExMachinaGen

ExMachinaGen is additional mix task for ExMachina.

## Installation

```elixir
def deps do
  [
    {:ex_machina_gen, "~> 0.1.0", only: [:dev, :test], runtime: false}
  ]
end
```

And fetch the dependencies.

```
$ mix deps.get
```

## Usage

ExMachinaGen has two mix tasks:

- `ex_machina.init`
- `ex_machina.gen`

### Generate main factory

To generate main factory file, run `ex_machina.init` mix task.

```
$ mix ex_machina.init
```

The main factory file will be generated.

```elixir
# test/support/factory/factory.ex
defmodule MyApp.Factory do
  use ExMachina.Ecto, repo: MyApp.Repo
end
```

### Generate schema factory

To generate factory of schema, `ex_machina.gen <schema module>`.

```
$ mix ex_machina.gen MyApp.Blog.Post
```

This task generate factory module with example values based on filed's type.

For example, if you define schema module like this,
```elixir
defmodule MyApp.Blog.Post do
  use Ecto.Schema
  import Ecto.Changeset

  schema "posts" do
    field :title, :string
    field :body, :string
    field :draft, :boolean
    belongs_to :author, MyApp.Blog.User

    timestamps(type: :utc_datetime)
  end
  ...
```

the factory module will be generate like this.

```elixir
defmodule MyApp.Blog.PostFactory do
  defmacro __using__(_opts) do
    quote do
      def post_factory do
        %MyApp.Blog.Post{
          author: build(:user),
          body: "test body",
          draft: true,
          inserted_at: ~U[2019-01-01 00:00:00Z],
          title: "test title",
          updated_at: ~U[2019-01-01 00:00:00Z]
        }
      end
    end
  end
end
```

## Configuration

If you change factory directory(default: `test/support/factory`), add `factory_dir` config.

```elixir
config :ex_machina_gen,
  factory_dir: "test/factory"
```