From 84f17581b218a9030208608805348e3789fbc49a Mon Sep 17 00:00:00 2001 From: Aleksei Kankov Date: Mon, 16 Mar 2026 16:28:31 +0100 Subject: [PATCH 1/4] Add PHPUnit stub methods to MockedClassNameCollectingNodeVisitor --- .../NodeVisitor/MockedClassNameCollectingNodeVisitor.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor.php b/src/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor.php index 1fc1a94b7..d39536b14 100644 --- a/src/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor.php +++ b/src/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor.php @@ -40,6 +40,9 @@ public function enterNode(Node $node): ?Node 'mock', // https://github.com/mockery/mockery/blob/73a9714716f87510a7c2add9931884188e657541/library/Mockery.php#L475, https://github.com/laravel/framework/blob/4ca4a16772b2e89233b3606badefae34003e1538/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php#L69 'partialMock', // https://github.com/laravel/framework/blob/4ca4a16772b2e89233b3606badefae34003e1538/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php#L81 'spy', // https://github.com/mockery/mockery/blob/73a9714716f87510a7c2add9931884188e657541/library/Mockery.php#L675, https://github.com/laravel/framework/blob/4ca4a16772b2e89233b3606badefae34003e1538/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php#L93 + 'createStub', // https://github.com/sebastianbergmann/phpunit/blob/d72b735d34bbff2065cef80653cafbe31cb45ba0/src/Framework/TestCase.php#L2262 + 'createStubForIntersectionOfInterfaces', // https://github.com/sebastianbergmann/phpunit/blob/d72b735d34bbff2065cef80653cafbe31cb45ba0/src/Framework/TestCase.php#L2285 + 'createConfiguredStub', // https://github.com/sebastianbergmann/phpunit/blob/d72b735d34bbff2065cef80653cafbe31cb45ba0/src/Framework/TestCase.php#2312 ]; if (! in_array($methodName, $mockMethodNames, true)) { return null; From 16b52d5699694f570699e3fef6491dae91c685de Mon Sep 17 00:00:00 2001 From: Aleksei Kankov Date: Mon, 16 Mar 2026 16:34:38 +0100 Subject: [PATCH 2/4] Fix problems with dependencies --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0077e5ef1..f462a3ed1 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "symfony/console": "^6.4.24", "symfony/finder": "^7.4", "symfony/yaml": "^7.4", - "webmozart/assert": "^1.12" + "webmozart/assert": "^2.1" }, "require-dev": { "symplify/easy-coding-standard": "^13.0", From a5b7b232eb3fc44e09646e859f6e2ebda6974476 Mon Sep 17 00:00:00 2001 From: Aleksei Kankov Date: Mon, 16 Mar 2026 16:40:01 +0100 Subject: [PATCH 3/4] Update tests --- .../Fixture/CreateConfiguredStubCall.php | 15 +++++ .../Fixture/CreateMockCall.php | 15 +++++ .../Fixture/CreateStubCall.php | 15 +++++ .../Fixture/CreateStubForIntersectionCall.php | 15 +++++ .../Fixture/UnrelatedMethodCall.php | 16 ++++++ ...ckedClassNameCollectingNodeVisitorTest.php | 57 +++++++++++++++++++ 6 files changed, 133 insertions(+) create mode 100644 tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateConfiguredStubCall.php create mode 100644 tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateMockCall.php create mode 100644 tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubCall.php create mode 100644 tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubForIntersectionCall.php create mode 100644 tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/UnrelatedMethodCall.php create mode 100644 tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/MockedClassNameCollectingNodeVisitorTest.php diff --git a/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateConfiguredStubCall.php b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateConfiguredStubCall.php new file mode 100644 index 000000000..25f9d7d79 --- /dev/null +++ b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateConfiguredStubCall.php @@ -0,0 +1,15 @@ +createConfiguredStub(\SomeNamespace\SomeConfiguredStubClass::class, []); + } +} diff --git a/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateMockCall.php b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateMockCall.php new file mode 100644 index 000000000..7bb23d669 --- /dev/null +++ b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateMockCall.php @@ -0,0 +1,15 @@ +createMock(\SomeNamespace\SomeMockedClass::class); + } +} diff --git a/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubCall.php b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubCall.php new file mode 100644 index 000000000..fba16d93b --- /dev/null +++ b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubCall.php @@ -0,0 +1,15 @@ +createStub(\SomeNamespace\SomeStubClass::class); + } +} diff --git a/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubForIntersectionCall.php b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubForIntersectionCall.php new file mode 100644 index 000000000..80f026ca8 --- /dev/null +++ b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/CreateStubForIntersectionCall.php @@ -0,0 +1,15 @@ +createStubForIntersectionOfInterfaces(\SomeNamespace\SomeIntersectionClass::class); + } +} diff --git a/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/UnrelatedMethodCall.php b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/UnrelatedMethodCall.php new file mode 100644 index 000000000..9d3ea6b00 --- /dev/null +++ b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture/UnrelatedMethodCall.php @@ -0,0 +1,16 @@ +assertTrue(true); + $this->someRandomMethod(\SomeNamespace\ShouldNotBeDetected::class); + } +} diff --git a/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/MockedClassNameCollectingNodeVisitorTest.php b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/MockedClassNameCollectingNodeVisitorTest.php new file mode 100644 index 000000000..1aa3340c0 --- /dev/null +++ b/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/MockedClassNameCollectingNodeVisitorTest.php @@ -0,0 +1,57 @@ +addVisitor($visitor); + + $parser = (new ParserFactory())->createForNewestSupportedVersion(); + $stmts = $parser->parse((string) file_get_contents($filePath)); + $this->assertNotNull($stmts); + + $nodeTraverser->traverse($stmts); + + $this->assertSame($expectedClassNames, $visitor->getMockedClassNames()); + } + + /** + * @return Iterator + */ + public static function provideData(): Iterator + { + yield 'createMock' => [__DIR__ . '/Fixture/CreateMockCall.php', ['SomeNamespace\SomeMockedClass']]; + + yield 'createStub' => [__DIR__ . '/Fixture/CreateStubCall.php', ['SomeNamespace\SomeStubClass']]; + + yield 'createStubForIntersectionOfInterfaces' => [ + __DIR__ . '/Fixture/CreateStubForIntersectionCall.php', + ['SomeNamespace\SomeIntersectionClass'], + ]; + + yield 'createConfiguredStub' => [ + __DIR__ . '/Fixture/CreateConfiguredStubCall.php', + ['SomeNamespace\SomeConfiguredStubClass'], + ]; + + yield 'unrelated method is not detected' => [__DIR__ . '/Fixture/UnrelatedMethodCall.php', []]; + } +} From bbabc2542acc469a5f861ca69e1f56badb60dfcf Mon Sep 17 00:00:00 2001 From: Aleksei Kankov Date: Mon, 16 Mar 2026 16:52:52 +0100 Subject: [PATCH 4/4] Update tests --- composer-dependency-analyser.php | 6 +++++- src/Command/GenerateSymfonyConfigBuildersCommand.php | 6 ++++-- .../MockedClassNameCollectingNodeVisitorTest.php | 6 +++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php index a957d7e02..d7bcf05cc 100644 --- a/composer-dependency-analyser.php +++ b/composer-dependency-analyser.php @@ -14,8 +14,12 @@ ->ignoreErrorsOnPackage('symfony/config', [ErrorType::DEV_DEPENDENCY_IN_PROD]) ->ignoreErrorsOnPackage('symfony/dependency-injection', [ErrorType::DEV_DEPENDENCY_IN_PROD]) - // test fixture + // test fixtures ->ignoreErrorsOnPath( __DIR__ . '/tests/EntityClassResolver/Fixture/Anything/SomeAttributeDocument.php', [ErrorType::UNKNOWN_CLASS] + ) + ->ignoreErrorsOnPath( + __DIR__ . '/tests/PhpParser/NodeVisitor/MockedClassNameCollectingNodeVisitor/Fixture', + [ErrorType::UNKNOWN_CLASS] ); diff --git a/src/Command/GenerateSymfonyConfigBuildersCommand.php b/src/Command/GenerateSymfonyConfigBuildersCommand.php index 66ebc0303..c2483b89d 100644 --- a/src/Command/GenerateSymfonyConfigBuildersCommand.php +++ b/src/Command/GenerateSymfonyConfigBuildersCommand.php @@ -1,5 +1,7 @@ addVisitor($visitor); + $nodeTraverser->addVisitor($mockedClassNameCollectingNodeVisitor); $parser = (new ParserFactory())->createForNewestSupportedVersion(); $stmts = $parser->parse((string) file_get_contents($filePath)); @@ -30,7 +30,7 @@ public function test(string $filePath, array $expectedClassNames): void $nodeTraverser->traverse($stmts); - $this->assertSame($expectedClassNames, $visitor->getMockedClassNames()); + $this->assertSame($expectedClassNames, $mockedClassNameCollectingNodeVisitor->getMockedClassNames()); } /**