Skip to content

Commit d1e69c5

Browse files
authored
Merge pull request #82 from RonasIT/49-add-command-tests
Add command tests
2 parents b0e661d + 8e92bfb commit d1e69c5

35 files changed

+1203
-20
lines changed

config/entity-generator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
'tests' => 'tests',
1414
'routes' => 'routes/api.php',
1515
'factories' => 'database/factories',
16-
'translations' => 'resources/lang/en/validation.php',
16+
'translations' => 'lang/en/validation.php',
1717
'resources' => 'app/Http/Resources',
1818
'nova' => 'app/Nova',
1919
],

src/Commands/MakeEntityCommand.php

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -208,19 +208,6 @@ protected function outputNewConfig($packageConfigs, $projectConfigs)
208208

209209
$newConfig = array_merge($flattenedPackageConfigs, $flattenedProjectConfigs);
210210

211-
$translations = 'lang/en/validation.php';
212-
$translations = (version_compare(app()->version(), '9', '>=')) ? $translations : "resources/{$translations}";
213-
214-
if ($newConfig['paths.translations'] !== $translations) {
215-
$newConfig['paths.translations'] = $translations;
216-
}
217-
218-
$factories = 'database/factories';
219-
220-
if ($newConfig['paths.factories'] !== $factories) {
221-
$newConfig['paths.factories'] = $factories;
222-
}
223-
224211
$differences = array_diff_key($newConfig, $flattenedProjectConfigs);
225212

226213
foreach ($differences as $differenceKey => $differenceValue) {

src/Generators/NovaResourceGenerator.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,9 @@ protected function getFieldsFromCommandLineArguments(): array
140140

141141
protected function getFieldsFromDatabase(): array
142142
{
143-
$modelClass = "App\\Models\\{$this->model}";
143+
$modelClass = $this->getModelClass($this->model);
144144
$model = app($modelClass);
145+
145146
$columns = DB::connection($model->getConnectionName())
146147
->getDoctrineSchemaManager()
147148
->listTableColumns($model->getTable());

tests/CommandTest.php

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
namespace RonasIT\Support\Tests;
4+
5+
use Carbon\Carbon;
6+
use RonasIT\Support\Exceptions\ClassNotExistsException;
7+
use RonasIT\Support\Tests\Support\Command\CommandMockTrait;
8+
use UnexpectedValueException;
9+
10+
class CommandTest extends TestCase
11+
{
12+
use CommandMockTrait;
13+
14+
public function testCallWithInvalidCrudOption()
15+
{
16+
$this->assertExceptionThrew(
17+
className: UnexpectedValueException::class,
18+
message: 'Invalid method T',
19+
);
20+
21+
$this->artisan('make:entity Post --methods=T');
22+
}
23+
24+
public function testCallWithMissingModelService()
25+
{
26+
$this->assertExceptionThrew(
27+
className: ClassNotExistsException::class,
28+
message: 'Cannot create API without entity.',
29+
);
30+
31+
$this->artisan('make:entity Post --only-api');
32+
}
33+
34+
public function testCallCommand()
35+
{
36+
config([
37+
'entity-generator.paths.models' => 'RonasIT\Support\Tests\Support\Command\Models',
38+
'entity-generator.paths.factories' => 'RonasIT\Support\Tests\Support\Command\Factories',
39+
]);
40+
41+
Carbon::setTestNow('2016-10-20 11:05:00');
42+
43+
$this->mockFilesystem();
44+
$this->mockGenerator();
45+
$this->mockGettingModelInstance();
46+
47+
$this
48+
->artisan('make:entity Post --methods=CRUD')
49+
->assertSuccessful();
50+
51+
$this->assertGeneratedFileEquals('migration.php', 'database/migrations/2016_10_20_110500_posts_create_table.php');
52+
$this->assertGeneratedFileEquals('factory.php', 'RonasIT/Support/Tests/Support/Command/Factories/PostFactory.php');
53+
$this->assertGeneratedFileEquals('seeder.php', 'database/seeders/PostSeeder.php');
54+
$this->assertGeneratedFileEquals('model.php', 'RonasIT/Support/Tests/Support/Command/Models/Post.php');
55+
$this->assertGeneratedFileEquals('repository.php', 'app/Repositories/PostRepository.php');
56+
$this->assertGeneratedFileEquals('service.php', 'app/Services/PostService.php');
57+
$this->assertGeneratedFileEquals('create_request.php', 'app/Http/Requests/Post/CreatePostRequest.php');
58+
$this->assertGeneratedFileEquals('get_request.php', 'app/Http/Requests/Post/GetPostRequest.php');
59+
$this->assertGeneratedFileEquals('search_request.php', 'app/Http/Requests/Post/SearchPostsRequest.php');
60+
$this->assertGeneratedFileEquals('update_request.php', 'app/Http/Requests/Post/UpdatePostRequest.php');
61+
$this->assertGeneratedFileEquals('delete_request.php', 'app/Http/Requests/Post/DeletePostRequest.php');
62+
$this->assertGeneratedFileEquals('controller.php', 'app/Http/Controllers/PostController.php');
63+
$this->assertGeneratedFileEquals('resource.php', 'app/Http/Resources/Post/PostResource.php');
64+
$this->assertGeneratedFileEquals('resource_collection.php', 'app/Http/Resources/Post/PostsCollectionResource.php');
65+
$this->assertGeneratedFileEquals('routes.php', 'routes/api.php');
66+
$this->assertGeneratedFileEquals('test.php', 'tests/PostTest.php');
67+
$this->assertGeneratedFileEquals('dump.sql', 'tests/fixtures/PostTest/dump.sql');
68+
$this->assertGeneratedFileEquals('create_request.json', 'tests/fixtures/PostTest/create_post_request.json');
69+
$this->assertGeneratedFileEquals('create_response.json', 'tests/fixtures/PostTest/create_post_response.json');
70+
$this->assertGeneratedFileEquals('update_request.json', 'tests/fixtures/PostTest/update_post_request.json');
71+
$this->assertGeneratedFileEquals('validation.php', 'lang/en/validation.php');
72+
$this->assertGeneratedFileEquals('nova_resource.php', 'app/Nova/PostResource.php');
73+
$this->assertGeneratedFileEquals('nova_test.php', 'tests/NovaPostTest.php');
74+
$this->assertGeneratedFileEquals('nova_dump.php', 'tests/fixtures/NovaPostTest/nova_post_dump.sql');
75+
$this->assertGeneratedFileEquals('create_request.json', 'tests/fixtures/NovaPostTest/create_post_request.json');
76+
$this->assertGeneratedFileEquals('create_response.json', 'tests/fixtures/NovaPostTest/create_post_response.json');
77+
$this->assertGeneratedFileEquals('update_request.json', 'tests/fixtures/NovaPostTest/update_post_request.json');
78+
}
79+
80+
public function testMakeOnly()
81+
{
82+
$this->mockFilesystemPostModelExists();
83+
84+
$this
85+
->artisan('make:entity Post --methods=CRUD --only-repository')
86+
->assertSuccessful();
87+
88+
$this->assertGeneratedFileEquals('make_only_repository.php', 'app/Repositories/PostRepository.php');
89+
$this->assertFileDoesNotExist('database/migrations/2016_10_20_110500_posts_create_table.php');
90+
$this->assertFileDoesNotExist('database/factories/PostFactory.php');
91+
$this->assertFileDoesNotExist('database/seeders/PostSeeder.php');
92+
$this->assertFileDoesNotExist('app/Models/Post.php');
93+
$this->assertFileDoesNotExist('app/Services/PostService.php');
94+
$this->assertFileDoesNotExist('app/Http/Requests/Post/CreatePostRequest.php');
95+
$this->assertFileDoesNotExist('app/Http/Requests/Post/GetPostRequest.php');
96+
$this->assertFileDoesNotExist('app/Http/Requests/Post/SearchPostsRequest.php');
97+
$this->assertFileDoesNotExist('app/Http/Requests/Post/UpdatePostRequest.php');
98+
$this->assertFileDoesNotExist('app/Http/Requests/Post/DeletePostRequest.php');
99+
$this->assertFileDoesNotExist('app/Http/Controllers/PostController.php');
100+
$this->assertFileDoesNotExist('app/Http/Resources/Post/PostResource.php');
101+
$this->assertFileDoesNotExist('app/Http/Resources/Post/PostsCollectionResource.php');
102+
$this->assertFileDoesNotExist('routes/api.php');
103+
$this->assertFileDoesNotExist('tests/PostTest.php');
104+
$this->assertFileDoesNotExist('tests/fixtures/PostTest/dump.sql');
105+
$this->assertFileDoesNotExist('tests/fixtures/PostTest/create_post_request.json');
106+
$this->assertFileDoesNotExist('tests/fixtures/PostTest/create_post_response.json');
107+
$this->assertFileDoesNotExist('tests/fixtures/PostTest/update_post_request.json');
108+
$this->assertFileDoesNotExist('lang/en/validation.php');
109+
$this->assertFileDoesNotExist('app/Nova/PostResource.php');
110+
$this->assertFileDoesNotExist('tests/NovaPostTest.php');
111+
$this->assertFileDoesNotExist('tests/fixtures/NovaPostTest/nova_post_dump.sql');
112+
$this->assertFileDoesNotExist('tests/fixtures/NovaPostTest/create_post_request.json');
113+
$this->assertFileDoesNotExist('tests/fixtures/NovaPostTest/create_post_response.json');
114+
$this->assertFileDoesNotExist('tests/fixtures/NovaPostTest/update_post_request.json');
115+
}
116+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace RonasIT\Support\Tests\Support\Command;
4+
5+
use Illuminate\Database\Connection;
6+
use Illuminate\Support\Facades\DB;
7+
use RonasIT\Support\Generators\NovaTestGenerator;
8+
use RonasIT\Support\Tests\Support\Command\Models\Post;
9+
use RonasIT\Support\Tests\Support\FileSystemMock;
10+
use RonasIT\Support\Tests\Support\GeneratorMockTrait;
11+
use RonasIT\Support\Tests\Support\NovaResourceGeneratorTest\SchemaManager;
12+
use Mockery;
13+
14+
trait CommandMockTrait
15+
{
16+
use GeneratorMockTrait;
17+
18+
public function mockFilesystemPostModelExists(): void
19+
{
20+
$fileSystemMock = new FileSystemMock();
21+
22+
$fileSystemMock->models = ['Post.php' => $this->mockPhpFileContent()];
23+
$fileSystemMock->config = ['entity-generator.php' => ''];
24+
25+
$fileSystemMock->setStructure();
26+
}
27+
28+
public function mockFilesystem(): void
29+
{
30+
$fileSystemMock = new FileSystemMock();
31+
32+
$fileSystemMock->routes = [ 'api.php' => $this->mockPhpFileContent()];
33+
$fileSystemMock->config = ['entity-generator.php' => ''];
34+
$fileSystemMock->translations = [];
35+
36+
$fileSystemMock->setStructure();
37+
}
38+
39+
public function mockGenerator(): void
40+
{
41+
$this->mockClass(NovaTestGenerator::class, [
42+
$this->functionCall(
43+
name: 'loadNovaActions',
44+
result: [],
45+
),
46+
$this->functionCall(
47+
name: 'loadNovaFields',
48+
result: [],
49+
),
50+
$this->functionCall(
51+
name: 'loadNovaFilters',
52+
result: [],
53+
),
54+
]);
55+
56+
$this->mockNativeGeneratorFunctions(
57+
$this->nativeClassExistsMethodCall(['RonasIT\Support\Tests\Support\Command\Models\Post', true]),
58+
$this->nativeClassExistsMethodCall(['Laravel\Nova\NovaServiceProvider', true]),
59+
$this->nativeClassExistsMethodCall(['Laravel\Nova\NovaServiceProvider', true]),
60+
$this->nativeClassExistsMethodCall(['RonasIT\Support\Tests\Support\Command\Models\Post', true]),
61+
);
62+
}
63+
64+
public function mockGettingModelInstance(): void
65+
{
66+
$connectionMock = Mockery::mock(Connection::class)->makePartial();
67+
$connectionMock
68+
->expects('getDoctrineSchemaManager')
69+
->andReturn(new SchemaManager());
70+
71+
$mock = Mockery::mock('alias:' . DB::class);
72+
$mock
73+
->expects('connection')
74+
->with('pgsql')
75+
->andReturn($connectionMock);
76+
77+
$mock->shouldReceive('beginTransaction', 'rollBack');
78+
79+
$this->app->instance('App\\Models\\Post', new Post());
80+
}
81+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace RonasIT\Support\Tests\Support\Command\Factories;
4+
5+
use Illuminate\Database\Eloquent\Factories\Factory;
6+
use Illuminate\Support\Carbon;
7+
use RonasIT\Support\Tests\Support\Command\Models\Post;
8+
9+
class PostFactory extends Factory
10+
{
11+
protected $model = Post::class;
12+
13+
public function definition(): array
14+
{
15+
return [
16+
'title' => 'some title',
17+
'body' => 'some body',
18+
'posted_at' => Carbon::now(),
19+
'drafted' => false,
20+
'data' => [
21+
'title' => '1',
22+
'body' => '2',
23+
],
24+
];
25+
}
26+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace RonasIT\Support\Tests\Support\Command\Models;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use RonasIT\Support\Traits\ModelTrait;
7+
8+
class Post extends Model
9+
{
10+
use ModelTrait;
11+
12+
protected $fillable = [
13+
'title',
14+
'body',
15+
'data',
16+
'drafted',
17+
'user_id',
18+
'posted_at',
19+
'created_at',
20+
'updated_at'
21+
];
22+
23+
public function getConnectionName(): string
24+
{
25+
return 'pgsql';
26+
}
27+
}

tests/Support/FileSystemMock.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class FileSystemMock
1818
public ?array $routes = null;
1919
public ?array $factories = null;
2020
public ?array $translations = null;
21+
public ?array $config = null;
2122

2223
public function setStructure(): void
2324
{
@@ -108,10 +109,18 @@ public function setStructure(): void
108109
}
109110

110111
if (!is_null($this->translations)) {
111-
$structure['resources']['lang']['en'] = [];
112+
$structure['lang']['en'] = [];
112113

113114
foreach ($this->translations as $translation => $content) {
114-
$structure['resources']['lang']['en'][$translation] = $content;
115+
$structure['lang']['en'][$translation] = $content;
116+
}
117+
}
118+
119+
if (!is_null($this->config)) {
120+
$structure['config'] = [];
121+
122+
foreach ($this->config as $config => $content) {
123+
$structure['config'][$config] = $content;
115124
}
116125
}
117126

tests/Support/Test/Models/Post.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ class Post extends Model
2020
'updated_at'
2121
];
2222

23+
public function getConnectionName(): string
24+
{
25+
return 'pgsql';
26+
}
27+
2328
public function user()
2429
{
2530
return $this->belongsTo(User::class);

tests/TranslationGeneratorTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ public function testCreate()
2323
->setModel('Post')
2424
->generate();
2525

26-
$this->assertGeneratedFileEquals('validation.php', 'resources/lang/en/validation.php');
26+
$this->assertGeneratedFileEquals('validation.php', 'lang/en/validation.php');
2727

2828
$this->assertEventPushed(
2929
className: SuccessCreateMessage::class,
30-
message: 'Created a new Translations dump on path: vfs://root/resources/lang/en/validation.php',
30+
message: 'Created a new Translations dump on path: vfs://root/lang/en/validation.php',
3131
);
3232
}
3333

@@ -55,7 +55,7 @@ public function testAppendNotFoundException()
5555
->setModel('Post')
5656
->generate();
5757

58-
$this->assertGeneratedFileEquals('validation_append_not_found_exception.php', 'resources/lang/en/validation.php');
58+
$this->assertGeneratedFileEquals('validation_append_not_found_exception.php', 'lang/en/validation.php');
5959

6060
Event::assertNothingDispatched();
6161
}

0 commit comments

Comments
 (0)