Bug Report
| Subject |
Details |
| Rector version |
2.3.6 |
SpecificAssertContainsRector incorrectly converts assertContains() to assertStringContainsString() when the haystack is an array, not a string.
Minimal PHP Code Causing Issue
<?php
class Manifest {
private array $consignments = [];
public function setConsignment(string $number): void {
$this->consignments[] = $number;
}
public function getBody(bool $asJson): array|string {
return $asJson ? json_encode($this->consignments) : $this->consignments;
}
}
class ManifestTest extends \PHPUnit\Framework\TestCase
{
public function testSettingConsignment(): void
{
$manifest = new Manifest();
$manifest->setConsignment("DummyNumber");
// getBody(false) returns an ARRAY, not a string
$this->assertContains("DummyNumber", $manifest->getBody(false));
}
}
Expected Behaviour
Rector should skip this code because getBody(false) returns an array.
The assertContains($needle, $array) pattern is correct for checking if an element exists in an array.
Actual behaviour: Rector converts it to:
$this->assertStringContainsString("DummyNumber", $manifest->getBody(false));
This causes a TypeError at runtime:
TypeError: Argument 2 passed to PHPUnit\Framework\Assert::assertStringContainsString() must be of the type string, array given
The rule should only convert to assertStringContainsString() when the haystack is definitively a string type.
Bug Report
SpecificAssertContainsRectorincorrectly convertsassertContains()toassertStringContainsString()when the haystack is an array, not a string.Minimal PHP Code Causing Issue
Expected Behaviour
Rector should skip this code because
getBody(false)returns an array.The
assertContains($needle, $array)pattern is correct for checking if an element exists in an array.Actual behaviour: Rector converts it to:
This causes a TypeError at runtime:
The rule should only convert to
assertStringContainsString()when the haystack is definitively a string type.