From 9b82f9f19edf1b5ca9a9cd1195813ffc6a3d80b4 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Tue, 27 Jan 2026 17:22:43 +0300 Subject: [PATCH 1/4] step one --- .github/workflows/mutation.yml | 2 +- composer.json | 4 +++- tests/Attribute/Parameter/BodyTest.php | 20 ++++++++++++++++++++ tests/Attribute/Parameter/RequestTest.php | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/.github/workflows/mutation.yml b/.github/workflows/mutation.yml index c7fccb9..a0eceb0 100644 --- a/.github/workflows/mutation.yml +++ b/.github/workflows/mutation.yml @@ -28,6 +28,6 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.3'] + ['8.4'] secrets: STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} diff --git a/composer.json b/composer.json index 8325685..d389032 100644 --- a/composer.json +++ b/composer.json @@ -46,6 +46,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.93", + "httpsoft/http-message": "^1.1", "maglnet/composer-require-checker": "^4.7.1", "phpunit/phpunit": "^10.5.45", "rector/rector": "^2.0.11", @@ -85,6 +86,7 @@ "scripts": { "test": "phpunit --testdox --no-interaction", "test-watch": "phpunit-watcher watch", - "cs-fix": "php-cs-fixer fix" + "cs-fix": "php-cs-fixer fix", + "infection": "infection --threads=max" } } diff --git a/tests/Attribute/Parameter/BodyTest.php b/tests/Attribute/Parameter/BodyTest.php index eee0ed4..8014319 100644 --- a/tests/Attribute/Parameter/BodyTest.php +++ b/tests/Attribute/Parameter/BodyTest.php @@ -4,6 +4,9 @@ namespace Yiisoft\Input\Http\Tests\Attribute\Parameter; +use HttpSoft\Message\Request; +use HttpSoft\Message\ServerRequest; +use HttpSoft\Message\ServerRequestFactory; use PHPUnit\Framework\TestCase; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\Hydrator\AttributeHandling\Exception\UnexpectedAttributeException; @@ -78,6 +81,23 @@ public function testNonExistPath(): void $this->assertSame('', $input->a); } + public function testNonExistPathReturnsFailResult(): void + { + $request = new ServerRequest(parsedBody: ['a' => 'one']); + + $requestProvider = new RequestProvider(); + $requestProvider->set($request); + + $resolver = new BodyResolver($requestProvider); + + $attribute = new Body('non-existing-key'); + $context = TestHelper::createParameterAttributeResolveContext(); + + $result = $resolver->getParameterValue($attribute, $context); + + $this->assertFalse($result->isResolved()); + } + public function testUnexpectedAttributeException(): void { $resolver = new BodyResolver($this->createMock(RequestProviderInterface::class)); diff --git a/tests/Attribute/Parameter/RequestTest.php b/tests/Attribute/Parameter/RequestTest.php index 5cfcf35..a4cc0a1 100644 --- a/tests/Attribute/Parameter/RequestTest.php +++ b/tests/Attribute/Parameter/RequestTest.php @@ -4,6 +4,7 @@ namespace Yiisoft\Input\Http\Tests\Attribute\Parameter; +use HttpSoft\Message\ServerRequest; use PHPUnit\Framework\TestCase; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\Hydrator\AttributeHandling\Exception\UnexpectedAttributeException; @@ -78,6 +79,23 @@ public function testNonExistPath(): void $this->assertSame('', $input->a); } + public function testNonExistPathReturnsFailResult(): void + { + $request = (new ServerRequest())->withAttribute('a', 'one');; + + $requestProvider = new RequestProvider(); + $requestProvider->set($request); + + $resolver = new RequestResolver($requestProvider); + + $attribute = new Request('non-existing-key'); + $context = TestHelper::createParameterAttributeResolveContext(); + + $result = $resolver->getParameterValue($attribute, $context); + + $this->assertFalse($result->isResolved()); + } + public function testUnexpectedAttributeException(): void { $resolver = new RequestResolver($this->createMock(RequestProviderInterface::class)); From 2af17c21d3970739ae919f4969a0010d38af854b Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Tue, 27 Jan 2026 17:35:05 +0300 Subject: [PATCH 2/4] Kill mutants --- .../CustomHydrator/CustomHydratorTest.php | 55 +++++++++++++++++++ .../CustomHydrator/User.php | 13 +++++ ...ydratorAttributeParametersResolverTest.php | 2 +- tests/Support/CallableTypeCaster.php | 2 +- 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 tests/HydratorAttributeParametersResolver/CustomHydrator/CustomHydratorTest.php create mode 100644 tests/HydratorAttributeParametersResolver/CustomHydrator/User.php rename tests/{ => HydratorAttributeParametersResolver}/HydratorAttributeParametersResolverTest.php (97%) diff --git a/tests/HydratorAttributeParametersResolver/CustomHydrator/CustomHydratorTest.php b/tests/HydratorAttributeParametersResolver/CustomHydrator/CustomHydratorTest.php new file mode 100644 index 0000000..fb74a7f --- /dev/null +++ b/tests/HydratorAttributeParametersResolver/CustomHydrator/CustomHydratorTest.php @@ -0,0 +1,55 @@ + 'Vasya']); + $requestProvider = new RequestProvider(); + $requestProvider->set($request); + + $resolver = new HydratorAttributeParametersResolver( + TestHelper::createParameterAttributesHandler([ + BodyResolver::class => new BodyResolver($requestProvider), + ]), + typeCaster: new CallableTypeCaster( + static fn(mixed $value, TypeCastContext $context) => $context->getHydrator()->create(User::class, [ + 'name' => $value, + ]), + ), + hydrator: new Hydrator( + new CallableTypeCaster( + static fn(mixed $value) => 'The ' . $value, + ), + ), + ); + + $parameters = TestHelper::getParameters( + static fn( + #[Body] + User $user, + ) => null, + ); + + $result = $resolver->resolve($parameters, $request); + + $this->assertSame(['user'], array_keys($result)); + $this->assertInstanceOf(User::class, $result['user']); + $this->assertSame('The Vasya', $result['user']->name); + } +} diff --git a/tests/HydratorAttributeParametersResolver/CustomHydrator/User.php b/tests/HydratorAttributeParametersResolver/CustomHydrator/User.php new file mode 100644 index 0000000..e368452 --- /dev/null +++ b/tests/HydratorAttributeParametersResolver/CustomHydrator/User.php @@ -0,0 +1,13 @@ +callable)($value)); + return Result::success(($this->callable)($value, $context)); } } From 871e78c21de5d9b4fc90b0c5ed041d7fcc594cc5 Mon Sep 17 00:00:00 2001 From: vjik <525501+vjik@users.noreply.github.com> Date: Tue, 27 Jan 2026 14:36:02 +0000 Subject: [PATCH 3/4] Apply PHP CS Fixer and Rector changes (CI) --- tests/Attribute/Parameter/BodyTest.php | 2 -- tests/Attribute/Parameter/RequestTest.php | 3 ++- .../CustomHydrator/User.php | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/Attribute/Parameter/BodyTest.php b/tests/Attribute/Parameter/BodyTest.php index 8014319..0a2874e 100644 --- a/tests/Attribute/Parameter/BodyTest.php +++ b/tests/Attribute/Parameter/BodyTest.php @@ -4,9 +4,7 @@ namespace Yiisoft\Input\Http\Tests\Attribute\Parameter; -use HttpSoft\Message\Request; use HttpSoft\Message\ServerRequest; -use HttpSoft\Message\ServerRequestFactory; use PHPUnit\Framework\TestCase; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\Hydrator\AttributeHandling\Exception\UnexpectedAttributeException; diff --git a/tests/Attribute/Parameter/RequestTest.php b/tests/Attribute/Parameter/RequestTest.php index a4cc0a1..ff50859 100644 --- a/tests/Attribute/Parameter/RequestTest.php +++ b/tests/Attribute/Parameter/RequestTest.php @@ -81,7 +81,8 @@ public function testNonExistPath(): void public function testNonExistPathReturnsFailResult(): void { - $request = (new ServerRequest())->withAttribute('a', 'one');; + $request = (new ServerRequest())->withAttribute('a', 'one'); + ; $requestProvider = new RequestProvider(); $requestProvider->set($request); diff --git a/tests/HydratorAttributeParametersResolver/CustomHydrator/User.php b/tests/HydratorAttributeParametersResolver/CustomHydrator/User.php index e368452..b9895f6 100644 --- a/tests/HydratorAttributeParametersResolver/CustomHydrator/User.php +++ b/tests/HydratorAttributeParametersResolver/CustomHydrator/User.php @@ -8,6 +8,5 @@ final class User { public function __construct( public readonly string $name, - ) { - } + ) {} } From 04873074848ae387ceea1d6c4fe62c8faf723a17 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Tue, 27 Jan 2026 17:45:56 +0300 Subject: [PATCH 4/4] Update tests/Attribute/Parameter/RequestTest.php Co-authored-by: Maksim Spirkov <63721828+mspirkov@users.noreply.github.com> --- tests/Attribute/Parameter/RequestTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Attribute/Parameter/RequestTest.php b/tests/Attribute/Parameter/RequestTest.php index ff50859..19ab8c4 100644 --- a/tests/Attribute/Parameter/RequestTest.php +++ b/tests/Attribute/Parameter/RequestTest.php @@ -82,7 +82,6 @@ public function testNonExistPath(): void public function testNonExistPathReturnsFailResult(): void { $request = (new ServerRequest())->withAttribute('a', 'one'); - ; $requestProvider = new RequestProvider(); $requestProvider->set($request);