From 150d5afdecb1fd067aac2137a39e75fca80be24d Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 2 Jan 2025 10:49:56 -0500 Subject: [PATCH] PHP 8.4 Support + Laravel Pint (#33) * build: support php8.4 * build: add laravel pint * chore: pint files --- .github/workflows/tests.yml | 8 +- composer.json | 5 +- src/Formatting/FormatDefinition.php | 8 +- src/Formatting/FormatManager.php | 22 ++-- src/Resource.php | 7 +- src/ResourceCollection.php | 6 +- tests/TestCase.php | 5 +- .../Unit/AnonymousResourceCollectionTest.php | 39 ++++--- tests/Unit/Enhancements/ExceptTest.php | 14 ++- tests/Unit/Enhancements/OnlyTest.php | 14 ++- .../Unit/Formatting/FormatDefinitionTest.php | 24 ++-- tests/Unit/Formatting/FormatManagerTest.php | 105 +++++++++++------- tests/Unit/ResourceCollectionTest.php | 61 +++++----- tests/Unit/ResourceTest.php | 62 ++++++----- .../Resourceable/ConvertsToResourceTest.php | 15 +-- 15 files changed, 227 insertions(+), 168 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 90a0d73..835f2ab 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,7 +7,7 @@ jobs: strategy: fail-fast: true matrix: - php: [8.1, 8.2, 8.3] + php: [8.1, 8.2, 8.3, 8.4] stability: ["--prefer-lowest", "--prefer-stable"] name: PHP ${{ matrix.php }} - ${{ matrix.stability }} steps: @@ -31,11 +31,13 @@ jobs: with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-${{ matrix.php }}-${{ matrix.stability }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: | - ${{ runner.os }}-${{ matrix.php }}-${{ matrix.stability }}-composer- + restore-keys: ${{ runner.os }}-${{ matrix.php }}-${{ matrix.stability }}-composer- - name: Install dependencies run: composer update ${{ matrix.stability }} --prefer-dist --no-interaction --no-suggest + - name: Run style check + run: vendor/bin/pint --test + - name: Execute tests run: vendor/bin/phpunit diff --git a/composer.json b/composer.json index 9ee8dd7..85e9814 100644 --- a/composer.json +++ b/composer.json @@ -20,11 +20,12 @@ } }, "require": { - "php": "^8.1", + "php": "^8.1||^8.2||^8.3||^8.4", "laravel/framework": "^10.0|^11.0" }, "require-dev": { "orchestra/testbench": "^8.0|^9.0", - "phpunit/phpunit": "^10.0|^11.0" + "phpunit/phpunit": "^10.0|^11.0", + "laravel/pint": "^1.19" } } diff --git a/src/Formatting/FormatDefinition.php b/src/Formatting/FormatDefinition.php index bd62ab4..0aca0f6 100644 --- a/src/Formatting/FormatDefinition.php +++ b/src/Formatting/FormatDefinition.php @@ -13,7 +13,9 @@ class FormatDefinition { protected Collection $formats; + protected bool $isExplicitlyDefault; + protected ReflectionMethod $reflection; public function __construct(ReflectionMethod $reflection) @@ -21,8 +23,8 @@ public function __construct(ReflectionMethod $reflection) $this->reflection = $reflection; $this->formats = (new Collection($this->reflection->getAttributes(Format::class))) - ->map(fn(ReflectionAttribute $attribute) => $attribute->newInstance()); - $this->isExplicitlyDefault = !empty($this->reflection->getAttributes(IsDefault::class)); + ->map(fn (ReflectionAttribute $attribute) => $attribute->newInstance()); + $this->isExplicitlyDefault = ! empty($this->reflection->getAttributes(IsDefault::class)); } public function invoke(object $object, $request): mixed @@ -42,7 +44,7 @@ public function name(): string public function names(): Collection { - return $this->formats->map(fn(Format $format) => $format->name() ?? $this->reflection->getName()) + return $this->formats->map(fn (Format $format) => $format->name() ?? $this->reflection->getName()) ->unique(); } diff --git a/src/Formatting/FormatManager.php b/src/Formatting/FormatManager.php index 604c1a3..d287c3d 100644 --- a/src/Formatting/FormatManager.php +++ b/src/Formatting/FormatManager.php @@ -16,9 +16,13 @@ class FormatManager { protected ?string $current; + protected ?FormatDefinition $default; + protected Collection $formats; + protected ReflectionObject $reflection; + protected object $subject; public function __construct(object $subject) @@ -27,13 +31,13 @@ public function __construct(object $subject) $this->subject = $subject; $definitions = (new Collection($this->reflection->getMethods())) - ->filter(fn(ReflectionMethod $method) => !empty($method->getAttributes(Format::class))) + ->filter(fn (ReflectionMethod $method) => ! empty($method->getAttributes(Format::class))) ->mapInto(FormatDefinition::class); $this->formats = $definitions ->tap(Closure::fromCallable([$this, 'preventFormatNameCollisions'])) - ->flatMap(fn(FormatDefinition $definition) => $definition->names() - ->mapWithKeys(fn(string $name) => [$name => $definition])); + ->flatMap(fn (FormatDefinition $definition) => $definition->names() + ->mapWithKeys(fn (string $name) => [$name => $definition])); $this->default = $this->determineDefault($definitions); @@ -67,7 +71,7 @@ public function hasFormat(string $name): bool public function lacksFormat(string $name): bool { - return !$this->hasFormat($name); + return ! $this->hasFormat($name); } public function select(string $name): static @@ -87,7 +91,7 @@ protected function determineDefault(Collection $definitions): ?FormatDefinition return $definitions->first(); } - $definitions = $definitions->filter(fn(FormatDefinition $definition) => $definition->isExplicitlyDefault()); + $definitions = $definitions->filter(fn (FormatDefinition $definition) => $definition->isExplicitlyDefault()); $class = $this->reflection; do { @@ -99,17 +103,17 @@ protected function determineDefault(Collection $definitions): ?FormatDefinition ->first(); $class = $class->getParentClass(); - } while($class && $default === null); + } while ($class && $default === null); return $default; } protected function preventFormatNameCollisions(Collection $formatMethods): void { - $formatMethods->flatMap(fn(FormatDefinition $definition) => $definition->names()) + $formatMethods->flatMap(fn (FormatDefinition $definition) => $definition->names()) ->countBy() - ->filter(fn(int $count) => $count > 1) - ->whenNotEmpty(fn(Collection $collisions) => throw new FormatNameCollisionException( + ->filter(fn (int $count) => $count > 1) + ->whenNotEmpty(fn (Collection $collisions) => throw new FormatNameCollisionException( $this->subject, $collisions->keys()->first(), )); diff --git a/src/Resource.php b/src/Resource.php index 4b17171..f5e8f42 100644 --- a/src/Resource.php +++ b/src/Resource.php @@ -16,6 +16,7 @@ abstract class Resource extends JsonResource use SetsResponseStatus; protected FormatManager $formatManager; + protected Collection $modifications; public function __construct($resource) @@ -48,8 +49,8 @@ public function format(string $name): static public function modify(callable|array $modification): static { - $modification = !is_callable($modification) - ? fn(array $data) => array_merge($data, $modification) + $modification = ! is_callable($modification) + ? fn (array $data) => array_merge($data, $modification) : $modification; $this->modifications->push($modification); @@ -62,6 +63,6 @@ public function toArray($request) $currentFormat = $this->formatManager->current() ?? throw new NoFormatSelectedException($this); $data = $currentFormat->invoke($this, $request); - return $this->modifications->reduce(fn($carry, $modification) => $modification($carry, $this), $data); + return $this->modifications->reduce(fn ($carry, $modification) => $modification($carry, $this), $data); } } diff --git a/src/ResourceCollection.php b/src/ResourceCollection.php index 06ed661..0104257 100644 --- a/src/ResourceCollection.php +++ b/src/ResourceCollection.php @@ -20,7 +20,7 @@ public function __construct($resource) { parent::__construct($resource); - if (!is_a($this->collects, Resource::class, true)) { + if (! is_a($this->collects, Resource::class, true)) { throw new CannotEnhanceBaseResourcesException($this->collects); } } @@ -28,7 +28,7 @@ public function __construct($resource) public function __call($method, $parameters): mixed { if ((new ReflectionClass($this->collects))->hasMethod($method)) { - $this->collection->map(fn(Resource $resource) => $resource->{$method}(...$parameters)); + $this->collection->map(fn (Resource $resource) => $resource->{$method}(...$parameters)); return $this; } @@ -38,7 +38,7 @@ public function __call($method, $parameters): mixed public function format(string $name): static { - $this->collection->each(fn(Resource $resource) => $resource->format($name)); + $this->collection->each(fn (Resource $resource) => $resource->format($name)); return $this; } diff --git a/tests/TestCase.php b/tests/TestCase.php index 1c65387..e33095f 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -6,7 +6,4 @@ use Orchestra\Testbench\TestCase as OrchestraTestCase; -class TestCase extends OrchestraTestCase -{ - -} +class TestCase extends OrchestraTestCase {} diff --git a/tests/Unit/AnonymousResourceCollectionTest.php b/tests/Unit/AnonymousResourceCollectionTest.php index 57c3fe7..cce8d50 100644 --- a/tests/Unit/AnonymousResourceCollectionTest.php +++ b/tests/Unit/AnonymousResourceCollectionTest.php @@ -19,10 +19,10 @@ public function test_anonymous_collection_records_are_formatted_correctly( AnonymousResourceCollection $collection, array $expectedData ): void { - # Act + // Act $actualData = $collection->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } @@ -31,16 +31,16 @@ public function test_anonymous_collection_can_be_modified_dynamically( ResourceCollection $resource, array $expectedData, ): void { - # Act + // Act $actualData = $resource->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } public function test_response_status_can_be_set(): void { - # Arrange + // Arrange $john = new stdClass; $john->id = 1; $john->firstName = 'John'; @@ -53,14 +53,14 @@ public function test_response_status_can_be_set(): void $collection = ImplicitDefaultResource::collection([$john, $jane]); - # Act + // Act $response = $collection->setResponseStatus(201)->response(); - # Assert + // Assert $this->assertSame(201, $response->getStatusCode()); } - # region Data Providers + // region Data Providers public static function formatProvider(): array { @@ -176,7 +176,7 @@ public static function modificationProvider(): array ], 'closure modification adding data' => [ 'resource' => ImplicitDefaultResource::collection([$john, $jane]) - ->modify(fn(array $data) => array_merge($data, ['middle_initial' => 'A.'])), + ->modify(fn (array $data) => array_merge($data, ['middle_initial' => 'A.'])), 'expectedData' => [ [ 'first_name' => 'John', @@ -194,7 +194,7 @@ public static function modificationProvider(): array ], 'closure modification overwriting data' => [ 'resource' => ImplicitDefaultResource::collection([$john, $jane]) - ->modify(fn(array $data) => array_merge($data, ['first_name' => 'Jon'])), + ->modify(fn (array $data) => array_merge($data, ['first_name' => 'Jon'])), 'expectedData' => [ [ 'first_name' => 'Jon', @@ -210,7 +210,7 @@ public static function modificationProvider(): array ], 'closure modification completely overwriting data' => [ 'resource' => ImplicitDefaultResource::collection([$john, $jane]) - ->modify(fn() => ['id' => 1]), + ->modify(fn () => ['id' => 1]), 'expectedData' => [ ['id' => 1], ['id' => 1], @@ -238,7 +238,8 @@ public static function modificationProvider(): array ], 'invokable modification adding data' => [ 'resource' => ImplicitDefaultResource::collection([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return array_merge($data, ['middle_initial' => 'A.']); @@ -261,7 +262,8 @@ public function __invoke(array $data): array ], 'invokable modification overwriting data' => [ 'resource' => ImplicitDefaultResource::collection([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return array_merge($data, ['first_name' => 'Jon']); @@ -282,7 +284,8 @@ public function __invoke(array $data): array ], 'invokable modification completely overwriting data' => [ 'resource' => ImplicitDefaultResource::collection([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return ['id' => 1]; @@ -295,7 +298,8 @@ public function __invoke(array $data): array ], 'invokable modification accessing resource' => [ 'resource' => ImplicitDefaultResource::collection([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -324,7 +328,8 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array return $data; }) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -350,5 +355,5 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array ]; } - # endregion + // endregion } diff --git a/tests/Unit/Enhancements/ExceptTest.php b/tests/Unit/Enhancements/ExceptTest.php index 6ec7dfc..58800fc 100644 --- a/tests/Unit/Enhancements/ExceptTest.php +++ b/tests/Unit/Enhancements/ExceptTest.php @@ -18,20 +18,21 @@ public function test_except_enhancement_can_be_applied_to_resources( Resource $resource, array $expectedData, ): void { - # Act + // Act $actualData = $resource->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } - # region Data Providers + // region Data Providers public static function resourceProvider(): array { return [ 'applied manually' => [ - 'resource' => (new class(null) extends Resource { + 'resource' => (new class(null) extends Resource + { #[Format] public function foo(): array { @@ -48,7 +49,8 @@ public function foo(): array ], ], 'applied via trait' => [ - 'resource' => (new class(null) extends Resource { + 'resource' => (new class(null) extends Resource + { use HasExceptEnhancement; #[Format] @@ -69,5 +71,5 @@ public function foo(): array ]; } - # endregion + // endregion } diff --git a/tests/Unit/Enhancements/OnlyTest.php b/tests/Unit/Enhancements/OnlyTest.php index 829bc08..b303166 100644 --- a/tests/Unit/Enhancements/OnlyTest.php +++ b/tests/Unit/Enhancements/OnlyTest.php @@ -18,20 +18,21 @@ public function test_only_enhancement_can_be_applied_to_resources( Resource $resource, array $expectedData, ): void { - # Act + // Act $actualData = $resource->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } - # region Data Providers + // region Data Providers public static function resourceProvider(): array { return [ 'applied manually' => [ - 'resource' => (new class(null) extends Resource { + 'resource' => (new class(null) extends Resource + { #[Format] public function foo(): array { @@ -47,7 +48,8 @@ public function foo(): array ], ], 'applied via trait' => [ - 'resource' => (new class(null) extends Resource { + 'resource' => (new class(null) extends Resource + { use HasOnlyEnhancement; #[Format] @@ -67,5 +69,5 @@ public function foo(): array ]; } - # endregion + // endregion } diff --git a/tests/Unit/Formatting/FormatDefinitionTest.php b/tests/Unit/Formatting/FormatDefinitionTest.php index 5829a5b..5e75f47 100644 --- a/tests/Unit/Formatting/FormatDefinitionTest.php +++ b/tests/Unit/Formatting/FormatDefinitionTest.php @@ -17,31 +17,32 @@ class FormatDefinitionTest extends TestCase #[DataProvider('nameDetectionProvider')] public function test_name_is_properly_detected(ReflectionMethod $method, Closure $assertions): void { - # Act + // Act $definition = new FormatDefinition($method); - # Assert + // Assert $assertions($definition); } #[DataProvider('defaultDetectionProvider')] public function test_explicit_default_is_properly_detected(ReflectionMethod $method, bool $expected): void { - # Arrange + // Arrange $definition = new FormatDefinition($method); - # Act + // Act $actual = $definition->isExplicitlyDefault(); - # Assert + // Assert $this->assertSame($expected, $actual); } - # region Data Providers + // region Data Providers public static function defaultDetectionProvider(): array { - $subject = new class { + $subject = new class + { #[Format('bar')] public function barFormat() {} @@ -63,7 +64,8 @@ public function foo() {} public static function nameDetectionProvider(): array { - $subject = new class { + $subject = new class + { #[Format('bar')] public function barFormat() {} @@ -82,16 +84,16 @@ public function foo() {} 'method' => new ReflectionMethod($subject, 'barFormat'), 'assertions' => function (FormatDefinition $definition) { static::assertSame('bar', $definition->name()); - } + }, ], 'alias' => [ 'method' => new ReflectionMethod($subject, 'foo'), 'assertions' => function (FormatDefinition $definition) { static::assertContains('fooAlias', $definition->names()); - } + }, ], ]; } - # endregion + // endregion } diff --git a/tests/Unit/Formatting/FormatManagerTest.php b/tests/Unit/Formatting/FormatManagerTest.php index c7c2337..fa1e0d5 100644 --- a/tests/Unit/Formatting/FormatManagerTest.php +++ b/tests/Unit/Formatting/FormatManagerTest.php @@ -19,8 +19,9 @@ class FormatManagerTest extends TestCase { public function test_formats_are_detected_correctly(): void { - # Arrange - $subject = new class { + // Arrange + $subject = new class + { #[Format('bar')] public function barFormat() {} @@ -28,10 +29,10 @@ public function barFormat() {} public function foo() {} }; - # Act + // Act $formats = (new FormatManager($subject))->formats(); - # Assert + // Assert $this->assertContainsOnlyInstancesOf(FormatDefinition::class, $formats); $this->assertSame(['bar', 'foo', 'fooAlias'], $formats->keys()->all()); } @@ -39,30 +40,31 @@ public function foo() {} #[DataProvider('formatNameCollisionProvider')] public function test_format_name_collisions_are_prevented(object $subject): void { - # Expect + // Expect $this->expectException(FormatNameCollisionException::class); - # Act + // Act new FormatManager($subject); } #[DataProvider('defaultFormatProvider')] public function test_default_format_is_detected_properly(object $subject, string $expectedFormat): void { - # Act + // Act $manager = new FormatManager($subject); - # Assert + // Assert $this->assertSame($expectedFormat, $manager->default()->name()); } public function test_multiple_default_formats_are_prevented(): void { - # Expect + // Expect $this->expectException(MultipleDefaultFormatsException::class); - # Arrange - $subject = new class { + // Arrange + $subject = new class + { #[IsDefault, Format] public function bar() {} @@ -70,18 +72,18 @@ public function bar() {} public function foo() {} }; - # Act + // Act new FormatManager($subject); } #[DataProvider('currentFormatProvider')] public function test_current_format_can_be_set_and_retrieved(Closure $setup, string $expectedFormat): void { - # Act + // Act /** @var FormatManager $manager */ $manager = $setup(); - # Assert + // Assert $this->assertSame($expectedFormat, $manager->currentName()); $this->assertContains($expectedFormat, $manager->current()->names()); } @@ -89,58 +91,61 @@ public function test_current_format_can_be_set_and_retrieved(Closure $setup, str #[DataProvider('formatExistenceProvider')] public function test_checking_for_a_formats_existence(object $subject, string $formatName, bool $expectedResult): void { - # Arrange + // Arrange $manager = new FormatManager($subject); - # Act + // Act $actualResult = $manager->hasFormat($formatName); - # Assert + // Assert $this->assertSame($expectedResult, $actualResult); } #[DataProvider('formatExistenceProvider')] public function test_checking_for_a_formats_non_existence(object $subject, string $formatName, bool $expectedResult): void { - # Arrange + // Arrange $manager = new FormatManager($subject); - # Act + // Act $actualResult = $manager->lacksFormat($formatName); - # Assert - $this->assertSame(!$expectedResult, $actualResult); + // Assert + $this->assertSame(! $expectedResult, $actualResult); } public function test_selecting_a_non_existent_format_fails(): void { - # Expect + // Expect $this->expectException(InvalidFormatException::class); - # Arrange - $manager = new FormatManager(new class { + // Arrange + $manager = new FormatManager(new class + { #[Format] public function foo() {} }); - # Act + // Act $manager->select('bar'); } - # region Data Providers + // region Data Providers public static function currentFormatProvider(): array { return [ 'implicit default is used as the initial current format' => [ - fn() => new FormatManager(new class { + fn () => new FormatManager(new class + { #[Format] public function foo() {} }), 'foo', ], 'explicit default is used as the initial current format' => [ - fn() => new FormatManager(new class { + fn () => new FormatManager(new class + { #[Format] public function bar() {} @@ -150,7 +155,8 @@ public function foo() {} 'foo', ], 'selected by implicit name' => [ - fn() => (new FormatManager(new class { + fn () => (new FormatManager(new class + { #[Format] public function bar() {} @@ -160,7 +166,8 @@ public function foo() {} 'bar', ], 'selected by explicit name' => [ - fn() => (new FormatManager(new class { + fn () => (new FormatManager(new class + { #[Format('foobar')] public function bar() {} @@ -170,7 +177,8 @@ public function foo() {} 'foobar', ], 'selected by alias' => [ - fn() => (new FormatManager(new class { + fn () => (new FormatManager(new class + { #[Format, Format('foobar')] public function bar() {} @@ -186,14 +194,16 @@ public static function defaultFormatProvider(): array { return [ 'implicit default' => [ - 'subject' => new class { + 'subject' => new class + { #[Format] public function foo() {} }, 'expectedFormat' => 'foo', ], 'explicit default' => [ - 'subject' => new class { + 'subject' => new class + { #[Format] public function bar() {} @@ -207,7 +217,8 @@ public function foo() {} 'expectedFormat' => 'foo', ], 'overridden default' => [ - 'subject' => new class extends ParentClass { + 'subject' => new class extends ParentClass + { #[IsDefault, Format] public function bar() {} }, @@ -220,7 +231,8 @@ public static function formatExistenceProvider(): array { return [ 'implicit format exists' => [ - 'subject' => new class { + 'subject' => new class + { #[Format] public function foo() {} }, @@ -228,7 +240,8 @@ public function foo() {} 'expectedResult' => true, ], 'explicit format exists' => [ - 'subject' => new class { + 'subject' => new class + { #[Format('foobar')] public function foo() {} }, @@ -236,7 +249,8 @@ public function foo() {} 'expectedResult' => true, ], 'alias format exists' => [ - 'subject' => new class { + 'subject' => new class + { #[Format, Format('foobar')] public function foo() {} }, @@ -244,7 +258,8 @@ public function foo() {} 'expectedResult' => true, ], 'implicit name does not exist if only explicitly named' => [ - 'subject' => new class { + 'subject' => new class + { #[Format('foobar')] public function foo() {} }, @@ -252,7 +267,8 @@ public function foo() {} 'expectedResult' => false, ], 'non-existent format does not exist' => [ - 'subject' => new class { + 'subject' => new class + { #[Format] public function foo() {} }, @@ -266,7 +282,8 @@ public static function formatNameCollisionProvider(): array { return [ 'explicit/explicit' => [ - 'subject' => new class { + 'subject' => new class + { #[Format('foo')] public function formatOne() {} @@ -275,7 +292,8 @@ public function formatTwo() {} }, ], 'explicit/implicit' => [ - 'subject' => new class { + 'subject' => new class + { #[Format] public function foo() {} @@ -286,10 +304,11 @@ public function formatTwo() {} ]; } - # endregion + // endregion } -class ParentClass { +class ParentClass +{ #[IsDefault, Format] public function foo() {} } diff --git a/tests/Unit/ResourceCollectionTest.php b/tests/Unit/ResourceCollectionTest.php index 45e223e..b7a21b7 100644 --- a/tests/Unit/ResourceCollectionTest.php +++ b/tests/Unit/ResourceCollectionTest.php @@ -23,20 +23,21 @@ public function test_collection_records_are_formatted_correctly( ResourceCollection $collection, array $expectedData ): void { - # Act + // Act $actualData = $collection->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } public function test_exception_is_thrown_if_collecting_non_enhanced_resource(): void { - # Expect + // Expect $this->expectException(CannotEnhanceBaseResourcesException::class); - # Act - new class([]) extends ResourceCollection { + // Act + new class([]) extends ResourceCollection + { public $collects = JsonResource::class; }; } @@ -46,16 +47,16 @@ public function test_resource_collection_can_be_modified_dynamically( ResourceCollection $resource, array $expectedData, ): void { - # Act + // Act $actualData = $resource->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } public function test_response_status_can_be_set(): void { - # Arrange + // Arrange $john = new stdClass; $john->id = 1; $john->firstName = 'John'; @@ -68,14 +69,14 @@ public function test_response_status_can_be_set(): void $collection = new ImplicitDefaultCollection([$john, $jane]); - # Act + // Act $response = $collection->setResponseStatus(201)->response(); - # Assert + // Assert $this->assertSame(201, $response->getStatusCode()); } - # region Data Providers + // region Data Providers public static function formatProvider(): array { @@ -91,7 +92,8 @@ public static function formatProvider(): array return [ 'implicit default is used' => [ - 'collection' => new class([$john, $jane]) extends ResourceCollection { + 'collection' => new class([$john, $jane]) extends ResourceCollection + { public $collects = ImplicitDefaultResource::class; }, 'expectedData' => [ @@ -108,7 +110,8 @@ public static function formatProvider(): array ], ], 'explicit default is used' => [ - 'collection' => new class([$john, $jane]) extends ResourceCollection { + 'collection' => new class([$john, $jane]) extends ResourceCollection + { public $collects = ExplicitDefaultResource::class; }, 'expectedData' => [ @@ -125,7 +128,8 @@ public static function formatProvider(): array ], ], 'specified format is used' => [ - 'collection' => (new class([$john, $jane]) extends ResourceCollection { + 'collection' => (new class([$john, $jane]) extends ResourceCollection + { public $collects = ExplicitDefaultResource::class; })->format('bar'), 'expectedData' => [ @@ -197,7 +201,7 @@ public static function modificationProvider(): array ], 'closure modification adding data' => [ 'resource' => ImplicitDefaultCollection::make([$john, $jane]) - ->modify(fn(array $data) => array_merge($data, ['middle_initial' => 'A.'])), + ->modify(fn (array $data) => array_merge($data, ['middle_initial' => 'A.'])), 'expectedData' => [ [ 'first_name' => 'John', @@ -215,7 +219,7 @@ public static function modificationProvider(): array ], 'closure modification overwriting data' => [ 'resource' => ImplicitDefaultCollection::make([$john, $jane]) - ->modify(fn(array $data) => array_merge($data, ['first_name' => 'Jon'])), + ->modify(fn (array $data) => array_merge($data, ['first_name' => 'Jon'])), 'expectedData' => [ [ 'first_name' => 'Jon', @@ -231,7 +235,7 @@ public static function modificationProvider(): array ], 'closure modification completely overwriting data' => [ 'resource' => ImplicitDefaultCollection::make([$john, $jane]) - ->modify(fn() => ['id' => 1]), + ->modify(fn () => ['id' => 1]), 'expectedData' => [ ['id' => 1], ['id' => 1], @@ -259,7 +263,8 @@ public static function modificationProvider(): array ], 'invokable modification adding data' => [ 'resource' => ImplicitDefaultCollection::make([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return array_merge($data, ['middle_initial' => 'A.']); @@ -282,7 +287,8 @@ public function __invoke(array $data): array ], 'invokable modification overwriting data' => [ 'resource' => ImplicitDefaultCollection::make([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return array_merge($data, ['first_name' => 'Jon']); @@ -303,7 +309,8 @@ public function __invoke(array $data): array ], 'invokable modification completely overwriting data' => [ 'resource' => ImplicitDefaultCollection::make([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return ['id' => 1]; @@ -316,7 +323,8 @@ public function __invoke(array $data): array ], 'invokable modification accessing resource' => [ 'resource' => ImplicitDefaultCollection::make([$john, $jane]) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -345,7 +353,8 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array return $data; }) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -376,7 +385,8 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array return $data; }) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -407,7 +417,8 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array return $data; }) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -433,5 +444,5 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array ]; } - # endregion + // endregion } diff --git a/tests/Unit/ResourceTest.php b/tests/Unit/ResourceTest.php index 13a86c8..db2e927 100644 --- a/tests/Unit/ResourceTest.php +++ b/tests/Unit/ResourceTest.php @@ -19,29 +19,30 @@ class ResourceTest extends TestCase #[DataProvider('formatProvider')] public function test_resource_is_formatted_correctly(Resource $resource, array $expectedData): void { - # Act + // Act $actualData = $resource->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } public function test_exception_is_thrown_if_no_formats_are_defined(): void { - # Expect + // Expect $this->expectException(NoDefinedFormatsException::class); - # Act + // Act new class(null) extends Resource {}; } public function test_exception_is_thrown_if_no_format_is_selected(): void { - # Expect + // Expect $this->expectException(NoFormatSelectedException::class); - # Act - (new class(null) extends Resource { + // Act + (new class(null) extends Resource + { #[Format] public function bar() {} @@ -53,35 +54,37 @@ public function foo() {} #[DataProvider('modificationProvider')] public function test_resource_can_be_modified_dynamically(Resource $resource, array $expectedData): void { - # Act + // Act $actualData = $resource->toArray(request()); - # Assert + // Assert $this->assertSame($expectedData, $actualData); } public function test_response_status_can_be_set(): void { - # Arrange - $resource = (new class(null) extends Resource { + // Arrange + $resource = (new class(null) extends Resource + { #[Format] public function foo() {} }); - # Act + // Act $response = $resource->setResponseStatus(201)->response(); - # Assert + // Assert $this->assertSame(201, $response->getStatusCode()); } - # region Data Providers + // region Data Providers public static function formatProvider(): array { return [ 'implicit default is used' => [ - 'resource' => (new class(null) extends Resource { + 'resource' => (new class(null) extends Resource + { #[Format] public function foo(): array { @@ -99,7 +102,8 @@ public function foo(): array ], ], 'explicit default is used' => [ - 'resource' => (new class(null) extends Resource { + 'resource' => (new class(null) extends Resource + { #[Format] public function bar(): array { @@ -131,7 +135,8 @@ public function foo(): array ], ], 'explicitly selected format is used' => [ - 'resource' => (new class(null) extends Resource { + 'resource' => (new class(null) extends Resource + { #[Format] public function bar(): array { @@ -192,7 +197,7 @@ public static function modificationProvider(): array ], 'closure modification adding data' => [ 'resource' => ImplicitDefaultResource::make($john) - ->modify(fn(array $data) => array_merge($data, ['middle_initial' => 'A.'])), + ->modify(fn (array $data) => array_merge($data, ['middle_initial' => 'A.'])), 'expectedData' => [ 'first_name' => 'John', 'id' => 1, @@ -202,7 +207,7 @@ public static function modificationProvider(): array ], 'closure modification overwriting data' => [ 'resource' => ImplicitDefaultResource::make($john) - ->modify(fn(array $data) => array_merge($data, ['first_name' => 'Jon'])), + ->modify(fn (array $data) => array_merge($data, ['first_name' => 'Jon'])), 'expectedData' => [ 'first_name' => 'Jon', 'id' => 1, @@ -211,7 +216,7 @@ public static function modificationProvider(): array ], 'closure modification completely overwriting data' => [ 'resource' => ImplicitDefaultResource::make($john) - ->modify(fn() => ['id' => 1]), + ->modify(fn () => ['id' => 1]), 'expectedData' => ['id' => 1], ], 'closure modification accessing resource' => [ @@ -229,7 +234,8 @@ public static function modificationProvider(): array ], 'invokable modification adding data' => [ 'resource' => ImplicitDefaultResource::make($john) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return array_merge($data, ['middle_initial' => 'A.']); @@ -244,7 +250,8 @@ public function __invoke(array $data): array ], 'invokable modification overwriting data' => [ 'resource' => ImplicitDefaultResource::make($john) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return array_merge($data, ['first_name' => 'Jon']); @@ -258,7 +265,8 @@ public function __invoke(array $data): array ], 'invokable modification completely overwriting data' => [ 'resource' => ImplicitDefaultResource::make($john) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data): array { return ['id' => 1]; @@ -268,7 +276,8 @@ public function __invoke(array $data): array ], 'invokable modification accessing resource' => [ 'resource' => ImplicitDefaultResource::make($john) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -290,7 +299,8 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array return $data; }) - ->modify(new class { + ->modify(new class + { public function __invoke(array $data, ImplicitDefaultResource $resource): array { $data['id'] = $resource->resource->id * 2; @@ -308,5 +318,5 @@ public function __invoke(array $data, ImplicitDefaultResource $resource): array ]; } - # endregion + // endregion } diff --git a/tests/Unit/Resourceable/ConvertsToResourceTest.php b/tests/Unit/Resourceable/ConvertsToResourceTest.php index 16f136c..dfea825 100644 --- a/tests/Unit/Resourceable/ConvertsToResourceTest.php +++ b/tests/Unit/Resourceable/ConvertsToResourceTest.php @@ -14,27 +14,28 @@ class ConvertsToResourceTest extends TestCase { public function test_object_can_be_converted_to_a_resource(): void { - # Arrange + // Arrange $object = new ConvertibleObject(1, 'John', 'Doe'); - # Act + // Act $actualResource = $object->toResource(); - # Assert + // Assert $this->assertInstanceOf(ImplicitDefaultResource::class, $actualResource); } public function test_object_cannot_be_converted_if_no_resource_is_specified(): void { - # Expect + // Expect $this->expectException(NoResourceDefinedException::class); - # Arrange - $object = new class { + // Arrange + $object = new class + { use ConvertsToResource; }; - # Act + // Act $object->toResource(); } }