From 152f8b73fd8bee0a5234ad5f978119a054cb0608 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 28 Apr 2025 13:42:59 +0700 Subject: [PATCH 1/2] [PhpUnit] Skip different object on PreferPHPUnit(This/Self)CallRector --- .../Fixture/skip_different_object.php.inc | 16 ++++++++++++++++ .../Fixture/skip_different_object.php.inc | 13 +++++++++++++ .../NodeAnalyser/AssertMethodAnalyzer.php | 10 ++++++++++ 3 files changed, 39 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector/Fixture/skip_different_object.php.inc create mode 100644 rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector/Fixture/skip_different_object.php.inc diff --git a/rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector/Fixture/skip_different_object.php.inc b/rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector/Fixture/skip_different_object.php.inc new file mode 100644 index 00000000..bb30f748 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitSelfCallRector/Fixture/skip_different_object.php.inc @@ -0,0 +1,16 @@ +transport('webhook') + ->dispatched() + ->assertCount(1) + ->assertContains(SendWebhookMessage::class); + } +} diff --git a/rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector/Fixture/skip_different_object.php.inc b/rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector/Fixture/skip_different_object.php.inc new file mode 100644 index 00000000..b339b13b --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/PreferPHPUnitThisCallRector/Fixture/skip_different_object.php.inc @@ -0,0 +1,13 @@ +execute()::createMock('stdClass'); + } +} diff --git a/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php b/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php index 7f597374..5cbb139c 100644 --- a/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php +++ b/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\StaticCall; use PHPStan\Reflection\ClassReflection; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PHPUnit\CodeQuality\Enum\NonAssertStaticableMethods; use Rector\PHPUnit\Enum\PHPUnitClassName; use Rector\Reflection\ReflectionResolver; @@ -17,11 +18,20 @@ public function __construct( private NodeNameResolver $nodeNameResolver, private ReflectionResolver $reflectionResolver, + private NodeTypeResolver $nodeTypeResolver ) { } public function detectTestCaseCall(MethodCall|StaticCall $call): bool { + $objectCaller = $call instanceof MethodCall + ? $call->var + : $call->class; + + if (! $this->nodeTypeResolver->isObjectType($objectCaller, new \PHPStan\Type\ObjectType('PHPUnit\Framework\TestCase'))) { + return false; + } + $methodName = $this->nodeNameResolver->getName($call->name); if (! str_starts_with((string) $methodName, 'assert') && ! in_array( $methodName, From 7d543a9ace59fd4eebab32c6ad755bb29165bbf2 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 28 Apr 2025 13:43:54 +0700 Subject: [PATCH 2/2] cs fix --- rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php b/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php index 5cbb139c..9d29a191 100644 --- a/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php +++ b/rules/CodeQuality/NodeAnalyser/AssertMethodAnalyzer.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PHPStan\Reflection\ClassReflection; +use PHPStan\Type\ObjectType; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PHPUnit\CodeQuality\Enum\NonAssertStaticableMethods; @@ -28,7 +29,7 @@ public function detectTestCaseCall(MethodCall|StaticCall $call): bool ? $call->var : $call->class; - if (! $this->nodeTypeResolver->isObjectType($objectCaller, new \PHPStan\Type\ObjectType('PHPUnit\Framework\TestCase'))) { + if (! $this->nodeTypeResolver->isObjectType($objectCaller, new ObjectType('PHPUnit\Framework\TestCase'))) { return false; }