Skip to content

Commit 558c187

Browse files
committed
refactor: use set entity in setMetaData
1 parent 418fe23 commit 558c187

File tree

7 files changed

+433
-44
lines changed

7 files changed

+433
-44
lines changed

src/Generators/NovaTestGenerator.php

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,42 +16,59 @@
1616

1717
class NovaTestGenerator extends AbstractTestsGenerator
1818
{
19-
protected string $novaResourceClassName;
19+
protected ?string $novaResourceClassName;
2020

2121
public function generate(): void
2222
{
2323
if (class_exists(NovaServiceProvider::class)) {
24-
if ($this->classExists('nova', "Nova{$this->model}ResourceTest")) {
24+
if (empty($this->novaResourceClassName)) {
25+
$novaResources = $this->getCommonNovaResources();
2526

26-
$path = $this->getClassPath('nova', "Nova{$this->model}ResourceTest");
27+
if (count($novaResources) > 1) {
28+
$foundedResources = implode(', ', $novaResources);
2729

28-
throw new ResourceAlreadyExistsException($path);
29-
}
30-
31-
$novaResources = $this->getCommonNovaResources();
32-
33-
if (count($novaResources) > 1) {
34-
$foundedResources = implode(', ', $novaResources);
35-
36-
// TODO: Change exception message after https://github.com/RonasIT/laravel-entity-generator/issues/159 will be ready
3730
$this->throwFailureException(
3831
EntityCreateException::class,
3932
"Cannot create Nova{$this->model}ResourceTest cause was found a lot of suitable resources: {$foundedResources}.",
4033
'Please, use --resource-name option.'
4134
);
42-
}
35+
}
4336

44-
if (empty($novaResources)) {
45-
$this->throwFailureException(
46-
ClassNotExistsException::class,
47-
"Cannot create Nova{$this->model}ResourceTest cause {$this->model} Nova resource does not exist.",
48-
"Create {$this->model} Nova resource."
49-
);
50-
}
37+
if (empty($novaResources)) {
38+
// TODO: pass $this->modelSubfolder to Exception after refactoring in https://github.com/RonasIT/laravel-entity-generator/issues/179
39+
$this->throwFailureException(
40+
ClassNotExistsException::class,
41+
"Cannot create Nova{$this->model}ResourceTest cause {$this->model} Nova resource does not exist.",
42+
"Create {$this->model} Nova resource."
43+
);
44+
}
5145

52-
$this->novaResourceClassName = Arr::first($novaResources);
46+
$this->novaResourceClassName = Arr::first($novaResources);
5347

54-
$this->entity = Str::afterLast($this->novaResourceClassName, '\\');
48+
$this->entity = Str::afterLast($this->novaResourceClassName, '\\');
49+
50+
if ($this->classExists('nova', "Nova{$this->entity}ResourceTest")) {
51+
$path = $this->getClassPath('nova', "Nova{$this->entity}ResourceTest");
52+
53+
throw new ResourceAlreadyExistsException($path);
54+
}
55+
56+
} else {
57+
if ($this->classExists('nova', "Nova{$this->entity}Test")) {
58+
$path = $this->getClassPath('nova', "Nova{$this->entity}Test");
59+
60+
throw new ResourceAlreadyExistsException($path);
61+
}
62+
63+
if (!$this->isNovaResource($this->novaResourceClassName) || !$this->isResourceNameContainModel($this->novaResourceClassName)) {
64+
// TODO: pass $this->modelSubfolder to Exception after refactoring in https://github.com/RonasIT/laravel-entity-generator/issues/179
65+
$this->throwFailureException(
66+
ClassNotExistsException::class,
67+
"Cannot create Nova{$this->entity}Test cause {$this->entity} Nova resource does not exist.",
68+
"Create {$this->entity} Nova resource."
69+
);
70+
}
71+
}
5572

5673
parent::generate();
5774
} else {
@@ -61,7 +78,11 @@ public function generate(): void
6178

6279
public function setMetaData(array $data): self
6380
{
64-
$this->novaResourceName = !empty($data['resource_name']) ? Str::studly($data['resource_name']) : null;
81+
if (!empty($data['resource_name'])) {
82+
$this->novaResourceClassName = $this->pathToNamespace($this->paths['nova'] . DIRECTORY_SEPARATOR . Str::studly($data['resource_name']));
83+
84+
$this->entity = Str::afterLast($this->novaResourceClassName, '\\');
85+
}
6586

6687
return $this;
6788
}
@@ -87,7 +108,7 @@ public function generateTests(): void
87108
'filters' => $filters,
88109
]);
89110

90-
$this->saveClass('tests', "Nova{$this->model}ResourceTest", $fileContent);
111+
$this->saveClass('tests', "Nova{$this->entity}Test", $fileContent);
91112

92113
event(new SuccessCreateMessage("Created a new Nova test: Nova{$this->model}ResourceTest"));
93114
}

tests/CommandTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public function testCallCommandSubFoldersModel()
113113
$this
114114
->artisan('make:entity Forum/Post --methods=CRUD')
115115
->assertSuccessful();
116-
116+
117117
$this->assertGeneratedFileEquals('subfolder/model.php', 'RonasIT/Support/Tests/Support/Command/Models/Forum/Post.php');
118118
$this->assertGeneratedFileEquals('subfolder/factory.php', 'RonasIT/Support/Tests/Support/Command/Factories/PostFactory.php');
119119
$this->assertGeneratedFileEquals('subfolder/repository.php', 'app/Repositories/PostRepository.php');
@@ -220,10 +220,10 @@ public function testMakeOnlyNovaTest(): void
220220
$this->assertFileDoesNotExist('lang/en/validation.php');
221221
$this->assertFileDoesNotExist('app/Nova/PostResource.php');
222222
$this->assertGeneratedFileEquals('nova_test.php', 'tests/NovaPostResourceTest.php');
223-
$this->assertGeneratedFileEquals('nova_dump.php', 'tests/fixtures/NovaPostResourceTest/nova_post_dump.sql');
224-
$this->assertGeneratedFileEquals('create_request.json', 'tests/fixtures/NovaPostResourceTest/create_post_request.json');
225-
$this->assertGeneratedFileEquals('create_response.json', 'tests/fixtures/NovaPostResourceTest/create_post_response.json');
226-
$this->assertGeneratedFileEquals('update_request.json', 'tests/fixtures/NovaPostResourceTest/update_post_request.json');
223+
$this->assertGeneratedFileEquals('nova_dump.php', 'tests/fixtures/NovaPostResourceTest/nova_post_resource_dump.sql');
224+
$this->assertGeneratedFileEquals('create_request.json', 'tests/fixtures/NovaPostResourceTest/create_post_resource_request.json');
225+
$this->assertGeneratedFileEquals('create_response.json', 'tests/fixtures/NovaPostResourceTest/create_post_resource_response.json');
226+
$this->assertGeneratedFileEquals('update_request.json', 'tests/fixtures/NovaPostResourceTest/update_post_resource_request.json');
227227
}
228228

229229
public function testCallWithNotDefaultConfig()

tests/NovaTestGeneratorTest.php

Lines changed: 77 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,40 @@ className: ClassNotExistsException::class,
4141
->generate();
4242
}
4343

44-
public function testGenerateToManyResources(): void
44+
public function testGenerateResourceWithSetResourceNameNotExists()
45+
{
46+
$this->assertExceptionThrew(
47+
className: ClassNotExistsException::class,
48+
message: 'Cannot create NovaWelcomeBonusDraftResourceTest cause WelcomeBonusDraftResource Nova resource does not exist. Create WelcomeBonusDraftResource Nova resource.',
49+
);
50+
51+
$this->mockNativeGeneratorFunctions(
52+
$this->nativeClassExistsMethodCall([NovaServiceProvider::class, true]),
53+
$this->nativeIsSubClassOfMethodCall(['App\Nova\Resources\WelcomeBonusDraftResource', 'Laravel\\Nova\\Resource'], false),
54+
);
55+
56+
app(NovaTestGenerator::class)
57+
->setModel('Post')
58+
->setMetaData(['resource_name' => 'Resources\WelcomeBonusDraftResource'])
59+
->generate();
60+
}
61+
62+
public function testGenerateNovaTestWithSetResourceNameAlreadyExists()
4563
{
4664
$this->mockNovaServiceProviderExists();
4765

4866
$this->mockClass(NovaTestGenerator::class, [
49-
$this->getCommonNovaResourcesMock([
50-
'BasePostResource',
51-
'PublishPostResource',
52-
]),
67+
$this->classExistsMethodCall(['nova', 'NovaPostResourceTest']),
5368
]);
5469

5570
$this->assertExceptionThrew(
56-
className: EntityCreateException::class,
57-
message: 'Cannot create NovaPostResourceTest cause was found a lot of suitable resources: BasePostResource, PublishPostResource. Make test by yourself.',
71+
className: ResourceAlreadyExistsException::class,
72+
message: "Cannot create NovaPostResourceTest cause it already exists. Remove app/Nova/NovaPostResourceTest.php and run command again.",
5873
);
5974

6075
app(NovaTestGenerator::class)
6176
->setModel('Post')
77+
->setMetaData(['resource_name' => 'PostResource'])
6278
->generate();
6379
}
6480

@@ -72,7 +88,29 @@ public function testGenerateNovaTestAlreadyExists()
7288

7389
$this->assertExceptionThrew(
7490
className: ResourceAlreadyExistsException::class,
75-
message: "Cannot create NovaPostResourceTest cause it already exists. Remove vfs://root/app/Nova/NovaPostResourceTest.php and run command again.",
91+
message: "Cannot create NovaPostResourceTest cause it already exists. Remove app/Nova/NovaPostResourceTest.php and run command again.",
92+
);
93+
94+
app(NovaTestGenerator::class)
95+
->setModel('Post')
96+
->setMetaData(['resource_name' => 'PostResource'])
97+
->generate();
98+
}
99+
100+
public function testGenerateToManyResources(): void
101+
{
102+
$this->mockNovaServiceProviderExists();
103+
104+
$this->mockClass(NovaTestGenerator::class, [
105+
$this->getCommonNovaResourcesMock([
106+
'BasePostResource',
107+
'PublishPostResource',
108+
]),
109+
]);
110+
111+
$this->assertExceptionThrew(
112+
className: EntityCreateException::class,
113+
message: 'Cannot create NovaPostResourceTest cause was found a lot of suitable resources: BasePostResource, PublishPostResource. Please, use --resource-name option.',
76114
);
77115

78116
app(NovaTestGenerator::class)
@@ -89,7 +127,7 @@ public function testNovaTestStubNotExist()
89127

90128
$this->mockNativeGeneratorFunctions(
91129
$this->nativeClassExistsMethodCall([NovaServiceProvider::class, true]),
92-
$this->nativeClassExistsMethodCall([WelcomeBonus::class, true]),
130+
$this->nativeClassExistsMethodCall(['RonasIT\Support\Tests\Support\Models\WelcomeBonus']),
93131
);
94132

95133
$this->mockClass(NovaTestGenerator::class, [
@@ -139,7 +177,7 @@ public function testDumpStubNotExist()
139177
->setModel('WelcomeBonus')
140178
->generate();
141179

142-
$this->assertGeneratedFileEquals('created_resource_test.php', 'tests/NovaWelcomeBonusResourceTest.php');
180+
$this->assertGeneratedFileEquals('created_resource_test_without_set_resource_name.php', 'tests/NovaWelcomeBonusResourceTest.php');
143181
$this->assertFileDoesNotExist('tests/fixtures/NovaWelcomeBonusResourceTest/nova_welcome_bonus_resource_dump.sql');
144182
$this->assertGeneratedFileEquals('create_welcome_bonus_request.json', 'tests/fixtures/NovaWelcomeBonusResourceTest/create_welcome_bonus_resource_request.json');
145183
$this->assertGeneratedFileEquals('create_welcome_bonus_response.json', 'tests/fixtures/NovaWelcomeBonusResourceTest/create_welcome_bonus_resource_response.json');
@@ -176,13 +214,41 @@ public function testSuccess()
176214
->setModel('WelcomeBonus')
177215
->generate();
178216

179-
$this->assertGeneratedFileEquals('created_resource_test.php', 'tests/NovaWelcomeBonusResourceTest.php');
217+
$this->assertGeneratedFileEquals('created_resource_test_without_set_resource_name.php', 'tests/NovaWelcomeBonusResourceTest.php');
180218
$this->assertGeneratedFileEquals('dump.sql', 'tests/fixtures/NovaWelcomeBonusResourceTest/nova_welcome_bonus_resource_dump.sql');
181219
$this->assertGeneratedFileEquals('create_welcome_bonus_request.json', 'tests/fixtures/NovaWelcomeBonusResourceTest/create_welcome_bonus_resource_request.json');
182220
$this->assertGeneratedFileEquals('create_welcome_bonus_response.json', 'tests/fixtures/NovaWelcomeBonusResourceTest/create_welcome_bonus_resource_response.json');
183221
$this->assertGeneratedFileEquals('update_welcome_bonus_request.json', 'tests/fixtures/NovaWelcomeBonusResourceTest/update_welcome_bonus_resource_request.json');
184222
}
185223

224+
public function testSuccessWithSetResourceName()
225+
{
226+
config([
227+
'entity-generator.paths.models' => 'RonasIT/Support/Tests/Support/Models',
228+
]);
229+
230+
$this->mockDBTransactionStartRollback();
231+
232+
$this->mockNativeGeneratorFunctions(
233+
$this->nativeClassExistsMethodCall([NovaServiceProvider::class, true]),
234+
$this->nativeClassExistsMethodCall([WelcomeBonus::class, true]),
235+
$this->nativeIsSubClassOfMethodCall(['App\Nova\Resources\WelcomeBonusDraftResource', 'Laravel\\Nova\\Resource']),
236+
);
237+
238+
$this->mockNovaRequestClassCall();
239+
240+
app(NovaTestGenerator::class)
241+
->setModel('WelcomeBonus')
242+
->setMetaData(['resource_name' => 'Resources\WelcomeBonusDraftResource'])
243+
->generate();
244+
245+
$this->assertGeneratedFileEquals('created_resource_test.php', 'tests/NovaWelcomeBonusDraftResourceTest.php');
246+
$this->assertGeneratedFileEquals('dump.sql', 'tests/fixtures/NovaWelcomeBonusDraftResourceTest/nova_welcome_bonus_draft_resource_dump.sql');
247+
$this->assertGeneratedFileEquals('create_welcome_bonus_request.json', 'tests/fixtures/NovaWelcomeBonusDraftResourceTest/create_welcome_bonus_draft_resource_request.json');
248+
$this->assertGeneratedFileEquals('create_welcome_bonus_response.json', 'tests/fixtures/NovaWelcomeBonusDraftResourceTest/create_welcome_bonus_draft_resource_response.json');
249+
$this->assertGeneratedFileEquals('update_welcome_bonus_request.json', 'tests/fixtures/NovaWelcomeBonusDraftResourceTest/update_welcome_bonus_draft_resource_request.json');
250+
}
251+
186252
public function testGenerateNovaPackageNotInstall()
187253
{
188254
$this->mockNovaServiceProviderExists(false);

tests/Support/Command/CommandMockTrait.php

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ public function mockFilesystemPostModelExists(): void
2020
$fileSystemMock->setStructure();
2121
}
2222

23+
public function mockFilesystemWithPostModelAndResource(): void
24+
{
25+
$fileSystemMock = new FileSystemMock();
26+
27+
$fileSystemMock->models = ['Post.php' => $this->mockPhpFileContent()];
28+
$fileSystemMock->novaModels = ['PostResource.php' => $this->mockPhpFileContent()];
29+
$fileSystemMock->config = ['entity-generator.php' => ''];
30+
31+
$fileSystemMock->setStructure();
32+
}
33+
2334
public function mockFilesystem(): void
2435
{
2536
$fileSystemMock = new FileSystemMock();
@@ -83,8 +94,33 @@ public function mockGeneratorSubFolders(): void
8394
);
8495
}
8596

86-
public function nativeIsSubClassOfMethodCall(array $arguments, bool $result = true): array
97+
public function mockGeneratorOnlyNovaTests(): void
8798
{
88-
return $this->functionCall('is_subclass_of', $arguments, $result);
99+
$this->mockClass(NovaTestGenerator::class, [
100+
$this->functionCall(
101+
name: 'loadNovaActions',
102+
result: [],
103+
),
104+
$this->functionCall(
105+
name: 'loadNovaFields',
106+
result: [],
107+
),
108+
$this->functionCall(
109+
name: 'loadNovaFilters',
110+
result: [],
111+
),
112+
$this->classExistsMethodCall(['nova', 'NovaPostResourceTest'], false),
113+
$this->classExistsMethodCall(['models', 'User'], false),
114+
$this->classExistsMethodCall(['factories', 'PostFactory']),
115+
$this->classExistsMethodCall(['factories', 'PostFactory']),
116+
]);
117+
118+
$this->mockDBTransactionStartRollback();
119+
120+
$this->mockNativeGeneratorFunctions(
121+
$this->nativeClassExistsMethodCall(['Laravel\Nova\NovaServiceProvider', true]),
122+
$this->nativeIsSubClassOfMethodCall(['App\Nova\PostResource', 'Laravel\\Nova\\Resource']),
123+
$this->nativeClassExistsMethodCall(['RonasIT\Support\Tests\Support\Command\Models\Post', true]),
124+
);
89125
}
90126
}

tests/Support/GeneratorMockTrait.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public function mockNovaServiceProviderExists(bool $result = true): void
3232
);
3333
}
3434

35+
public function nativeIsSubClassOfMethodCall(array $arguments, bool $result = true): array
36+
{
37+
return $this->functionCall('is_subclass_of', $arguments, $result);
38+
}
39+
3540
public function classExistsMethodCall(array $arguments, bool $result = true): array
3641
{
3742
return [

tests/Support/Nova/Resources/WelcomeBonusDraftResource.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
use RonasIT\Support\Tests\Support\NovaTestGeneratorTest\PublishPostAction;
1111
use RonasIT\Support\Tests\Support\NovaTestGeneratorTest\TextField;
1212
use RonasIT\Support\Tests\Support\NovaTestGeneratorTest\UnPublishPostAction;
13-
use Laravel\Nova\Resource;
1413

15-
class WelcomeBonusDraftResource extends Resource
14+
class WelcomeBonusDraftResource
1615
{
1716
public static $title = 'name';
1817

0 commit comments

Comments
 (0)