diff --git a/composer.json b/composer.json index c65e35dfab46..049d54b86461 100644 --- a/composer.json +++ b/composer.json @@ -77,7 +77,8 @@ "Rector\\Legacy\\": "packages/Legacy/src", "Rector\\ElasticSearchDSL\\": "packages/ElasticSearchDSL/src", "Rector\\SymfonyPHPUnit\\": "packages/SymfonyPHPUnit/src", - "Rector\\Architecture\\": "packages/Architecture/src" + "Rector\\Architecture\\": "packages/Architecture/src", + "Rector\\PHPUnitSymfony\\": "packages/PHPUnitSymfony/src" } }, "autoload-dev": { @@ -116,7 +117,8 @@ "Rector\\Legacy\\Tests\\": "packages/Legacy/tests", "Rector\\ElasticSearchDSL\\Tests\\": "packages/ElasticSearchDSL/tests", "Rector\\SymfonyPHPUnit\\Tests\\": "packages/SymfonyPHPUnit/tests", - "Rector\\Architecture\\Tests\\": "packages/Architecture/tests" + "Rector\\Architecture\\Tests\\": "packages/Architecture/tests", + "Rector\\PHPUnitSymfony\\Tests\\": "packages/PHPUnitSymfony/tests" }, "classmap": [ "packages/Symfony/tests/Rector/FrameworkBundle/AbstractToConstructorInjectionRectorSource", diff --git a/packages/NodeTypeResolver/src/PerNodeTypeResolver/NameTypeResolver.php b/packages/NodeTypeResolver/src/PerNodeTypeResolver/NameTypeResolver.php index 1ea1359ed2fc..f7680755f7d1 100644 --- a/packages/NodeTypeResolver/src/PerNodeTypeResolver/NameTypeResolver.php +++ b/packages/NodeTypeResolver/src/PerNodeTypeResolver/NameTypeResolver.php @@ -42,7 +42,7 @@ public function resolve(Node $nameNode): array return [$fullyQualifiedName]; } - private function resolveFullyQualifiedName(Node $nameNode, string $name): ?string + private function resolveFullyQualifiedName(Node $nameNode, string $name): string { if (in_array($name, ['self', 'static', 'this'], true)) { /** @var string|null $class */ diff --git a/packages/PHPUnitSymfony/src/Rector/StaticCall/AddMessageToEqualsResponseCodeRector.php b/packages/PHPUnitSymfony/src/Rector/StaticCall/AddMessageToEqualsResponseCodeRector.php new file mode 100644 index 000000000000..953329f11c1d --- /dev/null +++ b/packages/PHPUnitSymfony/src/Rector/StaticCall/AddMessageToEqualsResponseCodeRector.php @@ -0,0 +1,132 @@ +assertEquals( + Response::HTTP_NO_CONTENT, + $response->getStatusCode() + ); + } +} +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpFoundation\Response; + +final class SomeClassTest extends TestCase +{ + public function test(Response $response) + { + $this->assertEquals( + Response::HTTP_NO_CONTENT, + $response->getStatusCode() + $response->getContent() + ); + } +} +CODE_SAMPLE + ), + ]); + } + + /** + * @return string[] + */ + public function getNodeTypes(): array + { + return [StaticCall::class, MethodCall::class]; + } + + /** + * @param StaticCall|MethodCall $node + */ + public function refactor(Node $node): ?Node + { + if (! $this->isName($node->name, 'assertEquals')) { + return null; + } + + // already has 3rd "message" argument + if (isset($node->args[2])) { + return null; + } + + if (! $this->isHttpRequestArgument($node->args[0]->value)) { + return null; + } + + $parentVariable = $this->getParentOfGetStatusCode($node->args[1]->value); + if ($parentVariable === null) { + return null; + } + + $getContentMethodCall = new MethodCall($parentVariable, 'getContent'); + + $node->args[2] = new Arg($getContentMethodCall); + + return $node; + } + + /** + * $this->assertX(Response::SOME_STATUS) + */ + private function isHttpRequestArgument(Node $node): bool + { + if (! $node instanceof ClassConstFetch) { + return false; + } + + return $this->isType($node->class, self::RESPONSE_CLASS); + } + + /** + * @return Variable|MethodCall|Expr|null + */ + private function getParentOfGetStatusCode(Node $node): ?Node + { + $currentNode = $node; + while ($currentNode instanceof MethodCall) { + if ($this->isName($currentNode->name, 'getStatusCode')) { + return $currentNode->var; + } + + $currentNode = $currentNode->var; + } + + return null; + } +} diff --git a/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/AddMessageToEqualsResponseCodeRectorTest.php b/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/AddMessageToEqualsResponseCodeRectorTest.php new file mode 100644 index 000000000000..b645a8bf206b --- /dev/null +++ b/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/AddMessageToEqualsResponseCodeRectorTest.php @@ -0,0 +1,19 @@ +doTestFiles([__DIR__ . '/Fixture/fixture.php.inc', __DIR__ . '/Fixture/method_call.php.inc']); + } + + protected function getRectorClass(): string + { + return AddMessageToEqualsResponseCodeRector::class; + } +} diff --git a/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/Fixture/fixture.php.inc b/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/Fixture/fixture.php.inc new file mode 100644 index 000000000000..d60f48de019c --- /dev/null +++ b/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/Fixture/fixture.php.inc @@ -0,0 +1,53 @@ +assertEquals( + Response::HTTP_NO_CONTENT, + $response->getStatusCode() + ); + + $anotherName = new Response(); + $this->assertEquals( + Response::HTTP_NO_CONTENT, + $anotherName->getStatusCode() + ); + } +} + +?> +----- +assertEquals( + Response::HTTP_NO_CONTENT, + $response->getStatusCode(), + $response->getContent() + ); + + $anotherName = new Response(); + $this->assertEquals( + Response::HTTP_NO_CONTENT, + $anotherName->getStatusCode(), + $anotherName->getContent() + ); + } +} + +?> diff --git a/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/Fixture/method_call.php.inc b/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/Fixture/method_call.php.inc new file mode 100644 index 000000000000..4a0baee4d1bf --- /dev/null +++ b/packages/PHPUnitSymfony/tests/Rector/StaticCall/AddMessageToEqualsResponseCodeRector/Fixture/method_call.php.inc @@ -0,0 +1,48 @@ +assertEquals( + Response::HTTP_NO_CONTENT, + $this->getResponse()->getStatusCode() + ); + } + + private function getResponse(): Response + { + } +} + +?> +----- +assertEquals( + Response::HTTP_NO_CONTENT, + $this->getResponse()->getStatusCode(), + $this->getResponse()->getContent() + ); + } + + private function getResponse(): Response + { + } +} + +?>