diff --git a/src/Generators/TranslationsGenerator.php b/src/Generators/TranslationsGenerator.php index 155e37f3..f36dbfe5 100644 --- a/src/Generators/TranslationsGenerator.php +++ b/src/Generators/TranslationsGenerator.php @@ -13,7 +13,7 @@ public function __construct() { parent::__construct(); - $this->translationPath = Arr::get($this->paths, 'translations', 'resources/lang/en/validation.php'); + $this->translationPath = base_path(Arr::get($this->paths, 'translations', 'resources/lang/en/validation.php')); } public function generate(): void @@ -21,8 +21,8 @@ public function generate(): void if (!file_exists($this->translationPath) && $this->isStubExists('validation')) { $this->createTranslate(); } - - if ($this->isTranslationMissed('validation.exceptions.not_found') && $this->isStubExists('translation_not_found')) { + + if (file_exists($this->translationPath) && $this->isTranslationMissed('validation.exceptions.not_found') && $this->isStubExists('translation_not_found')) { $this->appendNotFoundException(); } } @@ -41,20 +41,20 @@ protected function createTranslate(): void file_put_contents($this->translationPath, $content); $createMessage = "Created a new Translations dump on path: {$this->translationPath}"; - + event(new SuccessCreateMessage($createMessage)); } protected function appendNotFoundException(): void { $content = file_get_contents($this->translationPath); - + $stubPath = config('entity-generator.stubs.translation_not_found'); - + $stubContent = view($stubPath)->render(); - $fixedContent = preg_replace('/\]\;\s*$/', "\n\t{$stubContent}", $content); - + $fixedContent = preg_replace('/\]\;\s*$/', "\n {$stubContent}", $content); + file_put_contents($this->translationPath, $fixedContent); } -} \ No newline at end of file +} diff --git a/stubs/translation_not_found.blade.php b/stubs/translation_not_found.blade.php index bac7b934..e0fb43d8 100644 --- a/stubs/translation_not_found.blade.php +++ b/stubs/translation_not_found.blade.php @@ -9,6 +9,6 @@ 'exceptions' => [ 'not_found' => ':Entity does not exist', - ] + ], ]; diff --git a/stubs/validation.blade.php b/stubs/validation.blade.php index 7ada09a4..c6d83ebc 100644 --- a/stubs/validation.blade.php +++ b/stubs/validation.blade.php @@ -127,6 +127,6 @@ 'exceptions' => [ 'not_found' => ':Entity does not exist', - ] + ], ]; diff --git a/tests/Support/FileSystemMock.php b/tests/Support/FileSystemMock.php index 7d9b6f23..da7cc5a4 100644 --- a/tests/Support/FileSystemMock.php +++ b/tests/Support/FileSystemMock.php @@ -17,6 +17,7 @@ class FileSystemMock public ?array $testClasses = null; public ?array $routes = null; public ?array $factories = null; + public ?array $translations = null; public function setStructure(): void { @@ -106,6 +107,14 @@ public function setStructure(): void } } + if (!is_null($this->translations)) { + $structure['resources']['lang']['en'] = []; + + foreach ($this->translations as $translation => $content) { + $structure['resources']['lang']['en'][$translation] = $content; + } + } + vfsStream::create($structure); } } diff --git a/tests/Support/Translation/TranslationMockTrait.php b/tests/Support/Translation/TranslationMockTrait.php new file mode 100644 index 00000000..fa8ec1d2 --- /dev/null +++ b/tests/Support/Translation/TranslationMockTrait.php @@ -0,0 +1,31 @@ +translations = []; + + $fileSystemMock->setStructure(); + } + + public function mockFilesystemForAppend(): void + { + $validation = file_get_contents(getcwd() . '/tests/Support/Translation/validation_without_exceptions.php'); + + $fileSystemMock = new FileSystemMock(); + + $fileSystemMock->translations = ['validation.php' => $validation]; + + $fileSystemMock->setStructure(); + } +} diff --git a/tests/Support/Translation/validation_without_exceptions.php b/tests/Support/Translation/validation_without_exceptions.php new file mode 100644 index 00000000..ae48a802 --- /dev/null +++ b/tests/Support/Translation/validation_without_exceptions.php @@ -0,0 +1,3 @@ +andReturn([]); + + $this->mockFilesystem(); + + app(TranslationsGenerator::class) + ->setModel('Post') + ->generate(); + + $this->assertGeneratedFileEquals('validation.php', 'resources/lang/en/validation.php'); + + $this->assertEventPushed( + className: SuccessCreateMessage::class, + message: 'Created a new Translations dump on path: vfs://root/resources/lang/en/validation.php', + ); + } + + public function testCreateStubNotExist() + { + config(['entity-generator.stubs.validation' => 'incorrect_stub']); + + app(TranslationsGenerator::class) + ->setModel('Post') + ->generate(); + + $this->assertFileDoesNotExist('resources/lang/en/validation.php'); + + $this->assertEventPushed( + className: WarningEvent::class, + message: 'Generation of validation has been skipped cause the view incorrect_stub from the config entity-generator.stubs.validation is not exists. Please check that config has the correct view name value.', + ); + } + + public function testAppendNotFoundException() + { + $this->mockFilesystemForAppend(); + + app(TranslationsGenerator::class) + ->setModel('Post') + ->generate(); + + $this->assertGeneratedFileEquals('validation_append_not_found_exception.php', 'resources/lang/en/validation.php'); + + Event::assertNothingDispatched(); + } + + public function testAppendNotFoundExceptionStubNotExist() + { + config(['entity-generator.stubs.translation_not_found' => 'incorrect_stub']); + + $this->mockFilesystemForAppend(); + + app(TranslationsGenerator::class) + ->setModel('Post') + ->generate(); + + $this->assertFileDoesNotExist('validation.php', 'resources/lang/en/validation.php'); + + $this->assertEventPushed( + className: WarningEvent::class, + message: 'Generation of translation not found has been skipped cause the view incorrect_stub from the config entity-generator.stubs.translation_not_found is not exists. Please check that config has the correct view name value.', + ); + } +} diff --git a/tests/fixtures/TranslationGeneratorTest/validation.php b/tests/fixtures/TranslationGeneratorTest/validation.php new file mode 100644 index 00000000..c453c6ba --- /dev/null +++ b/tests/fixtures/TranslationGeneratorTest/validation.php @@ -0,0 +1,134 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'not_in' => 'The selected :attribute is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap http error messages. + | + */ + + 'exceptions' => [ + 'not_found' => ':Entity does not exist', + ], + +]; diff --git a/tests/fixtures/TranslationGeneratorTest/validation_append_not_found_exception.php b/tests/fixtures/TranslationGeneratorTest/validation_append_not_found_exception.php new file mode 100644 index 00000000..ae0c21f2 --- /dev/null +++ b/tests/fixtures/TranslationGeneratorTest/validation_append_not_found_exception.php @@ -0,0 +1,17 @@ + [ + 'not_found' => ':Entity does not exist', + ], + +];