Skip to content

Commit 4297dc5

Browse files
authored
skip if used in assert call (#615)
* add assert fixture * skip if used in assert call
1 parent 82d18f1 commit 4297dc5

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Rector\PHPUnit\Tests\CodeQuality\Rector\ClassMethod\BareCreateMockAssignToDirectUseRector\Fixture;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Rector\PHPUnit\Tests\CodeQuality\Rector\ClassMethod\BareCreateMockAssignToDirectUseRector\Source\AnotherClass;
7+
8+
final class SkipIfAssert extends TestCase
9+
{
10+
public function test()
11+
{
12+
$someMock = $this->createMock(AnotherClass::class);
13+
14+
$anotherClass = new AnotherClass(1, 2, 3, $someMock);
15+
16+
$this->assertSame($someMock, $anotherClass->getSomeMock());
17+
}
18+
}

rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Source/AnotherClass.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@
66

77
final class AnotherClass
88
{
9-
public function __construct(...$various)
9+
public function __construct($one, $two, $three, private $someMock)
1010
{
1111

1212
}
13+
14+
public function getSomeMock()
15+
{
16+
return $this->someMock;
17+
}
1318
}

rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use PhpParser\Node\Stmt\Expression;
1919
use PhpParser\Node\Stmt\Foreach_;
2020
use Rector\PhpParser\Node\BetterNodeFinder;
21+
use Rector\PHPUnit\CodeQuality\NodeAnalyser\AssertMethodAnalyzer;
2122
use Rector\PHPUnit\CodeQuality\NodeAnalyser\AssignedMocksCollector;
2223
use Rector\PHPUnit\CodeQuality\NodeFinder\VariableFinder;
2324
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
@@ -35,6 +36,7 @@ public function __construct(
3536
private readonly AssignedMocksCollector $assignedMocksCollector,
3637
private readonly BetterNodeFinder $betterNodeFinder,
3738
private readonly VariableFinder $variableFinder,
39+
private readonly AssertMethodAnalyzer $assertMethodAnalyzer,
3840
) {
3941
}
4042

@@ -125,6 +127,10 @@ public function refactor(Node $node): ?Node
125127
continue;
126128
}
127129

130+
if ($this->isUsedInAssertCall($node, $variableName)) {
131+
continue;
132+
}
133+
128134
// 1. remove initial assign
129135
$variablesToMethodCalls = [];
130136

@@ -251,4 +257,34 @@ private function isUsedInClosure(ClassMethod|Foreach_ $stmtsAware, string $varia
251257

252258
return false;
253259
}
260+
261+
private function isUsedInAssertCall(ClassMethod|Foreach_ $stmtsAware, string $variableName): bool
262+
{
263+
/** @var StaticCall[]|MethodCall[] $calls */
264+
$calls = $this->betterNodeFinder->findInstancesOfScoped([$stmtsAware], [MethodCall::class, StaticCall::class]);
265+
266+
$assertCalls = [];
267+
foreach ($calls as $call) {
268+
if (! $this->assertMethodAnalyzer->detectTestCaseCall($call)) {
269+
continue;
270+
}
271+
272+
$assertCalls[] = $call;
273+
}
274+
275+
foreach ($assertCalls as $assertCall) {
276+
foreach ($assertCall->getArgs() as $assertCallArg) {
277+
if (! $assertCallArg->value instanceof Variable) {
278+
continue;
279+
}
280+
281+
if ($this->isName($assertCallArg->value, $variableName)) {
282+
return true;
283+
}
284+
285+
}
286+
}
287+
288+
return false;
289+
}
254290
}

0 commit comments

Comments
 (0)