diff --git a/.gitignore b/.gitignore index b5a07c55..5ced1162 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /docs/coverage/ +/docs/infection/ /site/ vendor/ /.php-cs-fixer.cache @@ -10,3 +11,4 @@ phpunit.xml composer.phar packages.json results.sarif +infection.log diff --git a/Makefile b/Makefile index 57dc7e12..84a42c12 100644 --- a/Makefile +++ b/Makefile @@ -55,6 +55,9 @@ test-clock: phpunit test-cqrs: PHPUNIT_TESTSUITE=cqrs test-cqrs: phpunit +test-http-factory: PHPUNIT_TESTSUITE=http-factory +test-http-factory: phpunit + test-link: PHPUNIT_TESTSUITE=link test-link: phpunit @@ -165,6 +168,13 @@ php-cs-fixer-upgrade: testdox: ## Run tests and output testdox XDEBUG_MODE=off $(PHP) -dxdebug.mode=off $(PHPUNIT) --testdox +infection: + XDEBUG_MODE=develop \ + $(PHP) \ + -dxdebug.mode=develop \ + -dapc.enable_cli=1 \ + tools/infection/vendor/bin/infection --debug -vvv --show-mutations + tools-install: psalm-install php-cs-fixer-install phpunit-install tools-upgrade: psalm-upgrade php-cs-fixer-upgrade phpunit-upgrade diff --git a/infection.json5 b/infection.json5 new file mode 100644 index 00000000..94714207 --- /dev/null +++ b/infection.json5 @@ -0,0 +1,26 @@ +{ + "$schema": "https://raw.githubusercontent.com/infection/infection/0.27.8/resources/schema.json", + "source": { + "directories": [ + "." + ], + "excludes": [ + "docs", + "tools", + "vendor", + "Tests" + ] + }, + "mutators": { + "@default": true + }, + "logs": { + "html": "docs/infection/index.html" + }, + "phpUnit": { + "configDir": ".", + "customPath": "tools\/phpunit\/vendor\/bin\/phpunit" + }, + "testFrameworkOptions": "--testsuite=all", + "initialTestsPhpOptions": "-dxdebug.mode=coverage -dapc.enable_cli=1" +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 5be7804d..ae5f3b3a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -86,7 +86,7 @@ - + diff --git a/src/SonsOfPHP/Bridge/Symfony/EventSourcing/Tests/Message/MessageNormalizerTest.php b/src/SonsOfPHP/Bridge/Symfony/EventSourcing/Tests/Message/MessageNormalizerTest.php index 0b0f11a3..531ab123 100644 --- a/src/SonsOfPHP/Bridge/Symfony/EventSourcing/Tests/Message/MessageNormalizerTest.php +++ b/src/SonsOfPHP/Bridge/Symfony/EventSourcing/Tests/Message/MessageNormalizerTest.php @@ -10,8 +10,6 @@ use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -class Msg extends AbstractMessage {} - /** * @coversDefaultClass \SonsOfPHP\Bridge\Symfony\EventSourcing\Message\MessageNormalizer * @@ -40,7 +38,8 @@ public function testItWillNormalizeMessage(): void { $normalizer = new MessageNormalizer(); - $message = Msg::new(); + $message = new class extends AbstractMessage { + }; $this->assertTrue($normalizer->supportsNormalization($message)); @@ -49,30 +48,4 @@ public function testItWillNormalizeMessage(): void $this->assertArrayHasKey('payload', $output); $this->assertArrayHasKey('metadata', $output); } - - /** - * @covers ::denormalize - * @covers ::supportsDenormalization - */ - public function testItWillDenormalizeMessage(): void - { - $normalizer = new MessageNormalizer(); - - $data = [ - 'payload' => [ - 'unit' => 'test', - ], - 'metadata' => [ - 'test' => 'unit', - ], - ]; - $type = Msg::class; - - $this->assertTrue($normalizer->supportsDenormalization($data, $type)); - - $output = $normalizer->denormalize($data, $type); - - $this->assertSame('test', $output->getPayload()['unit']); - $this->assertSame('unit', $output->getMetadata()['test']); - } } diff --git a/src/SonsOfPHP/Component/Cqrs/AbstractCommandMessageHandler.php b/src/SonsOfPHP/Component/Cqrs/AbstractCommandMessageHandler.php index 28c73466..7fa52e86 100644 --- a/src/SonsOfPHP/Component/Cqrs/AbstractCommandMessageHandler.php +++ b/src/SonsOfPHP/Component/Cqrs/AbstractCommandMessageHandler.php @@ -4,6 +4,8 @@ namespace SonsOfPHP\Component\Cqrs; +use SonsOfPHP\Contract\Cqrs\CommandMessageHandlerInterface; + /** * @author Joshua Estes */ diff --git a/src/SonsOfPHP/Component/Cqrs/AbstractQueryMessageHandler.php b/src/SonsOfPHP/Component/Cqrs/AbstractQueryMessageHandler.php index e4b76bf6..6b7d99de 100644 --- a/src/SonsOfPHP/Component/Cqrs/AbstractQueryMessageHandler.php +++ b/src/SonsOfPHP/Component/Cqrs/AbstractQueryMessageHandler.php @@ -4,6 +4,8 @@ namespace SonsOfPHP\Component\Cqrs; +use SonsOfPHP\Contract\Cqrs\QueryMessageHandlerInterface; + /** * @author Joshua Estes */ diff --git a/src/SonsOfPHP/Component/EventSourcing/Tests/Aggregate/Repository/AggregateRepositoryTest.php b/src/SonsOfPHP/Component/EventSourcing/Tests/Aggregate/Repository/AggregateRepositoryTest.php index 328da0c6..325040db 100644 --- a/src/SonsOfPHP/Component/EventSourcing/Tests/Aggregate/Repository/AggregateRepositoryTest.php +++ b/src/SonsOfPHP/Component/EventSourcing/Tests/Aggregate/Repository/AggregateRepositoryTest.php @@ -14,8 +14,6 @@ use SonsOfPHP\Component\EventSourcing\Message\Repository\MessageRepositoryInterface; use SonsOfPHP\Component\EventSourcing\Tests\FakeAggregate; -class Msg extends AbstractMessage {} - /** * @coversDefaultClass \SonsOfPHP\Component\EventSourcing\Aggregate\Repository\AggregateRepository * @@ -70,7 +68,7 @@ public function testPersistWillUseEventDispatcher(): void $aggregate = new FakeAggregate('unique-id'); - $message = Msg::new(); + $message = new class extends AbstractMessage {}; $aggregate->raiseThisEvent($message); $repository->persist($aggregate); @@ -90,7 +88,7 @@ public function testPersistAndFind(): void $aggregate = new FakeAggregate('unique-id'); - $message = Msg::new(); + $message = new class extends AbstractMessage {}; $aggregate->raiseThisEvent($message); $repository->persist($aggregate); @@ -113,7 +111,7 @@ public function testPersistAndFindWithoutUsingAggregateId(): void $aggregate = new FakeAggregate('unique-id'); - $message = Msg::new(); + $message = new class extends AbstractMessage {}; $aggregate->raiseThisEvent($message); $repository->persist($aggregate); diff --git a/src/SonsOfPHP/Component/EventSourcing/Tests/Message/AbstractMessageTest.php b/src/SonsOfPHP/Component/EventSourcing/Tests/Message/AbstractMessageTest.php index 06d12356..6a5309b7 100644 --- a/src/SonsOfPHP/Component/EventSourcing/Tests/Message/AbstractMessageTest.php +++ b/src/SonsOfPHP/Component/EventSourcing/Tests/Message/AbstractMessageTest.php @@ -12,8 +12,6 @@ use SonsOfPHP\Component\EventSourcing\Message\MessageInterface; use SonsOfPHP\Component\EventSourcing\Metadata; -class Msg extends AbstractMessage {} - /** * @coversDefaultClass \SonsOfPHP\Component\EventSourcing\Message\AbstractMessage * @@ -31,7 +29,7 @@ final class AbstractMessageTest extends TestCase */ public function testItHasTheRightInterface(): void { - $message = Msg::new(); + $message = $this->createMock(AbstractMessage::class); $this->assertInstanceOf(MessageInterface::class, $message); } @@ -41,7 +39,7 @@ public function testItHasTheRightInterface(): void */ public function testGetMetadataHasEmptyArraryAsDefaultValue(): void { - $message = Msg::new(); + $message = $this->createMock(AbstractMessage::class)::new(); $this->assertCount(6, $message->getMetadata()); } @@ -51,7 +49,7 @@ public function testGetMetadataHasEmptyArraryAsDefaultValue(): void */ public function testWithMetadataReturnsNewStatic(): void { - $message = Msg::new(); + $message = $this->createMock(AbstractMessage::class)::new(); $return = $message->withMetadata([ Metadata::EVENT_TYPE => 'test', @@ -64,7 +62,8 @@ public function testWithMetadataReturnsNewStatic(): void */ public function testWithMetadataWorksCorrectly(): void { - $message = Msg::new()->withMetadata([ + $message = $this->createMock(AbstractMessage::class); + $message = $message::new()->withMetadata([ Metadata::EVENT_TYPE => 'test', ]); @@ -81,7 +80,7 @@ public function testWithMetadataWorksCorrectly(): void */ public function testGettersWithEmptyMetadata(): void { - $message = Msg::new(); + $message = $this->createMock(AbstractMessage::class)::new(); $this->expectException(EventSourcingException::class); $this->assertSame('', $message->getEventId()); @@ -103,7 +102,8 @@ public function testGettersWithEmptyMetadata(): void */ public function testGettersWithMetadata(): void { - $message = Msg::new()->withMetadata([ + $message = $this->createMock(AbstractMessage::class); + $message = $message::new()->withMetadata([ Metadata::EVENT_ID => 'event-id', Metadata::EVENT_TYPE => 'event.type', Metadata::TIMESTAMP => '2022-04-20', @@ -126,7 +126,8 @@ public function testGettersWithMetadata(): void */ public function testGetAggregateIdReturnsCorrectInterface(): void { - $message = Msg::new()->withMetadata([ + $message = $this->createMock(AbstractMessage::class); + $message = $message::new()->withMetadata([ Metadata::AGGREGATE_ID => 'aggregate-id', ]); @@ -139,7 +140,8 @@ public function testGetAggregateIdReturnsCorrectInterface(): void */ public function testGetAggregateVersionReturnsCorrectInterface(): void { - $message = Msg::new()->withMetadata([ + $message = $this->createMock(AbstractMessage::class); + $message = $message::new()->withMetadata([ Metadata::AGGREGATE_VERSION => 123, ]); @@ -151,7 +153,7 @@ public function testGetAggregateVersionReturnsCorrectInterface(): void */ public function testGetPayloadHasEmptyArraryAsDefaultValue(): void { - $message = Msg::new(); + $message = $this->createMock(AbstractMessage::class)::new(); $this->assertCount(0, $message->getPayload()); } @@ -161,7 +163,7 @@ public function testGetPayloadHasEmptyArraryAsDefaultValue(): void */ public function testWithPayloadReturnsNewStatic(): void { - $message = Msg::new(); + $message = $this->createMock(AbstractMessage::class)::new(); $return = $message->withPayload([ 'key' => 'val', @@ -174,7 +176,8 @@ public function testWithPayloadReturnsNewStatic(): void */ public function testWithPayloadWorksCorrectly(): void { - $message = Msg::new()->withPayload([ + $message = $this->createMock(AbstractMessage::class); + $message = $message::new()->withPayload([ 'key' => 'val', ]); diff --git a/src/SonsOfPHP/Component/EventSourcing/Tests/Message/Enricher/MessageEnricherTest.php b/src/SonsOfPHP/Component/EventSourcing/Tests/Message/Enricher/MessageEnricherTest.php index 8f87ef2d..a0c5d434 100644 --- a/src/SonsOfPHP/Component/EventSourcing/Tests/Message/Enricher/MessageEnricherTest.php +++ b/src/SonsOfPHP/Component/EventSourcing/Tests/Message/Enricher/MessageEnricherTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\EventSourcing\Tests\Message; +namespace SonsOfPHP\Component\EventSourcing\Tests\Message\Enricher; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\EventSourcing\Message\Enricher\Handler\NullMessageEnricherHandler; diff --git a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ChainAdapterTest.php b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ChainAdapterTest.php index 75b8c36c..426550e8 100644 --- a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ChainAdapterTest.php +++ b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ChainAdapterTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Filesystem\Tests; +namespace SonsOfPHP\Component\Filesystem\Tests\Adapter; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\Filesystem\Adapter\AdapterInterface; diff --git a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/InMemoryAdapterTest.php b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/InMemoryAdapterTest.php index ef9fa5b9..135fa225 100644 --- a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/InMemoryAdapterTest.php +++ b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/InMemoryAdapterTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Filesystem\Tests; +namespace SonsOfPHP\Component\Filesystem\Tests\Adapter; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\Filesystem\Adapter\AdapterInterface; diff --git a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NativeAdapterTest.php b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NativeAdapterTest.php index 833833d1..2474974a 100644 --- a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NativeAdapterTest.php +++ b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NativeAdapterTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Filesystem\Tests; +namespace SonsOfPHP\Component\Filesystem\Tests\Adapter; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\Filesystem\Adapter\AdapterInterface; diff --git a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NullAdapterTest.php b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NullAdapterTest.php index 654d747a..f95a1084 100644 --- a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NullAdapterTest.php +++ b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/NullAdapterTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Filesystem\Tests; +namespace SonsOfPHP\Component\Filesystem\Tests\Adapter; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\Filesystem\Adapter\AdapterInterface; diff --git a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ReadOnlyAdapterTest.php b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ReadOnlyAdapterTest.php index 939058de..32f9597b 100644 --- a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ReadOnlyAdapterTest.php +++ b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/ReadOnlyAdapterTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Filesystem\Tests; +namespace SonsOfPHP\Component\Filesystem\Tests\Adapter; use PHPUnit\Framework\MockObject; use PHPUnit\Framework\TestCase; diff --git a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/WormAdapterTest.php b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/WormAdapterTest.php index dbaae807..66569e7e 100644 --- a/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/WormAdapterTest.php +++ b/src/SonsOfPHP/Component/Filesystem/Tests/Adapter/WormAdapterTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Filesystem\Tests; +namespace SonsOfPHP\Component\Filesystem\Tests\Adapter; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\Filesystem\Adapter\AdapterInterface; diff --git a/src/SonsOfPHP/Component/HttpFactory/HttpFactory.php b/src/SonsOfPHP/Component/HttpFactory/HttpFactory.php index e8ad321a..1a63bd7a 100644 --- a/src/SonsOfPHP/Component/HttpFactory/HttpFactory.php +++ b/src/SonsOfPHP/Component/HttpFactory/HttpFactory.php @@ -15,7 +15,7 @@ final class HttpFactory implements RequestFactoryInterface { use RequestFactoryTrait; use ResponseFactoryTrait; - use ServerResponseFactoryTrait; + use ServerRequestFactoryTrait; use StreamFactoryTrait; use UploadedFileFactoryTrait; use UriFactoryTrait; diff --git a/src/SonsOfPHP/Component/HttpFactory/Tests/ResponseFactoryTest.php b/src/SonsOfPHP/Component/HttpFactory/Tests/ResponseFactoryTest.php index 13bb0373..b94da85b 100644 --- a/src/SonsOfPHP/Component/HttpFactory/Tests/ResponseFactoryTest.php +++ b/src/SonsOfPHP/Component/HttpFactory/Tests/ResponseFactoryTest.php @@ -11,6 +11,7 @@ /** * @coversDefaultClass \SonsOfPHP\Component\HttpFactory\ResponseFactory + * @uses \SonsOfPHP\Component\HttpMessage\Response */ final class ResponseFactoryTest extends TestCase { @@ -23,13 +24,21 @@ public function testItImplementsCorrectInterface(): void } /** + * @dataProvider validCreateResponseProvider + * * @covers ::createResponse - * @uses \SonsOfPHP\Component\HttpMessage\Response */ - public function testCreateResponseWorksAsExpected(): void + public function testCreateResponseWorksAsExpected(int $code, string $reasonPhrase): void { $factory = new ResponseFactory(); - $this->assertInstanceOf(ResponseInterface::class, $factory->createResponse()); + $this->assertInstanceOf(ResponseInterface::class, $factory->createResponse($code, $reasonPhrase)); + } + + public static function validCreateResponseProvider(): iterable + { + yield [200, 'OK']; + yield [201, 'Not Content']; + yield [404, 'Not Found']; } } diff --git a/src/SonsOfPHP/Component/Money/Tests/CurrencyTest.php b/src/SonsOfPHP/Component/Money/Tests/CurrencyTest.php index 299e6ccc..764d13a3 100644 --- a/src/SonsOfPHP/Component/Money/Tests/CurrencyTest.php +++ b/src/SonsOfPHP/Component/Money/Tests/CurrencyTest.php @@ -16,6 +16,16 @@ */ final class CurrencyTest extends TestCase { + /** + * @covers ::__construct + */ + public function testContructWillValidateCurrencyCode(): void + { + $currency = new Currency('usd'); + + $this->assertSame('USD', $currency->getCurrencyCode()); + } + /** * @covers ::__callStatic * @covers ::__construct diff --git a/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/GetCurrencyQueryTest.php b/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/GetCurrencyQueryTest.php index c4a89a3a..a3fae2cc 100644 --- a/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/GetCurrencyQueryTest.php +++ b/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/GetCurrencyQueryTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Money\Tests\Query\Currency; +namespace SonsOfPHP\Component\Money\Tests\Query\CurrencyProvider; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\Money\Currency; diff --git a/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/HasCurrencyQueryTest.php b/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/HasCurrencyQueryTest.php index 922f0019..ce889b40 100644 --- a/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/HasCurrencyQueryTest.php +++ b/src/SonsOfPHP/Component/Money/Tests/Query/CurrencyProvider/HasCurrencyQueryTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace SonsOfPHP\Component\Money\Tests\Query\Currency; +namespace SonsOfPHP\Component\Money\Tests\Query\CurrencyProvider; use PHPUnit\Framework\TestCase; use SonsOfPHP\Component\Money\Currency; diff --git a/tools/infection/composer.json b/tools/infection/composer.json new file mode 100644 index 00000000..52c4ca17 --- /dev/null +++ b/tools/infection/composer.json @@ -0,0 +1,10 @@ +{ + "require": { + "infection/infection": "^0.27.8" + }, + "config": { + "allow-plugins": { + "infection/extension-installer": true + } + } +}