44
55use Blueprint \Blueprint ;
66use Blueprint \Contracts \Generator ;
7+ use Blueprint \Models \Column ;
78use Blueprint \Models \Controller ;
89use Blueprint \Models \Statements \DispatchStatement ;
910use Blueprint \Models \Statements \EloquentStatement ;
@@ -226,23 +227,17 @@ protected function buildTestCases(Controller $controller)
226227
227228 if (! is_null ($ local_model ) && $ local_model ->hasColumn ($ column )) {
228229 $ local_column = $ local_model ->column ($ column );
229- if (($ local_column ->dataType () === 'id ' || $ local_column ->dataType () === 'uuid ' ) && ($ local_column ->attributes () && Str::endsWith ($ local_column ->name (), '_id ' ))) {
230- $ variable_name = Str::beforeLast ($ local_column ->name (), '_id ' );
231- $ reference = $ variable_name ;
232230
233- if ($ local_column ->attributes ()) {
234- $ reference = $ local_column ->attributes ()[0 ];
235- $ variable_name .= '->id ' ;
236- }
237- $ faker = sprintf ('$%s = factory(%s::class)->create(); ' , Str::beforeLast ($ local_column ->name (), '_id ' ), Str::studly ($ reference ));
231+ $ factory = $ this ->generateReferenceFactory ($ local_column , $ controller , $ modelNamespace );
238232
239- $ this ->addImport ($ controller , $ modelNamespace .'\\' .Str::studly ($ reference ));
233+ if ($ factory ) {
234+ [$ faker , $ variable_name ] = $ factory ;
240235 } else {
241236 $ faker = sprintf ('$%s = $this->faker->%s; ' , $ data , FactoryGenerator::fakerData ($ local_column ->name ()) ?? FactoryGenerator::fakerDataType ($ local_model ->column ($ column )->dataType ()));
242237 }
243238
244239 $ setup ['data ' ][] = $ faker ;
245- $ request_data [$ data ] = '$ ' . $ variable_name ;
240+ $ request_data [$ data ] = '$ ' . $ variable_name ;
246241 } else {
247242 foreach ($ local_model ->columns () as $ local_column ) {
248243 if ($ local_column ->name () === 'id ' ) {
@@ -253,10 +248,16 @@ protected function buildTestCases(Controller $controller)
253248 continue ;
254249 }
255250
256- // TODO: support "reference"
251+ $ factory = $ this ->generateReferenceFactory ($ local_column , $ controller , $ modelNamespace );
252+ if ($ factory ) {
253+ [$ faker , $ variable_name ] = $ factory ;
254+ } else {
255+ $ faker = sprintf ('$%s = $this->faker->%s; ' , $ local_column ->name (), FactoryGenerator::fakerData ($ local_column ->name ()) ?? FactoryGenerator::fakerDataType ($ local_column ->dataType ()));
256+ $ variable_name = $ local_column ->name ();
257+ }
257258
258- $ setup ['data ' ][] = sprintf ( ' $%s = $this-> faker->%s; ' , $ local_column -> name (), FactoryGenerator:: fakerData ( $ local_column -> name ()) ?? FactoryGenerator:: fakerDataType ( $ local_column -> dataType ())) ;
259- $ request_data [$ local_column ->name ()] = '$ ' .$ local_column -> name () ;
259+ $ setup ['data ' ][] = $ faker ;
260+ $ request_data [$ local_column ->name ()] = '$ ' .$ variable_name ;
260261 }
261262 }
262263 }
@@ -659,4 +660,24 @@ private function uniqueSetupLines(array $setup)
659660 })
660661 ->toArray ();
661662 }
663+
664+ private function generateReferenceFactory (Column $ local_column , Controller $ controller , string $ modelNamespace )
665+ {
666+ if (!in_array ($ local_column ->dataType (), ['id ' , 'uuid ' ]) && !($ local_column ->attributes () && Str::endsWith ($ local_column ->name (), '_id ' ))) {
667+ return null ;
668+ }
669+
670+ $ reference = Str::beforeLast ($ local_column ->name (), '_id ' );
671+ $ variable_name = $ reference . '->id ' ;
672+
673+ if ($ local_column ->attributes ()) {
674+ $ reference = $ local_column ->attributes ()[0 ];
675+ }
676+
677+ $ faker = sprintf ('$%s = factory(%s::class)->create(); ' , Str::beforeLast ($ local_column ->name (), '_id ' ), Str::studly ($ reference ));
678+
679+ $ this ->addImport ($ controller , $ modelNamespace . '\\' . Str::studly ($ reference ));
680+
681+ return [$ faker , $ variable_name ];
682+ }
662683}
0 commit comments