From bd486381c6f4f0dd5e210f81db33beb026bd7903 Mon Sep 17 00:00:00 2001 From: Nico Devs Date: Sun, 5 Jan 2025 11:54:40 -0300 Subject: [PATCH] Omit redundant parent ID validation --- .../Statements/FormRequestGenerator.php | 14 ++++++---- .../Statements/FormRequestGeneratorTest.php | 23 ++++++++++++++++ .../form-requests-controller-has-parent.yaml | 15 +++++++++++ .../form-requests-controller-has-parent.php | 26 +++++++++++++++++++ 4 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 tests/fixtures/drafts/form-requests-controller-has-parent.yaml create mode 100644 tests/fixtures/form-requests/form-requests-controller-has-parent.php diff --git a/src/Generators/Statements/FormRequestGenerator.php b/src/Generators/Statements/FormRequestGenerator.php index 556d9bc6..febf2157 100644 --- a/src/Generators/Statements/FormRequestGenerator.php +++ b/src/Generators/Statements/FormRequestGenerator.php @@ -63,24 +63,24 @@ protected function populateStub(string $stub, string $name, $context, ValidateSt { $stub = str_replace('{{ namespace }}', config('blueprint.namespace') . '\\Http\\Requests' . ($controller->namespace() ? '\\' . $controller->namespace() : ''), $stub); $stub = str_replace('{{ class }}', $name, $stub); - $stub = str_replace('{{ rules }}', $this->buildRules($context, $validateStatement), $stub); + $stub = str_replace('{{ rules }}', $this->buildRules($context, $validateStatement, $controller), $stub); return $stub; } - protected function buildRules(string $context, ValidateStatement $validateStatement): string + protected function buildRules(string $context, ValidateStatement $validateStatement, Controller $controller): string { return trim( array_reduce( $validateStatement->data(), - function ($output, $field) use ($context) { + function ($output, $field) use ($context, $controller) { [$qualifier, $column] = $this->splitField($field); if (is_null($qualifier)) { $qualifier = $context; } - $validationRules = $this->validationRules($qualifier, $column); + $validationRules = $this->validationRules($qualifier, $column, $controller); foreach ($validationRules as $name => $rule) { $formattedRule = implode("', '", $rule); @@ -104,7 +104,7 @@ private function splitField($field): array return [null, $field]; } - protected function validationRules(string $qualifier, string $column): array + protected function validationRules(string $qualifier, string $column, Controller $controller): array { /** * @var \Blueprint\Models\Model $model @@ -129,6 +129,10 @@ protected function validationRules(string $qualifier, string $column): array continue; } + if ($column->name() === Str::snake($controller->parent()) . '_id') { + continue; + } + $rules[$column->name()] = Rules::fromColumn($model->tableName(), $column); } diff --git a/tests/Feature/Generators/Statements/FormRequestGeneratorTest.php b/tests/Feature/Generators/Statements/FormRequestGeneratorTest.php index 89baed6d..004452fa 100644 --- a/tests/Feature/Generators/Statements/FormRequestGeneratorTest.php +++ b/tests/Feature/Generators/Statements/FormRequestGeneratorTest.php @@ -299,4 +299,27 @@ public function test_output_generates_form_request_without_softdeletestz(): void ], ], $this->subject->output($tree)); } + + public function test_output_generates_form_request_without_parent_id_column_validation(): void + { + $this->filesystem->expects('stub') + ->with('request.stub') + ->andReturn($this->stub('request.stub')); + $this->filesystem->expects('exists') + ->twice() + ->with('app/Http/Requests') + ->andReturnFalse(); + $this->filesystem->expects('put') + ->with('app/Http/Requests/CommentStoreRequest.php', $this->fixture('form-requests/form-requests-controller-has-parent.php')); + + $tokens = $this->blueprint->parse($this->fixture('drafts/form-requests-controller-has-parent.yaml')); + $tree = $this->blueprint->analyze($tokens); + + self::assertSame([ + 'created' => [ + 'app/Http/Requests/CommentStoreRequest.php', + 'app/Http/Requests/CommentUpdateRequest.php', + ], + ], $this->subject->output($tree)); + } } diff --git a/tests/fixtures/drafts/form-requests-controller-has-parent.yaml b/tests/fixtures/drafts/form-requests-controller-has-parent.yaml new file mode 100644 index 00000000..476d1d9f --- /dev/null +++ b/tests/fixtures/drafts/form-requests-controller-has-parent.yaml @@ -0,0 +1,15 @@ +models: + Post: + title: string + body: text + relationships: + hasMany: comment + Comment: + body: text + relationships: + belongsTo: post +controllers: + Comment: + resource: api + meta: + parent: post diff --git a/tests/fixtures/form-requests/form-requests-controller-has-parent.php b/tests/fixtures/form-requests/form-requests-controller-has-parent.php new file mode 100644 index 00000000..9fc49c71 --- /dev/null +++ b/tests/fixtures/form-requests/form-requests-controller-has-parent.php @@ -0,0 +1,26 @@ + ['required', 'string'], + ]; + } +}