diff --git a/phpstan.neon b/phpstan.neon index 347fb16a..a5e89874 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -11,5 +11,11 @@ parameters: # Symfony DI - '#Cannot call method end\(\) on Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface\|null.#' + - "/Call to function method_exists.. with 'Symfony.+' and 'getRootNode' will always evaluate to false./" + + # PHPUnit + - + message: '#Property .*::\$.* has no typehint specified.#' + path: tests/ - '#Core23\\Doctrine\\Tests\\Fixtures\\DemoEntityManager::__construct\(\) does not call parent constructor from Sonata\\Doctrine\\Model\\BaseManager.#' diff --git a/src/Bridge/Symfony/DependencyInjection/Configuration.php b/src/Bridge/Symfony/DependencyInjection/Configuration.php index c00aaa60..90e2bf4e 100644 --- a/src/Bridge/Symfony/DependencyInjection/Configuration.php +++ b/src/Bridge/Symfony/DependencyInjection/Configuration.php @@ -22,7 +22,7 @@ public function getConfigTreeBuilder() $treeBuilder = new TreeBuilder('core23_doctrine'); // Keep compatibility with symfony/config < 4.2 - if (!method_exists($treeBuilder, 'getRootNode')) { + if (!method_exists(TreeBuilder::class, 'getRootNode')) { $rootNode = $treeBuilder->root('core23_doctrine'); } else { $rootNode = $treeBuilder->getRootNode(); diff --git a/src/Test/ORM/EntityManagerMockFactory.php b/src/Test/ORM/EntityManagerMockFactory.php index ac8a9afc..531328e7 100644 --- a/src/Test/ORM/EntityManagerMockFactory.php +++ b/src/Test/ORM/EntityManagerMockFactory.php @@ -28,7 +28,7 @@ final class EntityManagerMockFactory * * @return EntityManager|MockObject */ - public static function create(TestCase $test, Closure $qbCallback, $fields): MockObject + public static function create(TestCase $test, Closure $qbCallback, array $fields): MockObject { $qb = $test->getMockBuilder(QueryBuilder::class)->disableOriginalConstructor()->getMock(); @@ -65,7 +65,10 @@ private static function prepareQueryBuilder(TestCase $test, MockObject $qb): voi $qb->method('leftJoin')->willReturn($qb); } - private static function prepareMetadata(TestCase $test, $fields): MockObject + /** + * @param string[] $fields + */ + private static function prepareMetadata(TestCase $test, array $fields): MockObject { $metadata = $test->getMockBuilder(ClassMetadataInfo::class)->disableOriginalConstructor()->getMock(); $metadata->method('getFieldNames')->willReturn($fields); diff --git a/tests/Bridge/Symfony/Bundle/Core23DoctrineBundleTest.php b/tests/Bridge/Symfony/Bundle/Core23DoctrineBundleTest.php index 52c69d11..9ebb89a0 100644 --- a/tests/Bridge/Symfony/Bundle/Core23DoctrineBundleTest.php +++ b/tests/Bridge/Symfony/Bundle/Core23DoctrineBundleTest.php @@ -12,17 +12,9 @@ use Core23\Doctrine\Bridge\Symfony\Bundle\Core23DoctrineBundle; use Core23\Doctrine\Bridge\Symfony\DependencyInjection\Core23DoctrineExtension; use PHPUnit\Framework\TestCase; -use Symfony\Component\HttpKernel\Bundle\BundleInterface; final class Core23DoctrineBundleTest extends TestCase { - public function testItIsInstantiable(): void - { - $bundle = new Core23DoctrineBundle(); - - static::assertInstanceOf(BundleInterface::class, $bundle); - } - public function testGetPath(): void { $bundle = new Core23DoctrineBundle(); diff --git a/tests/Bridge/Symfony/DependencyInjection/Core23DoctrineExtensionTest.php b/tests/Bridge/Symfony/DependencyInjection/Core23DoctrineExtensionTest.php index 2f60ccd9..c096666a 100644 --- a/tests/Bridge/Symfony/DependencyInjection/Core23DoctrineExtensionTest.php +++ b/tests/Bridge/Symfony/DependencyInjection/Core23DoctrineExtensionTest.php @@ -12,6 +12,12 @@ namespace Core23\Doctrine\Tests\Bridge\Symfony\DependencyInjection; use Core23\Doctrine\Bridge\Symfony\DependencyInjection\Core23DoctrineExtension; +use Core23\Doctrine\EventListener\ORM\ConfirmableListener; +use Core23\Doctrine\EventListener\ORM\DeletableListener; +use Core23\Doctrine\EventListener\ORM\LifecycleDateListener; +use Core23\Doctrine\EventListener\ORM\SortableListener; +use Core23\Doctrine\EventListener\ORM\TablePrefixEventListener; +use Core23\Doctrine\EventListener\ORM\UniqueActiveListener; use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase; final class Core23DoctrineExtensionTest extends AbstractExtensionTestCase @@ -20,7 +26,12 @@ public function testLoadDefault(): void { $this->load(); - static::assertTrue(true); + $this->assertContainerBuilderHasService(ConfirmableListener::class); + $this->assertContainerBuilderHasService(DeletableListener::class); + $this->assertContainerBuilderHasService(LifecycleDateListener::class); + $this->assertContainerBuilderHasService(SortableListener::class); + $this->assertContainerBuilderHasService(UniqueActiveListener::class); + $this->assertContainerBuilderHasService(TablePrefixEventListener::class); } protected function getContainerExtensions() diff --git a/tests/EventListener/ORM/LifecycleDateListenerTest.php b/tests/EventListener/ORM/LifecycleDateListenerTest.php index b0629877..25a7cd51 100644 --- a/tests/EventListener/ORM/LifecycleDateListenerTest.php +++ b/tests/EventListener/ORM/LifecycleDateListenerTest.php @@ -15,6 +15,7 @@ use Core23\Doctrine\Tests\Fixtures\EmptyClass; use DateTime; use Doctrine\Common\EventSubscriber; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; use Doctrine\ORM\Events; @@ -68,15 +69,20 @@ public function testPrePersistForInvalidClass(): void { $object = $this->prophesize(stdClass::class); + $entityManager = $this->prophesize(EntityManagerInterface::class); + $eventArgs = $this->prophesize(LifecycleEventArgs::class); $eventArgs->getObject() ->willReturn($object) ; + $eventArgs->getEntityManager() + ->willReturn($entityManager) + ; $listener = new LifecycleDateListener(); $listener->prePersist($eventArgs->reveal()); - static::assertTrue(true); + $entityManager->createQueryBuilder()->shouldNotHaveBeenCalled(); } public function testPreUpdate(): void @@ -99,15 +105,20 @@ public function testPreUpdateForInvalidClass(): void { $object = $this->prophesize(stdClass::class); + $entityManager = $this->prophesize(EntityManagerInterface::class); + $eventArgs = $this->prophesize(LifecycleEventArgs::class); $eventArgs->getObject() ->willReturn($object) ; + $eventArgs->getEntityManager() + ->willReturn($entityManager) + ; $listener = new LifecycleDateListener(); $listener->preUpdate($eventArgs->reveal()); - static::assertTrue(true); + $entityManager->createQueryBuilder()->shouldNotHaveBeenCalled(); } public function testLoadClassMetadataWithNoValidData(): void diff --git a/tests/EventListener/ORM/SortableListenerTest.php b/tests/EventListener/ORM/SortableListenerTest.php index ebff638f..76fd7188 100644 --- a/tests/EventListener/ORM/SortableListenerTest.php +++ b/tests/EventListener/ORM/SortableListenerTest.php @@ -13,6 +13,7 @@ use Core23\Doctrine\Tests\Fixtures\ClassWithAllProperties; use Core23\Doctrine\Tests\Fixtures\EmptyClass; use Doctrine\Common\EventSubscriber; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; use Doctrine\ORM\Event\PreUpdateEventArgs; @@ -49,30 +50,40 @@ public function testPrePersistForInvalidClass(): void { $object = $this->prophesize(stdClass::class); + $entityManager = $this->prophesize(EntityManagerInterface::class); + $eventArgs = $this->prophesize(PreUpdateEventArgs::class); $eventArgs->getEntity() ->willReturn($object) ; + $eventArgs->getEntityManager() + ->willReturn($entityManager) + ; $listener = new SortableListener(); $listener->prePersist($eventArgs->reveal()); - static::assertTrue(true); + $entityManager->createQueryBuilder()->shouldNotHaveBeenCalled(); } public function testPreRemoveForInvalidClass(): void { $object = $this->prophesize(stdClass::class); + $entityManager = $this->prophesize(EntityManagerInterface::class); + $eventArgs = $this->prophesize(LifecycleEventArgs::class); $eventArgs->getEntity() ->willReturn($object) ; + $eventArgs->getEntityManager() + ->willReturn($entityManager) + ; $listener = new SortableListener(); $listener->preRemove($eventArgs->reveal()); - static::assertTrue(true); + $entityManager->createQueryBuilder()->shouldNotHaveBeenCalled(); } public function testLoadClassMetadataWithNoValidData(): void diff --git a/tests/EventListener/ORM/UniqueActiveListenerTest.php b/tests/EventListener/ORM/UniqueActiveListenerTest.php index a2a70fa9..9a1b5a88 100644 --- a/tests/EventListener/ORM/UniqueActiveListenerTest.php +++ b/tests/EventListener/ORM/UniqueActiveListenerTest.php @@ -13,6 +13,7 @@ use Core23\Doctrine\Tests\Fixtures\ClassWithAllProperties; use Core23\Doctrine\Tests\Fixtures\EmptyClass; use Doctrine\Common\EventSubscriber; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; use Doctrine\ORM\Event\PreUpdateEventArgs; @@ -48,30 +49,40 @@ public function testPrePersistForInvalidClass(): void { $object = $this->prophesize(stdClass::class); + $entityManager = $this->prophesize(EntityManagerInterface::class); + $eventArgs = $this->prophesize(PreUpdateEventArgs::class); $eventArgs->getEntity() ->willReturn($object) ; + $eventArgs->getEntityManager() + ->willReturn($entityManager) + ; $listener = new UniqueActiveListener(); $listener->prePersist($eventArgs->reveal()); - static::assertTrue(true); + $entityManager->createQueryBuilder()->shouldNotHaveBeenCalled(); } public function testPreUpdateForInvalidClass(): void { $object = $this->prophesize(stdClass::class); + $entityManager = $this->prophesize(EntityManagerInterface::class); + $eventArgs = $this->prophesize(LifecycleEventArgs::class); $eventArgs->getEntity() ->willReturn($object) ; + $eventArgs->getEntityManager() + ->willReturn($entityManager) + ; $listener = new UniqueActiveListener(); $listener->preUpdate($eventArgs->reveal()); - static::assertTrue(true); + $entityManager->createQueryBuilder()->shouldNotHaveBeenCalled(); } public function testLoadClassMetadataWithNoValidData(): void diff --git a/tests/Manager/ORM/BaseQueryTraitTest.php b/tests/Manager/ORM/BaseQueryTraitTest.php index 946dc1b9..5e13cd84 100644 --- a/tests/Manager/ORM/BaseQueryTraitTest.php +++ b/tests/Manager/ORM/BaseQueryTraitTest.php @@ -18,7 +18,7 @@ final class BaseQueryTraitTest extends TestCase { private $manager; - protected function setUp() + protected function setUp(): void { $repository = $this->prophesize(EntityRepository::class); diff --git a/tests/Manager/ORM/SearchQueryTraitTest.php b/tests/Manager/ORM/SearchQueryTraitTest.php index fabcaa8d..76ed4527 100644 --- a/tests/Manager/ORM/SearchQueryTraitTest.php +++ b/tests/Manager/ORM/SearchQueryTraitTest.php @@ -20,7 +20,7 @@ final class SearchQueryTraitTest extends TestCase { private $manager; - protected function setUp() + protected function setUp(): void { $repository = $this->prophesize(EntityRepository::class); diff --git a/vendor-bin/phpstan/composer.json b/vendor-bin/phpstan/composer.json index 51d21aa0..456da521 100644 --- a/vendor-bin/phpstan/composer.json +++ b/vendor-bin/phpstan/composer.json @@ -1,10 +1,13 @@ { "require": { + "ekino/phpstan-banned-code": "^0.1", "jangregor/phpstan-prophecy": "^0.4", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^0.11", "phpstan/phpstan-doctrine": "^0.11", - "phpstan/phpstan-phpunit": "^0.11" + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpstan/phpstan-symfony": "^0.11" }, "conflict": { "phpunit/phpunit": ">=8.0"