@@ -114,14 +114,22 @@ defmodule FactoryEx do
114
114
"""
115
115
@ spec build ( module ( ) ) :: Ecto.Schema . t ( )
116
116
@ spec build ( module ( ) , keyword ( ) | map ( ) ) :: Ecto.Schema . t ( )
117
- def build ( module , params \\ % { } )
117
+ def build ( module , params \\ % { } , options \\ [ ] )
118
118
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 )
121
121
end
122
122
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
125
133
end
126
134
127
135
@ doc """
@@ -137,8 +145,11 @@ defmodule FactoryEx do
137
145
end
138
146
139
147
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 )
142
153
|> module . repo ( ) . insert! ( options )
143
154
end
144
155
@@ -160,4 +171,26 @@ defmodule FactoryEx do
160
171
def cleanup ( module , options \\ [ ] ) do
161
172
module . repo ( ) . delete_all ( module . schema ( ) , options )
162
173
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
163
196
end
0 commit comments