From 5de158b6b30069ee819aa952530046c3a06ec43a Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Wed, 12 Jul 2023 13:09:43 +0300 Subject: [PATCH 01/10] Issue #7: Implemented unit tests, cs-check, static analysis. --- .github/workflows/cs-tests.yml | 46 ++++++++++++++++ .github/workflows/static-analysis.yml | 46 ++++++++++++++++ .github/workflows/unit-tests.yml | 47 ++++++++++++++++ .gitignore | 5 ++ composer.json | 34 ++++++++++-- phpcs.xml | 21 ++++++++ phpunit.xml | 14 +++++ psalm.xml | 17 ++++++ src/ConfigProvider.php | 13 +---- .../ResponseHeaderMiddlewareFactory.php | 11 +--- src/Middleware/ResponseHeaderMiddleware.php | 27 +++------- tests/ResponseHeaderMiddlewareFactoryTest.php | 34 ++++++++++++ tests/ResponseHeaderMiddlewareTest.php | 54 +++++++++++++++++++ 13 files changed, 325 insertions(+), 44 deletions(-) create mode 100644 .github/workflows/cs-tests.yml create mode 100644 .github/workflows/static-analysis.yml create mode 100644 .github/workflows/unit-tests.yml create mode 100644 phpcs.xml create mode 100644 phpunit.xml create mode 100644 psalm.xml create mode 100644 tests/ResponseHeaderMiddlewareFactoryTest.php create mode 100644 tests/ResponseHeaderMiddlewareTest.php diff --git a/.github/workflows/cs-tests.yml b/.github/workflows/cs-tests.yml new file mode 100644 index 0000000..3da9965 --- /dev/null +++ b/.github/workflows/cs-tests.yml @@ -0,0 +1,46 @@ +on: + - push + +name: Run phpcs checks + +jobs: + mutation: + name: PHP ${{ matrix.php }}-${{ matrix.os }} + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: + - ubuntu-latest + + php: + - "8.1" + - "8.2" + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "${{ matrix.php }}" + tools: composer:v2, cs2pr + coverage: none + + - name: Determine composer cache directory + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php }}-composer- + - name: Install dependencies with composer + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + + - name: Run phpcs checks + run: vendor/bin/phpcs diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml new file mode 100644 index 0000000..74550fc --- /dev/null +++ b/.github/workflows/static-analysis.yml @@ -0,0 +1,46 @@ +on: + - push + +name: Run static analysis + +jobs: + mutation: + name: PHP ${{ matrix.php }}-${{ matrix.os }} + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: + - ubuntu-latest + + php: + - "8.1" + - "8.2" + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "${{ matrix.php }}" + tools: composer:v2, cs2pr + coverage: none + + - name: Determine composer cache directory + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php }}-composer- + - name: Install dependencies with composer + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + + - name: Run static analysis + run: vendor/bin/psalm --no-cache --output-format=github --show-info=false --threads=4 diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml new file mode 100644 index 0000000..d2ab8e7 --- /dev/null +++ b/.github/workflows/unit-tests.yml @@ -0,0 +1,47 @@ +on: + - push + +name: Run PHPUnit tests + +jobs: + mutation: + name: PHP ${{ matrix.php }}-${{ matrix.os }} + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: + - ubuntu-latest + + php: + - "8.1" + - "8.2" + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "${{ matrix.php }}" + tools: composer:v2, cs2pr + coverage: none + + - name: Determine composer cache directory + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php }}-composer- + + - name: Install dependencies with composer + run: composer install --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + + - name: Run PHPUnit tests + run: vendor/bin/phpunit --colors=always diff --git a/.gitignore b/.gitignore index 485dee6..948af93 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ +composer.phar +/vendor/ +.phpcs-cache .idea +composer.lock +.phpunit.result.cache diff --git a/composer.json b/composer.json index 644afff..7501f01 100644 --- a/composer.json +++ b/composer.json @@ -19,15 +19,41 @@ "mezzio" ], "require": { - "php": "~7.4.0 || ~8.0.0 || ~8.1.0" + "php": "~8.1.0 || ~8.2.0", + "mezzio/mezzio-router": "^3.16", + "psr/http-client": "^1.0", + "psr/http-message": "^2.0" }, "require-dev": { - "phpunit/phpunit": "^9.5.20", - "squizlabs/php_codesniffer": "^3.6.2" + "phpunit/phpunit": "^10.2", + "laminas/laminas-coding-standard": "^2.5", + "vimeo/psalm": "^5.13" }, "autoload": { "psr-4": { "Dot\\ResponseHeader\\": "src" } + }, + "autoload-dev": { + "psr-4": { + "DotTest\\ResponseHeader\\": "tests/" + } + }, + "scripts": { + "check": [ + "@cs-check", + "@test" + ], + "cs-check": "phpcs", + "cs-fix": "phpcbf", + "test": "phpunit --colors=always", + "test-coverage": "phpunit --colors=always --coverage-clover clover.xml", + "static-analysis": "psalm --shepherd --stats" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + }, + "sort-packages": true } -} \ No newline at end of file +} diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 0000000..60157b0 --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + config + src + tests + + + + diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..349fbfa --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,14 @@ + + + + + ./tests + + + + + + ./src + + + diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..30f61eb --- /dev/null +++ b/psalm.xml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index a0a9e96..aa45e00 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -1,20 +1,14 @@ get('config')['dot_response_headers'] ?? []); } -} \ No newline at end of file +} diff --git a/src/Middleware/ResponseHeaderMiddleware.php b/src/Middleware/ResponseHeaderMiddleware.php index 975b1d7..ffba8a5 100644 --- a/src/Middleware/ResponseHeaderMiddleware.php +++ b/src/Middleware/ResponseHeaderMiddleware.php @@ -1,36 +1,28 @@ config = $config; } - /** - * @param ServerRequestInterface $request - * @param RequestHandlerInterface $handler - * @return ResponseInterface - */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $response = $handler->handle($request); @@ -38,7 +30,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $response; } - $response = $this->addHeaders($response, self::ALL_ROUTES); + $response = $this->addHeaders($response, self::ALL_ROUTES); $routeResult = $request->getAttribute(RouteResult::class); if ($routeResult instanceof RouteResult && $routeResult->isSuccess()) { $response = $this->addHeaders($response, $routeResult->getMatchedRouteName()); @@ -46,19 +38,14 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $response; } - /** - * @param ResponseInterface $response - * @param string $route - * @return ResponseInterface - */ - private function addHeaders(ResponseInterface $response, string $route): ResponseInterface + public function addHeaders(ResponseInterface $response, string $route): ResponseInterface { if (array_key_exists($route, $this->config)) { foreach ($this->config[$route] as $header => $data) { if (! array_key_exists('value', $data)) { continue; } - $overwrite = (isset($data['overwrite']) && $data['overwrite'] === true) ? true : false; + $overwrite = isset($data['overwrite']) && $data['overwrite'] === true ? true : false; if ($overwrite) { $response = $response->withHeader($header, $data['value']); } @@ -66,4 +53,4 @@ private function addHeaders(ResponseInterface $response, string $route): Respons } return $response; } -} \ No newline at end of file +} diff --git a/tests/ResponseHeaderMiddlewareFactoryTest.php b/tests/ResponseHeaderMiddlewareFactoryTest.php new file mode 100644 index 0000000..efdc38a --- /dev/null +++ b/tests/ResponseHeaderMiddlewareFactoryTest.php @@ -0,0 +1,34 @@ +responseHeaderMiddlewareFactory = new ResponseHeaderMiddlewareFactory(); + + $this->containerInterface = $this->createMock(ContainerInterface::class); + } + + public function testInvoke() + { + $data = $this->responseHeaderMiddlewareFactory->__invoke($this->containerInterface); + + $this->assertInstanceOf(ResponseHeaderMiddleware::class, $data); + } +} diff --git a/tests/ResponseHeaderMiddlewareTest.php b/tests/ResponseHeaderMiddlewareTest.php new file mode 100644 index 0000000..2829225 --- /dev/null +++ b/tests/ResponseHeaderMiddlewareTest.php @@ -0,0 +1,54 @@ +responseHeader = new ResponseHeaderMiddleware([]); + $this->serverRequest = $this->createMock(ServerRequestInterface::class); + $this->requestHandler = $this->createMock(RequestHandlerInterface::class); + $this->responseInterface = $this->createMock(ResponseInterface::class); + } + + public function testProcess() + { + $data = $this->responseHeader->process($this->serverRequest, $this->requestHandler); + + $this->assertInstanceOf(ResponseInterface::class, $data); + $this->assertInstanceOf(StreamInterface::class, $data->getBody()); + $this->assertNotEmpty($data->getBody()); + $this->assertIsArray($data->getHeaders()); + $this->assertIsInt($data->getStatusCode()); + $this->assertIsString($data->getProtocolVersion()); + $this->assertIsString($data->getReasonPhrase()); + } + + public function testAddHeaders() + { + $data = $this->responseHeader->addHeaders($this->responseInterface, 'home'); + + $this->assertInstanceOf(ResponseInterface::class, $data); + } +} From fa1091e73419905a29ad608b396baeb12564e2ea Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Tue, 18 Jul 2023 11:26:16 +0300 Subject: [PATCH 02/10] Added SymfonyInsight badge to Readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 366be66..21afe63 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ [![GitHub stars](https://img.shields.io/github/stars/dotkernel/dot-response-header)](https://github.com/dotkernel/dot-response-header/stargazers) [![GitHub license](https://img.shields.io/github/license/dotkernel/dot-response-header)](https://github.com/dotkernel/response-header/LICENSE.md) +[![SymfonyInsight](https://insight.symfony.com/projects/dce88959-bd29-40ef-b1e7-d12815145438/big.svg)](https://insight.symfony.com/projects/dce88959-bd29-40ef-b1e7-d12815145438) + + Middleware for setting and overwriting custom response headers. From 72558490fa4302ab803a545afa9fc143140caae8 Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Thu, 20 Jul 2023 13:33:46 +0300 Subject: [PATCH 03/10] Code improvements and fixes --- CHANGELOG.md | 2 +- README.md | 8 +- composer.json | 4 +- config/response-header.global.php.dist | 2 +- phpcs.xml | 2 +- phpunit.xml | 2 +- .../ResponseHeaderMiddlewareFactory.php | 27 +++++++ src/Middleware/ResponseHeaderMiddleware.php | 2 +- test/ConfigProviderTest.php | 32 ++++++++ test/ResponseHeaderMiddlewareFactoryTest.php | 74 +++++++++++++++++++ .../ResponseHeaderMiddlewareTest.php | 8 +- tests/ResponseHeaderMiddlewareFactoryTest.php | 34 --------- 12 files changed, 150 insertions(+), 47 deletions(-) create mode 100644 test/ConfigProviderTest.php create mode 100644 test/ResponseHeaderMiddlewareFactoryTest.php rename {tests => test}/ResponseHeaderMiddlewareTest.php (94%) delete mode 100644 tests/ResponseHeaderMiddlewareFactoryTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 3486233..d3870ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,4 +31,4 @@ * Nothing ### Fixed -* Nothing \ No newline at end of file +* Nothing diff --git a/README.md b/README.md index 21afe63..9adf98a 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ # dot-response-header ![OSS Lifecycle](https://img.shields.io/osslifecycle/dotkernel/dot-response-header) -![PHP from Packagist (specify version)](https://img.shields.io/packagist/php-v/dotkernel/dot-response-header/3.1.0) +![PHP from Packagist (specify version)](https://img.shields.io/packagist/php-v/dotkernel/dot-response-header/3.2.0) [![GitHub issues](https://img.shields.io/github/issues/dotkernel/dot-response-header)](https://github.com/dotkernel/dot-response-header/issues) [![GitHub forks](https://img.shields.io/github/forks/dotkernel/dot-response-header)](https://github.com/dotkernel/dot-response-header/network) [![GitHub stars](https://img.shields.io/github/stars/dotkernel/dot-response-header)](https://github.com/dotkernel/dot-response-header/stargazers) -[![GitHub license](https://img.shields.io/github/license/dotkernel/dot-response-header)](https://github.com/dotkernel/response-header/LICENSE.md) +[![GitHub license](https://img.shields.io/github/license/dotkernel/dot-response-header)](https://github.com/dotkernel/dot-response-header/blob/3.0/LICENSE) + +[![Build Static](https://github.com/dotkernel/dot-response-header/actions/workflows/static-analysis.yml/badge.svg?branch=3.0)](https://github.com/dotkernel/dot-response-header/actions/workflows/static-analysis.yml) [![SymfonyInsight](https://insight.symfony.com/projects/dce88959-bd29-40ef-b1e7-d12815145438/big.svg)](https://insight.symfony.com/projects/dce88959-bd29-40ef-b1e7-d12815145438) @@ -15,7 +17,7 @@ Middleware for setting and overwriting custom response headers. ### Requirements -- PHP >= 7.4 +- PHP >= 8.1 ### Installation diff --git a/composer.json b/composer.json index 7501f01..317e68c 100644 --- a/composer.json +++ b/composer.json @@ -31,12 +31,12 @@ }, "autoload": { "psr-4": { - "Dot\\ResponseHeader\\": "src" + "Dot\\ResponseHeader\\": "src/" } }, "autoload-dev": { "psr-4": { - "DotTest\\ResponseHeader\\": "tests/" + "DotTest\\ResponseHeader\\": "test/" } }, "scripts": { diff --git a/config/response-header.global.php.dist b/config/response-header.global.php.dist index 79562ab..4c7a0e1 100644 --- a/config/response-header.global.php.dist +++ b/config/response-header.global.php.dist @@ -18,4 +18,4 @@ return [ ] ] ] -]; \ No newline at end of file +]; diff --git a/phpcs.xml b/phpcs.xml index 60157b0..0d4c1dc 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -14,7 +14,7 @@ config src - tests + test diff --git a/phpunit.xml b/phpunit.xml index 349fbfa..cf5ba32 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -2,7 +2,7 @@ - ./tests + ./test diff --git a/src/Factory/ResponseHeaderMiddlewareFactory.php b/src/Factory/ResponseHeaderMiddlewareFactory.php index 416dfb0..2094442 100644 --- a/src/Factory/ResponseHeaderMiddlewareFactory.php +++ b/src/Factory/ResponseHeaderMiddlewareFactory.php @@ -5,12 +5,39 @@ namespace Dot\ResponseHeader\Factory; use Dot\ResponseHeader\Middleware\ResponseHeaderMiddleware; +use Exception; +use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; +use Psr\Container\NotFoundExceptionInterface; + +use function array_key_exists; +use function is_array; class ResponseHeaderMiddlewareFactory { + public const MESSAGE_MISSING_CONFIG = 'Unable to find config.'; + public const MESSAGE_MISSING_PACKAGE_CONFIG = 'Unable to find dot-response-header config.'; + + /** + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + * @throws Exception + */ public function __invoke(ContainerInterface $container): ResponseHeaderMiddleware { + if (! $container->has('config')) { + throw new Exception(self::MESSAGE_MISSING_CONFIG); + } + $config = $container->get('config'); + + if ( + ! array_key_exists('dot_response_headers', $config) + || ! is_array($config['dot_response_headers']) + || empty($config['dot_response_headers']) + ) { + throw new Exception(self::MESSAGE_MISSING_PACKAGE_CONFIG); + } + return new ResponseHeaderMiddleware($container->get('config')['dot_response_headers'] ?? []); } } diff --git a/src/Middleware/ResponseHeaderMiddleware.php b/src/Middleware/ResponseHeaderMiddleware.php index ffba8a5..9872192 100644 --- a/src/Middleware/ResponseHeaderMiddleware.php +++ b/src/Middleware/ResponseHeaderMiddleware.php @@ -45,7 +45,7 @@ public function addHeaders(ResponseInterface $response, string $route): Response if (! array_key_exists('value', $data)) { continue; } - $overwrite = isset($data['overwrite']) && $data['overwrite'] === true ? true : false; + $overwrite = isset($data['overwrite']) && $data['overwrite'] === true; if ($overwrite) { $response = $response->withHeader($header, $data['value']); } diff --git a/test/ConfigProviderTest.php b/test/ConfigProviderTest.php new file mode 100644 index 0000000..23a3255 --- /dev/null +++ b/test/ConfigProviderTest.php @@ -0,0 +1,32 @@ +configProvider = new ConfigProvider(); + } + + public function testInvoke() + { + $data = $this->configProvider->__invoke(); + + $this->assertIsArray($data); + } + + public function testGetDependencies() + { + $data = $this->configProvider->getDependencies(); + + $this->assertIsArray($data); + } +} diff --git a/test/ResponseHeaderMiddlewareFactoryTest.php b/test/ResponseHeaderMiddlewareFactoryTest.php new file mode 100644 index 0000000..7d55c26 --- /dev/null +++ b/test/ResponseHeaderMiddlewareFactoryTest.php @@ -0,0 +1,74 @@ +responseHeaderMiddlewareFactory = new ResponseHeaderMiddlewareFactory(); + $this->containerInterface = $this->createMock(ContainerInterface::class); + } + + /** + * @throws ContainerExceptionInterface + * @throws Exception + * @throws NotFoundExceptionInterface + */ + public function testWillNotCreateApplicationWithoutConfig(): void + { + $container = $this->createMock(ContainerInterface::class); + + $container->expects($this->once()) + ->method('has') + ->with('config') + ->willReturn(false); + + $this->expectException(\Exception::class); + $this->expectExceptionMessage(ResponseHeaderMiddlewareFactory::MESSAGE_MISSING_CONFIG); + (new ResponseHeaderMiddlewareFactory())($container); + } + + /** + * @throws Exception + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function testWillNotCreateApplicationWithoutPackageConfig(): void + { + $container = $this->createMock(ContainerInterface::class); + + $container->expects($this->once()) + ->method('has') + ->with('config') + ->willReturn(true); + + $container->expects($this->once()) + ->method('get') + ->with('config') + ->willReturn([ + 'test', + ]); + + $this->expectException(\Exception::class); + $this->expectExceptionMessage(ResponseHeaderMiddlewareFactory::MESSAGE_MISSING_PACKAGE_CONFIG); + (new ResponseHeaderMiddlewareFactory())($container); + } +} diff --git a/tests/ResponseHeaderMiddlewareTest.php b/test/ResponseHeaderMiddlewareTest.php similarity index 94% rename from tests/ResponseHeaderMiddlewareTest.php rename to test/ResponseHeaderMiddlewareTest.php index 2829225..e3839a8 100644 --- a/tests/ResponseHeaderMiddlewareTest.php +++ b/test/ResponseHeaderMiddlewareTest.php @@ -5,6 +5,7 @@ namespace DotTest\ResponseHeader; use Dot\ResponseHeader\Middleware\ResponseHeaderMiddleware; +use PHPUnit\Framework\MockObject\Exception; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Http\Message\ResponseInterface; @@ -22,10 +23,11 @@ class ResponseHeaderMiddlewareTest extends TestCase private ResponseInterface $responseInterface; + /** + * @throws Exception + */ public function setUp(): void { - parent::setUp(); - $this->responseHeader = new ResponseHeaderMiddleware([]); $this->serverRequest = $this->createMock(ServerRequestInterface::class); $this->requestHandler = $this->createMock(RequestHandlerInterface::class); @@ -47,7 +49,7 @@ public function testProcess() public function testAddHeaders() { - $data = $this->responseHeader->addHeaders($this->responseInterface, 'home'); + $data = $this->responseHeader->addHeaders($this->responseInterface, ''); $this->assertInstanceOf(ResponseInterface::class, $data); } diff --git a/tests/ResponseHeaderMiddlewareFactoryTest.php b/tests/ResponseHeaderMiddlewareFactoryTest.php deleted file mode 100644 index efdc38a..0000000 --- a/tests/ResponseHeaderMiddlewareFactoryTest.php +++ /dev/null @@ -1,34 +0,0 @@ -responseHeaderMiddlewareFactory = new ResponseHeaderMiddlewareFactory(); - - $this->containerInterface = $this->createMock(ContainerInterface::class); - } - - public function testInvoke() - { - $data = $this->responseHeaderMiddlewareFactory->__invoke($this->containerInterface); - - $this->assertInstanceOf(ResponseHeaderMiddleware::class, $data); - } -} From c28c11b4a4adf7271fdb3816788b0a8457b6d710 Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Thu, 27 Jul 2023 13:50:55 +0300 Subject: [PATCH 04/10] directory structure change --- composer.json | 3 ++- .../ResponseHeaderMiddlewareFactoryTest.php | 14 -------------- .../ResponseHeaderMiddlewareTest.php | 0 3 files changed, 2 insertions(+), 15 deletions(-) rename test/{ => Factory}/ResponseHeaderMiddlewareFactoryTest.php (79%) rename test/{ => Middleware}/ResponseHeaderMiddlewareTest.php (100%) diff --git a/composer.json b/composer.json index 317e68c..95b630a 100644 --- a/composer.json +++ b/composer.json @@ -25,8 +25,9 @@ "psr/http-message": "^2.0" }, "require-dev": { - "phpunit/phpunit": "^10.2", "laminas/laminas-coding-standard": "^2.5", + "laminas/laminas-diactoros": "^3.0", + "phpunit/phpunit": "^10.2", "vimeo/psalm": "^5.13" }, "autoload": { diff --git a/test/ResponseHeaderMiddlewareFactoryTest.php b/test/Factory/ResponseHeaderMiddlewareFactoryTest.php similarity index 79% rename from test/ResponseHeaderMiddlewareFactoryTest.php rename to test/Factory/ResponseHeaderMiddlewareFactoryTest.php index 7d55c26..e7aed41 100644 --- a/test/ResponseHeaderMiddlewareFactoryTest.php +++ b/test/Factory/ResponseHeaderMiddlewareFactoryTest.php @@ -6,7 +6,6 @@ use Dot\ResponseHeader\Factory\ResponseHeaderMiddlewareFactory; use PHPUnit\Framework\MockObject\Exception; -use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; @@ -14,19 +13,6 @@ class ResponseHeaderMiddlewareFactoryTest extends TestCase { - private ResponseHeaderMiddlewareFactory $responseHeaderMiddlewareFactory; - - private ContainerInterface|MockObject $containerInterface; - - /** - * @throws Exception - */ - public function setUp(): void - { - $this->responseHeaderMiddlewareFactory = new ResponseHeaderMiddlewareFactory(); - $this->containerInterface = $this->createMock(ContainerInterface::class); - } - /** * @throws ContainerExceptionInterface * @throws Exception diff --git a/test/ResponseHeaderMiddlewareTest.php b/test/Middleware/ResponseHeaderMiddlewareTest.php similarity index 100% rename from test/ResponseHeaderMiddlewareTest.php rename to test/Middleware/ResponseHeaderMiddlewareTest.php From 89304ac7245449f2f0344f7619eb9467623042b9 Mon Sep 17 00:00:00 2001 From: alexmerlin Date: Thu, 27 Jul 2023 15:23:47 +0300 Subject: [PATCH 05/10] ResponseHeaderMiddleware::addHeaders test examples Signed-off-by: alexmerlin --- src/Middleware/ResponseHeaderMiddleware.php | 7 +++- .../ResponseHeaderMiddlewareTest.php | 38 +++++++++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/Middleware/ResponseHeaderMiddleware.php b/src/Middleware/ResponseHeaderMiddleware.php index 9872192..3f3d6ca 100644 --- a/src/Middleware/ResponseHeaderMiddleware.php +++ b/src/Middleware/ResponseHeaderMiddleware.php @@ -45,8 +45,11 @@ public function addHeaders(ResponseInterface $response, string $route): Response if (! array_key_exists('value', $data)) { continue; } - $overwrite = isset($data['overwrite']) && $data['overwrite'] === true; - if ($overwrite) { + $addHeader = true; + if ($response->hasHeader($header)) { + $addHeader = isset($data['overwrite']) && $data['overwrite'] === true; + } + if ($addHeader === true) { $response = $response->withHeader($header, $data['value']); } } diff --git a/test/Middleware/ResponseHeaderMiddlewareTest.php b/test/Middleware/ResponseHeaderMiddlewareTest.php index e3839a8..91eddb9 100644 --- a/test/Middleware/ResponseHeaderMiddlewareTest.php +++ b/test/Middleware/ResponseHeaderMiddlewareTest.php @@ -5,6 +5,7 @@ namespace DotTest\ResponseHeader; use Dot\ResponseHeader\Middleware\ResponseHeaderMiddleware; +use Laminas\Diactoros\Response; use PHPUnit\Framework\MockObject\Exception; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -47,10 +48,41 @@ public function testProcess() $this->assertIsString($data->getReasonPhrase()); } - public function testAddHeaders() + public function testWillNotAddHeadersWithoutCommonWithoutRouteSpecificHeadersConfigured(): void { - $data = $this->responseHeader->addHeaders($this->responseInterface, ''); + $responseHeader = new ResponseHeaderMiddleware([]); - $this->assertInstanceOf(ResponseInterface::class, $data); + $response = new Response(); + $response = $responseHeader->addHeaders($response, 'test'); + + $this->assertEmpty($response->getHeaders()); + } + + public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigured(): void + { + $responseHeader = new ResponseHeaderMiddleware([ + '*' => [ + 'CustomHeader1' => [ + 'value' => 'CustomHeader1-Value', + 'overwrite' => true, + ], + 'CustomHeader2' => [ + 'value' => 'CustomHeader2-Value', + 'overwrite' => false, + ], + ], + ]); + + $response = new Response(); + + $response = $responseHeader->addHeaders($response, 'test'); + $this->assertEmpty($response->getHeaders()); + $this->assertFalse($response->hasHeader('CustomHeader1')); + $this->assertFalse($response->hasHeader('CustomHeader2')); + + $response = $responseHeader->addHeaders($response, '*'); + $this->assertCount(2, $response->getHeaders()); + $this->assertTrue($response->hasHeader('CustomHeader1')); + $this->assertTrue($response->hasHeader('CustomHeader2')); } } From c48fe7e855fedc9a71cef67957e6bebdbf904b20 Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Fri, 28 Jul 2023 14:23:17 +0300 Subject: [PATCH 06/10] Middleware test improvements --- .../ResponseHeaderMiddlewareTest.php | 70 +++++++++++++++++-- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/test/Middleware/ResponseHeaderMiddlewareTest.php b/test/Middleware/ResponseHeaderMiddlewareTest.php index 91eddb9..d30f9cc 100644 --- a/test/Middleware/ResponseHeaderMiddlewareTest.php +++ b/test/Middleware/ResponseHeaderMiddlewareTest.php @@ -22,17 +22,14 @@ class ResponseHeaderMiddlewareTest extends TestCase private RequestHandlerInterface|MockObject $requestHandler; - private ResponseInterface $responseInterface; - /** * @throws Exception */ public function setUp(): void { - $this->responseHeader = new ResponseHeaderMiddleware([]); - $this->serverRequest = $this->createMock(ServerRequestInterface::class); - $this->requestHandler = $this->createMock(RequestHandlerInterface::class); - $this->responseInterface = $this->createMock(ResponseInterface::class); + $this->responseHeader = new ResponseHeaderMiddleware([]); + $this->serverRequest = $this->createMock(ServerRequestInterface::class); + $this->requestHandler = $this->createMock(RequestHandlerInterface::class); } public function testProcess() @@ -74,7 +71,31 @@ public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigure ]); $response = new Response(); + $this->assertFalse($response->hasHeader('CustomHeader1')); + $this->assertFalse($response->hasHeader('CustomHeader2')); + + $response = $responseHeader->addHeaders($response, '*'); + + $this->assertTrue($response->hasHeader('CustomHeader1')); + $this->assertTrue($response->hasHeader('CustomHeader2')); + } + + public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWhenNoRouteMatched(): void + { + $responseHeader = new ResponseHeaderMiddleware([ + '*' => [ + 'CustomHeader1' => [ + 'value' => 'CustomHeader1-Value', + 'overwrite' => true, + ], + 'CustomHeader2' => [ + 'value' => 'CustomHeader2-Value', + 'overwrite' => false, + ], + ], + ]); + $response = new Response(); $response = $responseHeader->addHeaders($response, 'test'); $this->assertEmpty($response->getHeaders()); $this->assertFalse($response->hasHeader('CustomHeader1')); @@ -85,4 +106,41 @@ public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigure $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); } + + public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWhenRouteMatched(): void + { + $responseHeader = new ResponseHeaderMiddleware([ + '*' => [ + 'CustomHeader1' => [ + 'value' => 'CustomHeader1-Value', + 'overwrite' => true, + ], + 'CustomHeader2' => [ + 'value' => 'CustomHeader2-Value', + 'overwrite' => false, + ], + ], + 'home' => [ + 'CustomHeader' => [ + 'value' => 'header3', + ], + ], + ]); + + $response = new Response(); + + $this->assertFalse($response->hasHeader('CustomHeader1')); + $this->assertFalse($response->hasHeader('CustomHeader2')); + $this->assertFalse($response->hasHeader('CustomHeader')); + $this->assertEmpty($response->getHeaders()); + + $response = $responseHeader->addHeaders($response, '*'); + $this->assertCount(2, $response->getHeaders()); + $this->assertTrue($response->hasHeader('CustomHeader1')); + $this->assertTrue($response->hasHeader('CustomHeader2')); + + $response = $responseHeader->addHeaders($response, 'home'); + $this->assertCount(3, $response->getHeaders()); + $this->assertTrue($response->hasHeader('CustomHeader')); + } } From b745714e5fdfb1cf245c4892cb667e4bfe6792d2 Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Fri, 28 Jul 2023 14:54:30 +0300 Subject: [PATCH 07/10] Test improvements --- test/Middleware/ResponseHeaderMiddlewareTest.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/test/Middleware/ResponseHeaderMiddlewareTest.php b/test/Middleware/ResponseHeaderMiddlewareTest.php index d30f9cc..cfa1b7a 100644 --- a/test/Middleware/ResponseHeaderMiddlewareTest.php +++ b/test/Middleware/ResponseHeaderMiddlewareTest.php @@ -71,11 +71,13 @@ public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigure ]); $response = new Response(); + $response = $responseHeader->addHeaders($response, 'test'); + $this->assertEmpty($response->getHeaders()); $this->assertFalse($response->hasHeader('CustomHeader1')); $this->assertFalse($response->hasHeader('CustomHeader2')); $response = $responseHeader->addHeaders($response, '*'); - + $this->assertCount(2, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); } @@ -83,7 +85,7 @@ public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigure public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWhenNoRouteMatched(): void { $responseHeader = new ResponseHeaderMiddleware([ - '*' => [ + '*' => [ 'CustomHeader1' => [ 'value' => 'CustomHeader1-Value', 'overwrite' => true, @@ -93,13 +95,18 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh 'overwrite' => false, ], ], + 'home' => [ + 'CustomHeader' => [ + 'value' => 'header3', + ], + ], ]); $response = new Response(); + $response = $responseHeader->addHeaders($response, 'test'); + $this->assertFalse($response->hasHeader('CustomHeader')); $this->assertEmpty($response->getHeaders()); - $this->assertFalse($response->hasHeader('CustomHeader1')); - $this->assertFalse($response->hasHeader('CustomHeader2')); $response = $responseHeader->addHeaders($response, '*'); $this->assertCount(2, $response->getHeaders()); From b056d8cdc7f1535cd6cd26517576cbf734a5e013 Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Fri, 28 Jul 2023 16:23:20 +0300 Subject: [PATCH 08/10] Further test improvements --- .../ResponseHeaderMiddlewareTest.php | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/test/Middleware/ResponseHeaderMiddlewareTest.php b/test/Middleware/ResponseHeaderMiddlewareTest.php index cfa1b7a..275f8f2 100644 --- a/test/Middleware/ResponseHeaderMiddlewareTest.php +++ b/test/Middleware/ResponseHeaderMiddlewareTest.php @@ -57,7 +57,7 @@ public function testWillNotAddHeadersWithoutCommonWithoutRouteSpecificHeadersCon public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigured(): void { - $responseHeader = new ResponseHeaderMiddleware([ + $config = [ '*' => [ 'CustomHeader1' => [ 'value' => 'CustomHeader1-Value', @@ -68,9 +68,11 @@ public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigure 'overwrite' => false, ], ], - ]); + ]; + $responseHeader = new ResponseHeaderMiddleware($config); $response = new Response(); + $response = $responseHeader->addHeaders($response, 'test'); $this->assertEmpty($response->getHeaders()); $this->assertFalse($response->hasHeader('CustomHeader1')); @@ -80,11 +82,13 @@ public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigure $this->assertCount(2, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); + $this->assertSame($response->getHeaderLine('CustomHeader1'), $config['*']['CustomHeader1']['value']); + $this->assertSame($response->getHeaderLine('CustomHeader2'), $config['*']['CustomHeader2']['value']); } public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWhenNoRouteMatched(): void { - $responseHeader = new ResponseHeaderMiddleware([ + $config = [ '*' => [ 'CustomHeader1' => [ 'value' => 'CustomHeader1-Value', @@ -100,7 +104,8 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh 'value' => 'header3', ], ], - ]); + ]; + $responseHeader = new ResponseHeaderMiddleware($config); $response = new Response(); @@ -112,11 +117,13 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh $this->assertCount(2, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); + $this->assertSame($response->getHeaderLine('CustomHeader1'), $config['*']['CustomHeader1']['value']); + $this->assertSame($response->getHeaderLine('CustomHeader2'), $config['*']['CustomHeader2']['value']); } public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWhenRouteMatched(): void { - $responseHeader = new ResponseHeaderMiddleware([ + $config = [ '*' => [ 'CustomHeader1' => [ 'value' => 'CustomHeader1-Value', @@ -132,7 +139,8 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh 'value' => 'header3', ], ], - ]); + ]; + $responseHeader = new ResponseHeaderMiddleware($config); $response = new Response(); @@ -145,9 +153,12 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh $this->assertCount(2, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); + $this->assertSame($response->getHeaderLine('CustomHeader1'), $config['*']['CustomHeader1']['value']); + $this->assertSame($response->getHeaderLine('CustomHeader2'), $config['*']['CustomHeader2']['value']); $response = $responseHeader->addHeaders($response, 'home'); $this->assertCount(3, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader')); + $this->assertSame($response->getHeaderLine('CustomHeader'), $config['home']['CustomHeader']['value']); } } From 064b5b778dfdeef081d91234829fb2cb643ecc1d Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Fri, 28 Jul 2023 16:37:31 +0300 Subject: [PATCH 09/10] Further test improvements --- .../ResponseHeaderMiddlewareTest.php | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/test/Middleware/ResponseHeaderMiddlewareTest.php b/test/Middleware/ResponseHeaderMiddlewareTest.php index 275f8f2..40c7c91 100644 --- a/test/Middleware/ResponseHeaderMiddlewareTest.php +++ b/test/Middleware/ResponseHeaderMiddlewareTest.php @@ -82,8 +82,8 @@ public function testWillAddHeadersWithCommonWithoutRouteSpecificHeadersConfigure $this->assertCount(2, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); - $this->assertSame($response->getHeaderLine('CustomHeader1'), $config['*']['CustomHeader1']['value']); - $this->assertSame($response->getHeaderLine('CustomHeader2'), $config['*']['CustomHeader2']['value']); + $this->assertSame($config['*']['CustomHeader1']['value'], $response->getHeaderLine('CustomHeader1')); + $this->assertSame($config['*']['CustomHeader2']['value'], $response->getHeaderLine('CustomHeader2')); } public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWhenNoRouteMatched(): void @@ -117,8 +117,8 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh $this->assertCount(2, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); - $this->assertSame($response->getHeaderLine('CustomHeader1'), $config['*']['CustomHeader1']['value']); - $this->assertSame($response->getHeaderLine('CustomHeader2'), $config['*']['CustomHeader2']['value']); + $this->assertSame($config['*']['CustomHeader1']['value'], $response->getHeaderLine('CustomHeader1')); + $this->assertSame($config['*']['CustomHeader2']['value'], $response->getHeaderLine('CustomHeader2')); } public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWhenRouteMatched(): void @@ -131,13 +131,21 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh ], 'CustomHeader2' => [ 'value' => 'CustomHeader2-Value', - 'overwrite' => false, + 'overwrite' => true, ], ], 'home' => [ - 'CustomHeader' => [ + 'CustomHeader' => [ 'value' => 'header3', ], + 'CustomHeader1' => [ + 'value' => 'CustomHeader1-Overwritten-Value', + 'overwrite' => true, + ], + 'CustomHeader2' => [ + 'value' => 'CustomHeader2-Overwritten-Value', + 'overwrite' => false, + ], ], ]; $responseHeader = new ResponseHeaderMiddleware($config); @@ -153,12 +161,17 @@ public function testWillAddHeadersWithCommonWithRouteSpecificHeadersConfiguredWh $this->assertCount(2, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader1')); $this->assertTrue($response->hasHeader('CustomHeader2')); - $this->assertSame($response->getHeaderLine('CustomHeader1'), $config['*']['CustomHeader1']['value']); - $this->assertSame($response->getHeaderLine('CustomHeader2'), $config['*']['CustomHeader2']['value']); + $this->assertSame($config['*']['CustomHeader1']['value'], $response->getHeaderLine('CustomHeader1')); + $this->assertSame($config['*']['CustomHeader2']['value'], $response->getHeaderLine('CustomHeader2')); $response = $responseHeader->addHeaders($response, 'home'); $this->assertCount(3, $response->getHeaders()); $this->assertTrue($response->hasHeader('CustomHeader')); - $this->assertSame($response->getHeaderLine('CustomHeader'), $config['home']['CustomHeader']['value']); + $this->assertTrue($response->hasHeader('CustomHeader1')); + $this->assertTrue($response->hasHeader('CustomHeader2')); + $this->assertSame($config['home']['CustomHeader']['value'], $response->getHeaderLine('CustomHeader')); + $this->assertSame($config['home']['CustomHeader1']['value'], $response->getHeaderLine('CustomHeader1')); + $this->assertSame($config['*']['CustomHeader2']['value'], $response->getHeaderLine('CustomHeader2')); + $this->assertNotSame($config['home']['CustomHeader2']['value'], $response->getHeaderLine('CustomHeader2')); } } From 0208ea3d8ea2e5496c14565de54bf660e09c62f8 Mon Sep 17 00:00:00 2001 From: PopNatanael Date: Fri, 28 Jul 2023 17:03:52 +0300 Subject: [PATCH 10/10] Namespace changes --- test/Factory/ResponseHeaderMiddlewareFactoryTest.php | 2 +- test/Middleware/ResponseHeaderMiddlewareTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Factory/ResponseHeaderMiddlewareFactoryTest.php b/test/Factory/ResponseHeaderMiddlewareFactoryTest.php index e7aed41..7995468 100644 --- a/test/Factory/ResponseHeaderMiddlewareFactoryTest.php +++ b/test/Factory/ResponseHeaderMiddlewareFactoryTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DotTest\ResponseHeader; +namespace DotTest\ResponseHeader\Factory; use Dot\ResponseHeader\Factory\ResponseHeaderMiddlewareFactory; use PHPUnit\Framework\MockObject\Exception; diff --git a/test/Middleware/ResponseHeaderMiddlewareTest.php b/test/Middleware/ResponseHeaderMiddlewareTest.php index 40c7c91..5e929bb 100644 --- a/test/Middleware/ResponseHeaderMiddlewareTest.php +++ b/test/Middleware/ResponseHeaderMiddlewareTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DotTest\ResponseHeader; +namespace DotTest\ResponseHeader\Middleware; use Dot\ResponseHeader\Middleware\ResponseHeaderMiddleware; use Laminas\Diactoros\Response;