Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/Generators/TranslationsGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ 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
{
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();
}
}
Expand All @@ -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);

file_put_contents($this->translationPath, $fixedContent);
}
}
}
2 changes: 1 addition & 1 deletion stubs/translation_not_found.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@

'exceptions' => [
'not_found' => ':Entity does not exist',
]
],

];
2 changes: 1 addition & 1 deletion stubs/validation.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,6 @@

'exceptions' => [
'not_found' => ':Entity does not exist',
]
],

];
9 changes: 9 additions & 0 deletions tests/Support/FileSystemMock.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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);
}
}
31 changes: 31 additions & 0 deletions tests/Support/Translation/TranslationMockTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace RonasIT\Support\Tests\Support\Translation;

use RonasIT\Support\Tests\Support\FileSystemMock;
use RonasIT\Support\Tests\Support\GeneratorMockTrait;

trait TranslationMockTrait
{
use GeneratorMockTrait;

public function mockFilesystem(): void
{
$fileSystemMock = new FileSystemMock;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$fileSystemMock = new FileSystemMock;
$fileSystemMock = new FileSystemMock();


$fileSystemMock->translations = [];

$fileSystemMock->setStructure();
}

public function mockFilesystemForAppend(): void
{
$validation = file_get_contents(getcwd() . '/tests/Support/Translation/validation_without_exceptions.php');

$fileSystemMock = new FileSystemMock;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$fileSystemMock = new FileSystemMock;
$fileSystemMock = new FileSystemMock();


$fileSystemMock->translations = ['validation.php' => $validation];

$fileSystemMock->setStructure();
}
}
120 changes: 120 additions & 0 deletions tests/Support/Translation/validation_without_exceptions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/

'accepted' => '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' => [],
];
82 changes: 82 additions & 0 deletions tests/TranslationGeneratorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php

namespace RonasIT\Support\Tests;

use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Lang;
use RonasIT\Support\Events\SuccessCreateMessage;
use RonasIT\Support\Events\WarningEvent;
use RonasIT\Support\Generators\TranslationsGenerator;
use RonasIT\Support\Tests\Support\Translation\TranslationMockTrait;

class TranslationGeneratorTest extends TestCase
{
use TranslationMockTrait;

public function testCreate()
{
$translations = $this->getJsonFixture('validation.json');

Lang::shouldReceive('get')->andReturn($translations);

$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.',
);
}
}
Loading