From e6b87ab03123147fd0b11b290b536421613f71d0 Mon Sep 17 00:00:00 2001 From: Gianluca Bine Date: Sat, 9 May 2020 13:48:28 -0300 Subject: [PATCH] Support model reference in validate statement to validate all columns --- .../Statements/FormRequestGenerator.php | 36 +++++++++++++++--- .../Statements/FormRequestGeneratorTest.php | 37 +++++++++++++++++++ .../definitions/model-reference-validate.bp | 11 ++++++ .../form-requests/certificate-store.php | 34 +++++++++++++++++ .../form-requests/certificate-update.php | 34 +++++++++++++++++ 5 files changed, 146 insertions(+), 6 deletions(-) create mode 100644 tests/fixtures/definitions/model-reference-validate.bp create mode 100644 tests/fixtures/form-requests/certificate-store.php create mode 100644 tests/fixtures/form-requests/certificate-update.php diff --git a/src/Generators/Statements/FormRequestGenerator.php b/src/Generators/Statements/FormRequestGenerator.php index aa727eff..86d04592 100644 --- a/src/Generators/Statements/FormRequestGenerator.php +++ b/src/Generators/Statements/FormRequestGenerator.php @@ -86,9 +86,14 @@ private function buildRules(string $context, ValidateStatement $validateStatemen $qualifier = $context; } - $rules = $this->validationRules($qualifier, $column); + $validationRules = $this->validationRules($qualifier, $column); + + foreach ($validationRules as $name => $rule) { + $formattedRule = implode("|", $rule); + + $output .= self::INDENT . "'{$name}' => '{$formattedRule}'," . PHP_EOL; + } - $output .= self::INDENT . "'{$column}' => '{$rules}'," . PHP_EOL; return $output; }, '')); } @@ -129,13 +134,32 @@ private function validationRules(string $qualifier, string $column) /** @var \Blueprint\Models\Model $model */ $model = $this->modelForContext($qualifier); - if (!is_null($model) && $model->hasColumn($column)) { - $column = $model->column($column); + $rules = []; - return implode('|', Rules::fromColumn($model->tableName(), $column)); + if (!is_null($model)) { + if ($model->hasColumn($column)) { + $modelColumn = $model->column($column); + + $rules[$column] = Rules::fromColumn($model->tableName(), $modelColumn); + + return $rules; + } else { + /** @var \Blueprint\Models\Model $column */ + foreach ($model->columns() as $column) { + if ($column->dataType() === 'id') { + continue; + } + + $rules[$column->name()] = Rules::fromColumn($model->tableName(), $column); + } + + return $rules; + } + } else { + $rules[$column] = ['required']; } - return 'required'; + return $rules; } private function registerModels(array $tree) diff --git a/tests/Feature/Generator/Statements/FormRequestGeneratorTest.php b/tests/Feature/Generator/Statements/FormRequestGeneratorTest.php index af87a6f7..ee5fb632 100644 --- a/tests/Feature/Generator/Statements/FormRequestGeneratorTest.php +++ b/tests/Feature/Generator/Statements/FormRequestGeneratorTest.php @@ -102,6 +102,43 @@ public function output_writes_form_requests() $this->assertEquals(['created' => ['app/Http/Requests/PostIndexRequest.php', 'app/Http/Requests/PostStoreRequest.php', 'app/Http/Requests/OtherStoreRequest.php']], $this->subject->output($tree)); } + /** + * @test + */ + public function output_writes_form_requests_with_support_for_model_reference_in_validate_statement() + { + $this->files->expects('stub') + ->with('form-request.stub') + ->andReturn(file_get_contents('stubs/form-request.stub')); + + $this->files->shouldReceive('exists') + ->twice() + ->with('app/Http/Requests') + ->andReturns(false, false); + + $this->files->expects('makeDirectory') + ->twice() + ->with('app/Http/Requests', 0755, true) + ->andReturns(true, false); + + $this->files->expects('exists') + ->with('app/Http/Requests/CertificateStoreRequest.php') + ->andReturnFalse(); + $this->files->expects('put') + ->with('app/Http/Requests/CertificateStoreRequest.php', $this->fixture('form-requests/certificate-store.php')); + + $this->files->expects('exists') + ->with('app/Http/Requests/CertificateUpdateRequest.php') + ->andReturnFalse(); + $this->files->expects('put') + ->with('app/Http/Requests/CertificateUpdateRequest.php', $this->fixture('form-requests/certificate-update.php')); + + $tokens = $this->blueprint->parse($this->fixture('definitions/model-reference-validate.bp')); + $tree = $this->blueprint->analyze($tokens); + + $this->assertEquals(['created' => ['app/Http/Requests/CertificateStoreRequest.php', 'app/Http/Requests/CertificateUpdateRequest.php']], $this->subject->output($tree)); + } + /** * @test */ diff --git a/tests/fixtures/definitions/model-reference-validate.bp b/tests/fixtures/definitions/model-reference-validate.bp new file mode 100644 index 00000000..7d5ffec4 --- /dev/null +++ b/tests/fixtures/definitions/model-reference-validate.bp @@ -0,0 +1,11 @@ +models: + Certificate: + name: string + reference: string + document: string + expiry_date: date + remarks: nullable text + +controllers: + Certificate: + resource: api diff --git a/tests/fixtures/form-requests/certificate-store.php b/tests/fixtures/form-requests/certificate-store.php new file mode 100644 index 00000000..f619dc57 --- /dev/null +++ b/tests/fixtures/form-requests/certificate-store.php @@ -0,0 +1,34 @@ + 'required|string', + 'reference' => 'required|string', + 'document' => 'required|string', + 'expiry_date' => 'required|date', + 'remarks' => 'required|string', + ]; + } +} diff --git a/tests/fixtures/form-requests/certificate-update.php b/tests/fixtures/form-requests/certificate-update.php new file mode 100644 index 00000000..b34a081b --- /dev/null +++ b/tests/fixtures/form-requests/certificate-update.php @@ -0,0 +1,34 @@ + 'required|string', + 'reference' => 'required|string', + 'document' => 'required|string', + 'expiry_date' => 'required|date', + 'remarks' => 'required|string', + ]; + } +}