diff --git a/config/sets/phpunit-code-quality.php b/config/sets/phpunit-code-quality.php index 540b41d8..935a2bf6 100644 --- a/config/sets/phpunit-code-quality.php +++ b/config/sets/phpunit-code-quality.php @@ -35,6 +35,7 @@ use Rector\PHPUnit\CodeQuality\Rector\MethodCall\NarrowSingleWillReturnCallbackRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\RemoveExpectAnyFromMockRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\SingleWithConsecutiveToWithRector; +use Rector\PHPUnit\CodeQuality\Rector\MethodCall\StringCastAssertStringContainsStringRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\UseSpecificWillMethodRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\UseSpecificWithMethodRector; @@ -63,6 +64,7 @@ // type declarations TypeWillReturnCallableArrowFunctionRector::class, + StringCastAssertStringContainsStringRector::class, NarrowUnusedSetUpDefinedPropertyRector::class, diff --git a/rules-tests/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector/Fixture/fixture2.php b/rules-tests/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector/Fixture/fixture2.php new file mode 100644 index 00000000..3719dcb3 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/MethodCall/AssertTrueFalseToSpecificMethodRector/Fixture/fixture2.php @@ -0,0 +1,16 @@ +assertTrue(\array_search($foo, $this->bar->toArray())); + $this->assertNotFalse(\array_search($foo, $this->bar->toArray())); + } +} + +?> diff --git a/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/Fixture/repeated_same.php.inc b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/Fixture/repeated_same.php.inc new file mode 100644 index 00000000..ec61af8a --- /dev/null +++ b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/Fixture/repeated_same.php.inc @@ -0,0 +1,31 @@ +assertStringContainsString('foo', $value); + } +} + +?> +----- +assertStringContainsString('foo', (string) $value); + } +} + +?> diff --git a/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/Fixture/skip_known_string.php.inc b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/Fixture/skip_known_string.php.inc new file mode 100644 index 00000000..9c2c310b --- /dev/null +++ b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/Fixture/skip_known_string.php.inc @@ -0,0 +1,13 @@ +assertStringContainsString('foo', $value); + } +} diff --git a/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/StringCastAssertStringContainsStringRectorTest.php b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/StringCastAssertStringContainsStringRectorTest.php new file mode 100644 index 00000000..5fbe87da --- /dev/null +++ b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/StringCastAssertStringContainsStringRectorTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/config/configured_rule.php b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/config/configured_rule.php new file mode 100644 index 00000000..ca95627a --- /dev/null +++ b/rules-tests/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(StringCastAssertStringContainsStringRector::class); +}; diff --git a/rules/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector.php b/rules/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector.php new file mode 100644 index 00000000..c59ca4b4 --- /dev/null +++ b/rules/CodeQuality/Rector/MethodCall/StringCastAssertStringContainsStringRector.php @@ -0,0 +1,95 @@ +assertStringContainsString('foo', $value); + } +} +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +class SomeTest extends TestCase +{ + public function testSomething(?string $value) + { + $this->assertStringContainsString('foo', (string) $value); + } +} +CODE_SAMPLE + ), + ] + ); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [MethodCall::class, StaticCall::class]; + } + + /** + * @param MethodCall|StaticCall $node + */ + public function refactor(Node $node): MethodCall|StaticCall|null + { + if ($node->isFirstClassCallable()) { + return null; + } + + if (! $this->testsNodeAnalyzer->isPHPUnitMethodCallNames( + $node, + ['assertStringContainsString', 'assertStringNotContainsString'] + )) { + return null; + } + + $secondArg = $node->getArgs()[1]; + $secondArgType = $this->getType($secondArg->value); + + if ($secondArgType->isString()->yes()) { + return null; + } + + $secondArg->value = new String_($secondArg->value); + + return null; + } +}