4
4
5
5
use Blueprint \Blueprint ;
6
6
use Blueprint \Contracts \Generator ;
7
+ use Blueprint \Models \Column ;
7
8
use Blueprint \Models \Controller ;
8
9
use Blueprint \Models \Statements \DispatchStatement ;
9
10
use Blueprint \Models \Statements \EloquentStatement ;
@@ -226,23 +227,17 @@ protected function buildTestCases(Controller $controller)
226
227
227
228
if (! is_null ($ local_model ) && $ local_model ->hasColumn ($ column )) {
228
229
$ 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 ;
232
230
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 );
238
232
239
- $ this ->addImport ($ controller , $ modelNamespace .'\\' .Str::studly ($ reference ));
233
+ if ($ factory ) {
234
+ [$ faker , $ variable_name ] = $ factory ;
240
235
} else {
241
236
$ faker = sprintf ('$%s = $this->faker->%s; ' , $ data , FactoryGenerator::fakerData ($ local_column ->name ()) ?? FactoryGenerator::fakerDataType ($ local_model ->column ($ column )->dataType ()));
242
237
}
243
238
244
239
$ setup ['data ' ][] = $ faker ;
245
- $ request_data [$ data ] = '$ ' . $ variable_name ;
240
+ $ request_data [$ data ] = '$ ' . $ variable_name ;
246
241
} else {
247
242
foreach ($ local_model ->columns () as $ local_column ) {
248
243
if ($ local_column ->name () === 'id ' ) {
@@ -253,10 +248,16 @@ protected function buildTestCases(Controller $controller)
253
248
continue ;
254
249
}
255
250
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
+ }
257
258
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 ;
260
261
}
261
262
}
262
263
}
@@ -659,4 +660,24 @@ private function uniqueSetupLines(array $setup)
659
660
})
660
661
->toArray ();
661
662
}
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
+ }
662
683
}
0 commit comments