From 2787d2f704c2c58a508a03cc507e64c34e96e074 Mon Sep 17 00:00:00 2001 From: Marcel Strahl Date: Mon, 13 May 2024 12:19:01 +0200 Subject: [PATCH] Refactor tests and enhance JSON response The tests have been restructured and json response has been enhanced. All test-related things within the "ResponseFactory" directory have been moved to a new "data" directory. Also, the composer.json file and ServiceProvider.php have been updated with new dependencies and adjustments. Updates to ResponseFactoryTest.php now allow JSON responses as well. --- .gitignore | 2 + composer.json | 7 ++- infection.json5 | 10 ++-- src/Http/Responses/ResponseFactory.php | 1 - src/ServiceProvider.php | 4 +- tests/Http/Responses/ResponseFactoryTest.php | 59 +++++++++++++++---- tests/{ => data}/ResponseFactory/Dummy.php | 6 +- tests/data/ResponseFactory/JsonDummy.php | 22 +++++++ tests/{ => data}/ResponseFactory/Response.php | 8 +-- .../ResponseFactory/Response/Item.php | 2 +- tests/{ => data}/ResponseFactory/XmlDummy.php | 2 +- .../ResponseFactory/dummy_array.php | 0 12 files changed, 93 insertions(+), 30 deletions(-) rename tests/{ => data}/ResponseFactory/Dummy.php (82%) create mode 100644 tests/data/ResponseFactory/JsonDummy.php rename tests/{ => data}/ResponseFactory/Response.php (74%) rename tests/{ => data}/ResponseFactory/Response/Item.php (88%) rename tests/{ => data}/ResponseFactory/XmlDummy.php (84%) rename tests/{ => data}/ResponseFactory/dummy_array.php (100%) diff --git a/.gitignore b/.gitignore index bf80923..66d109b 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ Homestead.json composer.lock /tmp +/build +/tests/Http/Responses/metadata diff --git a/composer.json b/composer.json index f55db94..4e3fae0 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,9 @@ "vimeo/psalm": "^5.23", "psalm/plugin-laravel": "^2.10", "psalm/plugin-phpunit": "^0.19", - "infection/infection": "^0.27.10" + "infection/infection": "^0.27.10", + "phpat/phpat": "^0.10.15", + "phpstan/extension-installer": "^1.3" }, "scripts": { "lint": "parallel-lint --exclude .git --exclude vendor .", @@ -69,7 +71,8 @@ }, "config": { "allow-plugins": { - "infection/extension-installer": true + "infection/extension-installer": true, + "phpstan/extension-installer": true } } } diff --git a/infection.json5 b/infection.json5 index fd7aaae..6b8eef0 100644 --- a/infection.json5 +++ b/infection.json5 @@ -12,14 +12,14 @@ "@default": true }, "logs": { - "html": "infection.html", - "summary": "summary.log", - "json": "infection-log.json", - "perMutator": "per-mutator.md", + "html": "build/infection/infection.html", + "summary": "build/infection/summary.log", + "json": "build/infection/infection-log.json", + "perMutator": "build/infection/per-mutator.md", "github": true, "stryker": { "badge": "master" }, - "summaryJson": "summary.json" + "summaryJson": "build/infection/summary.json" }, } \ No newline at end of file diff --git a/src/Http/Responses/ResponseFactory.php b/src/Http/Responses/ResponseFactory.php index e4fa03e..2e74ea3 100644 --- a/src/Http/Responses/ResponseFactory.php +++ b/src/Http/Responses/ResponseFactory.php @@ -129,7 +129,6 @@ private function getResponse(string $content): Response return new JsonResponse( data: $content, status: $this->status, - headers: [self::HEADER_NAME_CONTENT_TYPE => self::HEADER_VALUE_APPLICATION_JSON], json: true ); } diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php index 346f6c0..ec10d4b 100644 --- a/src/ServiceProvider.php +++ b/src/ServiceProvider.php @@ -9,6 +9,7 @@ use Dropelikeit\LaravelJmsSerializer\Http\Responses\ResponseFactory; use Dropelikeit\LaravelJmsSerializer\Serializer\Factory; use Illuminate\Config\Repository; +use Illuminate\Foundation\Application; use Illuminate\Support\Facades\Storage; use Illuminate\Support\ServiceProvider as BaseServiceProvider; use function sprintf; @@ -64,8 +65,7 @@ public function register(): void $this->app->bind(ResponseBuilder::class, ResponseFactory::class); - $app = $this->app; - $this->app->bind('ResponseFactory', static function ($app): ResponseFactory { + $this->app->bind('ResponseFactory', static function (Application $app): ResponseFactory { return $app->get(ResponseFactory::class); }); } diff --git a/tests/Http/Responses/ResponseFactoryTest.php b/tests/Http/Responses/ResponseFactoryTest.php index 17cd7a0..2a86c04 100644 --- a/tests/Http/Responses/ResponseFactoryTest.php +++ b/tests/Http/Responses/ResponseFactoryTest.php @@ -8,9 +8,10 @@ use Dropelikeit\LaravelJmsSerializer\Exception\SerializeType; use Dropelikeit\LaravelJmsSerializer\Http\Responses\ResponseFactory; use Dropelikeit\LaravelJmsSerializer\Serializer\Factory; -use Dropelikeit\LaravelJmsSerializer\Tests\ResponseFactory\Dummy; -use Dropelikeit\LaravelJmsSerializer\Tests\ResponseFactory\Response; -use Dropelikeit\LaravelJmsSerializer\Tests\ResponseFactory\XmlDummy; +use Dropelikeit\LaravelJmsSerializer\Tests\data\ResponseFactory\Dummy; +use Dropelikeit\LaravelJmsSerializer\Tests\data\ResponseFactory\JsonDummy; +use Dropelikeit\LaravelJmsSerializer\Tests\data\ResponseFactory\Response; +use Dropelikeit\LaravelJmsSerializer\Tests\data\ResponseFactory\XmlDummy; use Illuminate\Http\Response as LaravelResponse; use InvalidArgumentException; use JMS\Serializer\SerializationContext; @@ -19,6 +20,7 @@ use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpFoundation\JsonResponse; /** * @author Marcel Strahl @@ -88,7 +90,7 @@ public function canCreateFromArrayIterator(): void $responseFactory = new ResponseFactory((new Factory())->getSerializer($this->config), $this->config); - $response = $responseFactory->create(Response::create([new Response\Item()])); + $response = $responseFactory->create(Response::create([new \Dropelikeit\LaravelJmsSerializer\Tests\data\ResponseFactory\Response\Item()])); self::assertEquals(200, $response->getStatusCode()); self::assertEquals('[{"key":"magic_number","value":12}]', $response->getContent()); @@ -114,7 +116,7 @@ public function canCreateJsonResponseFromArray(): void $responseFactory = new ResponseFactory((new Factory())->getSerializer($this->config), $this->config); - $response = $responseFactory->createFromArray(require __DIR__ . '/../../ResponseFactory/dummy_array.php'); + $response = $responseFactory->createFromArray(require __DIR__ . '/../../data/ResponseFactory/dummy_array.php'); self::assertEquals(200, $response->getStatusCode()); self::assertEquals( @@ -143,7 +145,7 @@ public function canCreateXmlResponseFromArray(): void $responseFactory = new ResponseFactory((new Factory())->getSerializer($this->config), $this->config); - $response = $responseFactory->createFromArray(require __DIR__ . '/../../ResponseFactory/dummy_array.php'); + $response = $responseFactory->createFromArray(require __DIR__ . '/../../data/ResponseFactory/dummy_array.php'); self::assertEquals(200, $response->getStatusCode()); self::assertEquals( @@ -376,6 +378,14 @@ public function throwInvalidArgumentExceptionIfContentOnCreateFromArrayMethodIsE #[Test] public function canDetectIfSerializeTypeIsXmlResultResponseHasXml(): void { + $expectedResponse = new LaravelResponse( + content: ' + +', + status: 200, + headers: ['Content-Type' => 'application/xml'] + ); + $this->config ->expects(self::once()) ->method('getCacheDir') @@ -395,11 +405,38 @@ public function canDetectIfSerializeTypeIsXmlResultResponseHasXml(): void $response = $responseFactory->create(new XmlDummy()); - $this->assertEquals( - ' - -', - $response->getContent(), + $this->assertEquals($expectedResponse, $response); + } + + #[Test] + public function canDetectIfSerializeTypeIsJSONResultResponseHasJSON(): void + { + $expectedResponse = new JsonResponse( + data: '{"title":"My test"}', + status: 200, + headers: ['Content-Type' => 'application/json'], + json: true ); + + $this->config + ->expects(self::once()) + ->method('getCacheDir') + ->willReturn(__DIR__); + + $this->config + ->expects(self::once()) + ->method('debug') + ->willReturn(true); + + $this->config + ->expects(self::once()) + ->method('getSerializeType') + ->willReturn('json'); + + $responseFactory = new ResponseFactory((new Factory())->getSerializer($this->config), $this->config); + + $response = $responseFactory->create(new JsonDummy()); + + $this->assertEquals($expectedResponse, $response); } } diff --git a/tests/ResponseFactory/Dummy.php b/tests/data/ResponseFactory/Dummy.php similarity index 82% rename from tests/ResponseFactory/Dummy.php rename to tests/data/ResponseFactory/Dummy.php index 44d9287..f956957 100644 --- a/tests/ResponseFactory/Dummy.php +++ b/tests/data/ResponseFactory/Dummy.php @@ -1,9 +1,9 @@ ") * @var array|null - * @psalm-param list + * @psalm-param Item */ public ?array $items = null; diff --git a/tests/data/ResponseFactory/JsonDummy.php b/tests/data/ResponseFactory/JsonDummy.php new file mode 100644 index 0000000..e7d765e --- /dev/null +++ b/tests/data/ResponseFactory/JsonDummy.php @@ -0,0 +1,22 @@ +title = 'My test'; + } + + public function getTitle(): string + { + return $this->title; + } +} \ No newline at end of file diff --git a/tests/ResponseFactory/Response.php b/tests/data/ResponseFactory/Response.php similarity index 74% rename from tests/ResponseFactory/Response.php rename to tests/data/ResponseFactory/Response.php index 7332ea1..1c06c08 100644 --- a/tests/ResponseFactory/Response.php +++ b/tests/data/ResponseFactory/Response.php @@ -1,10 +1,10 @@ $items - * @psalm-param list $items + * @psalm-param Item $items */ private function __construct(array $items) { @@ -27,7 +27,7 @@ private function __construct(array $items) /** * @param array $items - * @psalm-param list $items + * @psalm-param Item $items * * @return self */ diff --git a/tests/ResponseFactory/Response/Item.php b/tests/data/ResponseFactory/Response/Item.php similarity index 88% rename from tests/ResponseFactory/Response/Item.php rename to tests/data/ResponseFactory/Response/Item.php index 3b6d5a0..714b365 100644 --- a/tests/ResponseFactory/Response/Item.php +++ b/tests/data/ResponseFactory/Response/Item.php @@ -1,7 +1,7 @@