Skip to content

Commit c7381a0

Browse files
authored
Add fake_nullable config (#127)
1 parent 15c40e5 commit c7381a0

File tree

4 files changed

+59
-6
lines changed

4 files changed

+59
-6
lines changed

config/blueprint.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,5 @@
5656
*/
5757
'generate_phpdocs' => false,
5858

59+
'fake_nullables' => true,
5960
];

src/Generators/FactoryGenerator.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
namespace Blueprint\Generators;
44

5-
use Blueprint\Contracts\Generator;
65
use Blueprint\Models\Model;
76
use Illuminate\Support\Str;
7+
use Blueprint\Models\Column;
8+
use Blueprint\Contracts\Generator;
89

910
class FactoryGenerator implements Generator
1011
{
@@ -31,7 +32,7 @@ public function output(array $tree): array
3132
if (!$this->files->exists(dirname($path))) {
3233
$this->files->makeDirectory(dirname($path), 0755, true);
3334
}
34-
35+
3536
$this->files->put($path, $this->populateStub($stub, $model));
3637

3738
$output['created'][] = $path;
@@ -63,8 +64,10 @@ protected function buildDefinition(Model $model)
6364
{
6465
$definition = '';
6566

67+
$fillable = $this->fillableColumns($model->columns());
68+
6669
/** @var \Blueprint\Models\Column $column */
67-
foreach ($model->columns() as $column) {
70+
foreach ($fillable as $column) {
6871
if ($column->name() === 'id') {
6972
continue;
7073
}
@@ -76,7 +79,7 @@ protected function buildDefinition(Model $model)
7679
$definition .= self::INDENT . "'{$column->name()}' => ";
7780
$definition .= sprintf('factory(%s::class)', '\\' . $model->fullyQualifiedNamespace() . '\\' . $class);
7881
$definition .= ',' . PHP_EOL;
79-
} elseif (in_array($column->dataType(), ['enum', 'set']) and !empty($column->attributes())) {
82+
} elseif (in_array($column->dataType(), ['enum', 'set']) && !empty($column->attributes())) {
8083
$definition .= self::INDENT . "'{$column->name()}' => ";
8184
$faker = $this->fakerData($column->name()) ?? $this->fakerDataType($column->dataType());
8285
$definition .= '$faker->' . $faker;
@@ -114,6 +117,17 @@ protected function buildDefinition(Model $model)
114117
return trim($definition);
115118
}
116119

120+
private function fillableColumns(array $columns): array
121+
{
122+
if (config('blueprint.fake_nullables')) {
123+
return $columns;
124+
}
125+
126+
return array_filter($columns, function (Column $column) {
127+
return !in_array('nullable', $column->modifiers());
128+
});
129+
}
130+
117131
public static function fakerData(string $name)
118132
{
119133
static $fakeableNames = [

tests/Feature/Generator/FactoryGeneratorTest.php

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace Tests\Feature\Generators;
44

5+
use Tests\TestCase;
56
use Blueprint\Blueprint;
67
use Blueprint\Generators\FactoryGenerator;
7-
use Tests\TestCase;
88

99
/**
1010
* @see FactoryGenerator
@@ -67,6 +67,30 @@ public function output_writes_migration_for_model_tree($definition, $path, $migr
6767
$this->assertEquals(['created' => [$path]], $this->subject->output($tree));
6868
}
6969

70+
/**
71+
* @test
72+
*/
73+
public function output_ignores_nullables_if_fake_nullables_configuration_is_set_to_false()
74+
{
75+
$this->app['config']->set('blueprint.fake_nullables', false);
76+
77+
$this->files->expects('stub')
78+
->with('factory.stub')
79+
->andReturn(file_get_contents('stubs/factory.stub'));
80+
81+
$this->files->expects('exists')
82+
->with('database/factories')
83+
->andReturnTrue();
84+
85+
$this->files->expects('put')
86+
->with('database/factories/OrderFactory.php', $this->fixture('factories/fake-nullables.php'));
87+
88+
$tokens = $this->blueprint->parse($this->fixture('definitions/model-key-constraints.bp'));
89+
$tree = $this->blueprint->analyze($tokens);
90+
91+
$this->assertEquals(['created' => ['database/factories/OrderFactory.php']], $this->subject->output($tree));
92+
}
93+
7094
/**
7195
* @test
7296
*/
@@ -124,7 +148,7 @@ public function modelTreeDataProvider()
124148
['definitions/team.bp', 'database/factories/TeamFactory.php', 'factories/team.php'],
125149
['definitions/unconventional.bp', 'database/factories/TeamFactory.php', 'factories/unconventional.php'],
126150
['definitions/model-modifiers.bp', 'database/factories/ModifierFactory.php', 'factories/model-modifiers.php'],
127-
['definitions/model-key-constraints.bp', 'database/factories/OrderFactory.php', 'factories/model-key-constraints.php']
151+
['definitions/model-key-constraints.bp', 'database/factories/OrderFactory.php', 'factories/model-key-constraints.php'],
128152
];
129153
}
130154
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
/** @var \Illuminate\Database\Eloquent\Factory $factory */
4+
5+
use App\Order;
6+
use Faker\Generator as Faker;
7+
8+
$factory->define(Order::class, function (Faker $faker) {
9+
return [
10+
'user_id' => factory(\App\User::class),
11+
'subscription_id' => factory(\App\Subscription::class),
12+
'meta' => '[]',
13+
];
14+
});

0 commit comments

Comments
 (0)