1818use PhpParser \Node \Stmt \Expression ;
1919use PhpParser \Node \Stmt \Foreach_ ;
2020use Rector \PhpParser \Node \BetterNodeFinder ;
21+ use Rector \PHPUnit \CodeQuality \NodeAnalyser \AssertMethodAnalyzer ;
2122use Rector \PHPUnit \CodeQuality \NodeAnalyser \AssignedMocksCollector ;
2223use Rector \PHPUnit \CodeQuality \NodeFinder \VariableFinder ;
2324use 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