From ea75445d4339bd29ed80bcad5a591d6d4250fb9e Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 28 Apr 2025 12:25:18 +0200 Subject: [PATCH] Add test for RequireQueryBuilderOnRepositoryRule --- .../RequireQueryBuilderOnRepositoryRule.php | 2 +- stubs/Doctrine/ORM/EntityManagerInterface.php | 6 ++++ stubs/Doctrine/ORM/EntityRepository.php | 3 ++ .../Fixture/ReportOnEntityManager.php | 16 +++++++++ .../SkipCreateQueryBuilderOnRepository.php | 25 ++++++++++++++ ...equireQueryBuilderOnRepositoryRuleTest.php | 34 +++++++++++++++++++ .../Source/RandomEntity.php | 8 +++++ .../SkipContractImplementingRepository.php | 2 +- .../Fixture/SkipServiceRepository.php | 2 +- .../Fixture/SomeRepository.php | 2 +- ...RequireServiceRepositoryParentRuleTest.php | 2 +- 11 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/ReportOnEntityManager.php create mode 100644 tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/SkipCreateQueryBuilderOnRepository.php create mode 100644 tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/RequireQueryBuilderOnRepositoryRuleTest.php create mode 100644 tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Source/RandomEntity.php rename tests/Rules/Doctrine/{RequireServiceRepositoryParentRuleTest => RequireServiceRepositoryParentRule}/Fixture/SkipContractImplementingRepository.php (88%) rename tests/Rules/Doctrine/{RequireServiceRepositoryParentRuleTest => RequireServiceRepositoryParentRule}/Fixture/SkipServiceRepository.php (86%) rename tests/Rules/Doctrine/{RequireServiceRepositoryParentRuleTest => RequireServiceRepositoryParentRule}/Fixture/SomeRepository.php (77%) rename tests/Rules/Doctrine/{RequireServiceRepositoryParentRuleTest => RequireServiceRepositoryParentRule}/RequireServiceRepositoryParentRuleTest.php (97%) diff --git a/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php b/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php index 75560a87c..3306838cc 100644 --- a/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php +++ b/src/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule.php @@ -22,7 +22,7 @@ final class RequireQueryBuilderOnRepositoryRule implements Rule /** * @var string */ - private const ERROR_MESSAGE = 'Avoid calling ->createQueryBuilder() directly on EntityManager as it requires select() + from() calls with specific values. Use $repository->createQueryBuilder() to be safe instead'; + public const ERROR_MESSAGE = 'Avoid calling ->createQueryBuilder() directly on EntityManager as it requires select() + from() calls with specific values. Use $repository->createQueryBuilder() to be safe instead'; public function getNodeType(): string { diff --git a/stubs/Doctrine/ORM/EntityManagerInterface.php b/stubs/Doctrine/ORM/EntityManagerInterface.php index 1152946b4..c38ecc95a 100644 --- a/stubs/Doctrine/ORM/EntityManagerInterface.php +++ b/stubs/Doctrine/ORM/EntityManagerInterface.php @@ -8,5 +8,11 @@ interface EntityManagerInterface { + /** + * @param class-string $class + * @return EntityRepository + */ public function getRepository(string $class): object; + + public function createQueryBuilder(); } diff --git a/stubs/Doctrine/ORM/EntityRepository.php b/stubs/Doctrine/ORM/EntityRepository.php index 7304dee3f..8e117539a 100644 --- a/stubs/Doctrine/ORM/EntityRepository.php +++ b/stubs/Doctrine/ORM/EntityRepository.php @@ -8,4 +8,7 @@ class EntityRepository { + public function createQueryBuilder() + { + } } diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/ReportOnEntityManager.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/ReportOnEntityManager.php new file mode 100644 index 000000000..55352a7ca --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/ReportOnEntityManager.php @@ -0,0 +1,16 @@ +createQueryBuilder(); + } +} diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/SkipCreateQueryBuilderOnRepository.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/SkipCreateQueryBuilderOnRepository.php new file mode 100644 index 000000000..5a3e83030 --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Fixture/SkipCreateQueryBuilderOnRepository.php @@ -0,0 +1,25 @@ +getRepository(RandomEntity::class); + + $queryBuilder = $someRepository + ->createQueryBuilder(); + } + + public function directlyOnCall(EntityManagerInterface $entityManager) + { + $queryBuilder = $entityManager->getRepository(RandomEntity::class) + ->createQueryBuilder(); + } +} diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/RequireQueryBuilderOnRepositoryRuleTest.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/RequireQueryBuilderOnRepositoryRuleTest.php new file mode 100644 index 000000000..05e8c6a33 --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/RequireQueryBuilderOnRepositoryRuleTest.php @@ -0,0 +1,34 @@ +analyse([$filePath], $expectedErrorsWithLines); + } + + public static function provideData(): Iterator + { + yield [__DIR__ . '/Fixture/SkipCreateQueryBuilderOnRepository.php', []]; + + yield [__DIR__ . '/Fixture/ReportOnEntityManager.php', [ + [RequireQueryBuilderOnRepositoryRule::ERROR_MESSAGE, 14], + ]]; + } + + protected function getRule(): Rule + { + return new RequireQueryBuilderOnRepositoryRule(); + } +} diff --git a/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Source/RandomEntity.php b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Source/RandomEntity.php new file mode 100644 index 000000000..c780f4673 --- /dev/null +++ b/tests/Rules/Doctrine/RequireQueryBuilderOnRepositoryRule/Source/RandomEntity.php @@ -0,0 +1,8 @@ +