From ad5725cc54942e42bf43fb062af046c622bf97ec Mon Sep 17 00:00:00 2001 From: Konstantin Lapkovsky Date: Thu, 21 Dec 2023 21:44:55 +0400 Subject: [PATCH 1/4] tests: add resource generator tests. --- tests/ResourceGeneratorTest.php | 53 ++++++++++++++++ tests/Support/Resource/ResourceMockTrait.php | 63 +++++++++++++++++++ .../post_collection_resource.php | 10 +++ .../ResourceGeneratorTest/post_resource.php | 14 +++++ 4 files changed, 140 insertions(+) create mode 100644 tests/ResourceGeneratorTest.php create mode 100644 tests/Support/Resource/ResourceMockTrait.php create mode 100644 tests/fixtures/ResourceGeneratorTest/post_collection_resource.php create mode 100644 tests/fixtures/ResourceGeneratorTest/post_resource.php diff --git a/tests/ResourceGeneratorTest.php b/tests/ResourceGeneratorTest.php new file mode 100644 index 00000000..90881a00 --- /dev/null +++ b/tests/ResourceGeneratorTest.php @@ -0,0 +1,53 @@ +mockGeneratorForAlreadyExistsResource(); + + $this->expectException(ClassAlreadyExistsException::class); + $this->expectErrorMessage('Cannot create PostResource cause PostResource already exists. Remove PostResource.'); + + app(ResourceGenerator::class) + ->setModel('Post') + ->generate(); + } + + public function testCollectionResourceAlreadyExists() + { + $this->mockGeneratorForAlreadyExistsCollectionResource(); + + $this->expectException(ClassAlreadyExistsException::class); + $this->expectErrorMessage('Cannot create PostsCollectionResource cause PostsCollectionResource already exists. ' + . 'Remove PostsCollectionResource.'); + + app(ResourceGenerator::class) + ->setModel('Post') + ->generate(); + } + + public function testCreateResources() + { + $this->mockConfigurations(); + $this->mockViewsNamespace(); + $this->mockFilesystem(); + + app(ResourceGenerator::class) + ->setModel('Post') + ->generate(); + + $this->rollbackToDefaultBasePath(); + + $this->assertGeneratedFileEquals('post_resource.php', 'app/Http/Resources/PostResource.php'); + $this->assertGeneratedFileEquals('post_collection_resource.php', 'app/Http/Resources/PostsCollectionResource.php'); + } +} diff --git a/tests/Support/Resource/ResourceMockTrait.php b/tests/Support/Resource/ResourceMockTrait.php new file mode 100644 index 00000000..bfcce4a4 --- /dev/null +++ b/tests/Support/Resource/ResourceMockTrait.php @@ -0,0 +1,63 @@ +mockClass(ResourceGenerator::class, [ + [ + 'method' => 'classExists', + 'arguments' => ['resources', 'PostResource'], + 'result' => true + ], + ]); + } + + public function mockGeneratorForAlreadyExistsCollectionResource(): void + { + $this->mockClass(ResourceGenerator::class, [ + [ + 'method' => 'generateResource', + 'arguments' => [], + 'result' => null + ], + [ + 'method' => 'classExists', + 'arguments' => ['resources', 'PostsCollectionResource'], + 'result' => true + ] + ]); + } + + public function mockConfigurations(): void + { + config([ + 'entity-generator.stubs.resource' => 'entity-generator::resource', + 'entity-generator.stubs.collection_resource' => 'entity-generator::collection_resource', + 'entity-generator.paths' => [ + 'resources' => 'app/Http/Resources', + ] + ]); + } + + public function mockFilesystem(): void + { + $structure = [ + 'app' => [ + 'Http' => [ + 'Resources' => [], + ], + ], + ]; + + vfsStream::create($structure); + } +} diff --git a/tests/fixtures/ResourceGeneratorTest/post_collection_resource.php b/tests/fixtures/ResourceGeneratorTest/post_collection_resource.php new file mode 100644 index 00000000..0f3a23ff --- /dev/null +++ b/tests/fixtures/ResourceGeneratorTest/post_collection_resource.php @@ -0,0 +1,10 @@ + Date: Fri, 10 Jan 2025 22:28:11 +0600 Subject: [PATCH 2/4] feat: add tests refs: https://github.com/RonasIT/laravel-entity-generator/issues/49 --- tests/ResourceGeneratorTest.php | 91 ++++++++++++++++--- tests/Support/Resource/ResourceMockTrait.php | 38 +------- .../post_collection_resource.php | 4 +- .../ResourceGeneratorTest/post_resource.php | 10 +- 4 files changed, 94 insertions(+), 49 deletions(-) diff --git a/tests/ResourceGeneratorTest.php b/tests/ResourceGeneratorTest.php index 90881a00..70b6c806 100644 --- a/tests/ResourceGeneratorTest.php +++ b/tests/ResourceGeneratorTest.php @@ -2,6 +2,9 @@ namespace RonasIT\Support\Tests; +use Illuminate\Support\Facades\Event; +use RonasIT\Support\Events\SuccessCreateMessage; +use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\ClassAlreadyExistsException; use RonasIT\Support\Generators\ResourceGenerator; use RonasIT\Support\Tests\Support\Resource\ResourceMockTrait; @@ -10,12 +13,23 @@ class ResourceGeneratorTest extends TestCase { use ResourceMockTrait; + public function setUp(): void + { + parent::setUp(); + + Event::fake(); + } + public function testResourceAlreadyExists() { - $this->mockGeneratorForAlreadyExistsResource(); + $this->mockClass(ResourceGenerator::class, [ + $this->classExistsMethodCall(['resources', 'PostResource']), + ]); - $this->expectException(ClassAlreadyExistsException::class); - $this->expectErrorMessage('Cannot create PostResource cause PostResource already exists. Remove PostResource.'); + $this->assertExceptionThrew( + className: ClassAlreadyExistsException::class, + message: 'Cannot create PostResource cause PostResource already exists. Remove PostResource.', + ); app(ResourceGenerator::class) ->setModel('Post') @@ -24,30 +38,83 @@ public function testResourceAlreadyExists() public function testCollectionResourceAlreadyExists() { - $this->mockGeneratorForAlreadyExistsCollectionResource(); + $this->mockClass(ResourceGenerator::class, [ + $this->classExistsMethodCall(['resources', 'PostResource'], false), + $this->classExistsMethodCall(['resources', 'PostsCollectionResource']), + ]); - $this->expectException(ClassAlreadyExistsException::class); - $this->expectErrorMessage('Cannot create PostsCollectionResource cause PostsCollectionResource already exists. ' - . 'Remove PostsCollectionResource.'); + $this->assertExceptionThrew( + className: ClassAlreadyExistsException::class, + message: 'Cannot create PostsCollectionResource cause PostsCollectionResource already exists. ' + . 'Remove PostsCollectionResource.', + ); app(ResourceGenerator::class) ->setModel('Post') ->generate(); + + $this->assertGeneratedFileEquals('post_resource.php', 'app/Http/Resources/Post/PostResource.php'); + + $this->assertEventPushed( + className: SuccessCreateMessage::class, + message: 'Created a new Resource: PostResource', + ); } public function testCreateResources() { - $this->mockConfigurations(); - $this->mockViewsNamespace(); $this->mockFilesystem(); app(ResourceGenerator::class) ->setModel('Post') ->generate(); - $this->rollbackToDefaultBasePath(); + $this->assertGeneratedFileEquals('post_resource.php', 'app/Http/Resources/Post/PostResource.php'); + $this->assertGeneratedFileEquals('post_collection_resource.php', 'app/Http/Resources/Post/PostsCollectionResource.php'); + + $this->assertEventPushedChain([ + SuccessCreateMessage::class => [ + 'Created a new Resource: PostResource', + 'Created a new CollectionResource: PostsCollectionResource', + ], + ]); + } + + public function testCreateResourcesResourceStubNotExist() + { + config(['entity-generator.stubs.resource' => 'incorrect_stub']); + + $this->mockFilesystem(); + + app(ResourceGenerator::class) + ->setModel('Post') + ->generate(); + + $this->assertFileDoesNotExist('app/Http/Resources/Post/PostResource.php'); + $this->assertFileDoesNotExist('app/Http/Resources/Post/PostsCollectionResource.php'); + + $this->assertEventPushed( + className: WarningEvent::class, + message: 'Generation of resource has been skipped cause the view incorrect_stub from the config entity-generator.stubs.resource is not exists. Please check that config has the correct view name value.', + ); + } + + public function testCreateResourcesCollectionResourceStubNotExist() + { + config(['entity-generator.stubs.collection_resource' => 'incorrect_stub']); + + $this->mockFilesystem(); + + app(ResourceGenerator::class) + ->setModel('Post') + ->generate(); + + $this->assertGeneratedFileEquals('post_resource.php', 'app/Http/Resources/Post/PostResource.php'); + $this->assertFileDoesNotExist('app/Http/Resources/Post/PostsCollectionResource.php'); - $this->assertGeneratedFileEquals('post_resource.php', 'app/Http/Resources/PostResource.php'); - $this->assertGeneratedFileEquals('post_collection_resource.php', 'app/Http/Resources/PostsCollectionResource.php'); + $this->assertEventPushedChain([ + SuccessCreateMessage::class => ['Created a new Resource: PostResource'], + WarningEvent::class => ['Generation of collection resource has been skipped cause the view incorrect_stub from the config entity-generator.stubs.collection_resource is not exists. Please check that config has the correct view name value.'], + ]); } } diff --git a/tests/Support/Resource/ResourceMockTrait.php b/tests/Support/Resource/ResourceMockTrait.php index bfcce4a4..eb415bf3 100644 --- a/tests/Support/Resource/ResourceMockTrait.php +++ b/tests/Support/Resource/ResourceMockTrait.php @@ -3,48 +3,20 @@ namespace RonasIT\Support\Tests\Support\Resource; use org\bovigo\vfs\vfsStream; -use RonasIT\Support\Generators\ResourceGenerator; -use RonasIT\Support\Tests\Support\Shared\GeneratorMockTrait; +use RonasIT\Support\Tests\Support\GeneratorMockTrait; +use RonasIT\Support\Traits\MockTrait; trait ResourceMockTrait { - use GeneratorMockTrait; - - public function mockGeneratorForAlreadyExistsResource(): void - { - $this->mockClass(ResourceGenerator::class, [ - [ - 'method' => 'classExists', - 'arguments' => ['resources', 'PostResource'], - 'result' => true - ], - ]); - } - - public function mockGeneratorForAlreadyExistsCollectionResource(): void - { - $this->mockClass(ResourceGenerator::class, [ - [ - 'method' => 'generateResource', - 'arguments' => [], - 'result' => null - ], - [ - 'method' => 'classExists', - 'arguments' => ['resources', 'PostsCollectionResource'], - 'result' => true - ] - ]); - } + use GeneratorMockTrait, MockTrait; public function mockConfigurations(): void { config([ - 'entity-generator.stubs.resource' => 'entity-generator::resource', - 'entity-generator.stubs.collection_resource' => 'entity-generator::collection_resource', 'entity-generator.paths' => [ 'resources' => 'app/Http/Resources', - ] + 'models' => 'app/Models', + ], ]); } diff --git a/tests/fixtures/ResourceGeneratorTest/post_collection_resource.php b/tests/fixtures/ResourceGeneratorTest/post_collection_resource.php index 0f3a23ff..92aba332 100644 --- a/tests/fixtures/ResourceGeneratorTest/post_collection_resource.php +++ b/tests/fixtures/ResourceGeneratorTest/post_collection_resource.php @@ -1,10 +1,10 @@ Date: Fri, 10 Jan 2025 22:42:45 +0600 Subject: [PATCH 3/4] refactor: code refs: https://github.com/RonasIT/laravel-entity-generator/issues/49 --- tests/ResourceGeneratorTest.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/ResourceGeneratorTest.php b/tests/ResourceGeneratorTest.php index 70b6c806..3c6f8539 100644 --- a/tests/ResourceGeneratorTest.php +++ b/tests/ResourceGeneratorTest.php @@ -2,7 +2,6 @@ namespace RonasIT\Support\Tests; -use Illuminate\Support\Facades\Event; use RonasIT\Support\Events\SuccessCreateMessage; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\ClassAlreadyExistsException; @@ -13,13 +12,6 @@ class ResourceGeneratorTest extends TestCase { use ResourceMockTrait; - public function setUp(): void - { - parent::setUp(); - - Event::fake(); - } - public function testResourceAlreadyExists() { $this->mockClass(ResourceGenerator::class, [ From 762b19251c6c53372070dddeff14a0820c831859 Mon Sep 17 00:00:00 2001 From: roman Date: Fri, 17 Jan 2025 15:52:51 +0600 Subject: [PATCH 4/4] refactor: tests refs: https://github.com/RonasIT/laravel-entity-generator/issues/49 --- tests/ResourceGeneratorTest.php | 10 ++---- tests/Support/Resource/ResourceMockTrait.php | 35 -------------------- 2 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 tests/Support/Resource/ResourceMockTrait.php diff --git a/tests/ResourceGeneratorTest.php b/tests/ResourceGeneratorTest.php index 3c6f8539..d03f9b58 100644 --- a/tests/ResourceGeneratorTest.php +++ b/tests/ResourceGeneratorTest.php @@ -6,11 +6,11 @@ use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\ClassAlreadyExistsException; use RonasIT\Support\Generators\ResourceGenerator; -use RonasIT\Support\Tests\Support\Resource\ResourceMockTrait; +use RonasIT\Support\Tests\Support\GeneratorMockTrait; class ResourceGeneratorTest extends TestCase { - use ResourceMockTrait; + use GeneratorMockTrait; public function testResourceAlreadyExists() { @@ -55,8 +55,6 @@ className: SuccessCreateMessage::class, public function testCreateResources() { - $this->mockFilesystem(); - app(ResourceGenerator::class) ->setModel('Post') ->generate(); @@ -76,8 +74,6 @@ public function testCreateResourcesResourceStubNotExist() { config(['entity-generator.stubs.resource' => 'incorrect_stub']); - $this->mockFilesystem(); - app(ResourceGenerator::class) ->setModel('Post') ->generate(); @@ -95,8 +91,6 @@ public function testCreateResourcesCollectionResourceStubNotExist() { config(['entity-generator.stubs.collection_resource' => 'incorrect_stub']); - $this->mockFilesystem(); - app(ResourceGenerator::class) ->setModel('Post') ->generate(); diff --git a/tests/Support/Resource/ResourceMockTrait.php b/tests/Support/Resource/ResourceMockTrait.php deleted file mode 100644 index eb415bf3..00000000 --- a/tests/Support/Resource/ResourceMockTrait.php +++ /dev/null @@ -1,35 +0,0 @@ - [ - 'resources' => 'app/Http/Resources', - 'models' => 'app/Models', - ], - ]); - } - - public function mockFilesystem(): void - { - $structure = [ - 'app' => [ - 'Http' => [ - 'Resources' => [], - ], - ], - ]; - - vfsStream::create($structure); - } -}