Skip to content

Commit 0a479ef

Browse files
authored
chore: merge drift from blitz (#4)
1 parent eed1097 commit 0a479ef

File tree

2 files changed

+42
-8
lines changed

2 files changed

+42
-8
lines changed

lib/factory_ex.ex

+40-7
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,22 @@ defmodule FactoryEx do
114114
"""
115115
@spec build(module()) :: Ecto.Schema.t()
116116
@spec build(module(), keyword() | map()) :: Ecto.Schema.t()
117-
def build(module, params \\ %{})
117+
def build(module, params \\ %{}, options \\ [])
118118

119-
def build(module, params) when is_list(params) do
120-
build(module, Map.new(params))
119+
def build(module, params, options) when is_list(params) do
120+
build(module, Map.new(params), options)
121121
end
122122

123-
def build(module, params) do
124-
struct!(module.schema(), module.build(params))
123+
def build(module, params, options) do
124+
validate = Keyword.get(options, :validate, true)
125+
126+
params
127+
|> module.build()
128+
|> maybe_changeset(module, validate)
129+
|> case do
130+
%Ecto.Changeset{} = changeset -> Ecto.Changeset.apply_action!(changeset, :insert)
131+
struct when is_struct(struct) -> struct
132+
end
125133
end
126134

127135
@doc """
@@ -137,8 +145,11 @@ defmodule FactoryEx do
137145
end
138146

139147
def insert!(module, params, options) do
140-
module
141-
|> build(params)
148+
validate = Keyword.get(options, :validate, true)
149+
150+
params
151+
|> module.build()
152+
|> maybe_changeset(module, validate)
142153
|> module.repo().insert!(options)
143154
end
144155

@@ -160,4 +171,26 @@ defmodule FactoryEx do
160171
def cleanup(module, options \\ []) do
161172
module.repo().delete_all(module.schema(), options)
162173
end
174+
175+
defp maybe_changeset(params, module, validate) do
176+
if validate && schema?(module) do
177+
params = Utils.deep_struct_to_map(params)
178+
179+
if create_changeset_defined?(module.schema()) do
180+
module.schema().create_changeset(params)
181+
else
182+
module.schema().changeset(struct(module.schema(), %{}), params)
183+
end
184+
else
185+
struct!(module.schema, params)
186+
end
187+
end
188+
189+
defp create_changeset_defined?(module) do
190+
function_exported?(module, :create_changeset, 1)
191+
end
192+
193+
defp schema?(module) do
194+
function_exported?(module.schema(), :__schema__, 1)
195+
end
163196
end

test/factory_ex_test.exs

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ defmodule FactoryExTest do
2020
end
2121

2222
@required_params [:foo, :bar]
23+
@available_params [:foo_bar_baz | @required_params]
2324

2425
def changeset(%__MODULE__{} = user, attrs \\ %{}) do
2526
user
26-
|> cast(attrs, @required_params)
27+
|> cast(attrs, @available_params)
2728
|> validate_required(@required_params)
2829
end
2930
end

0 commit comments

Comments
 (0)