From 0856a216f4c635e300344a90cbc33d25224ab274 Mon Sep 17 00:00:00 2001 From: alfredbez Date: Fri, 31 Jan 2020 15:26:54 +0100 Subject: [PATCH] feature: add rule to refactor exception methods see: https://github.com/sebastianbergmann/phpunit/issues/3775 --- config/set/phpunit/phpunit90.yaml | 1 + docs/AllRectorsOverview.md | 27 ++++- .../MethodCall/ExplicitPhpErrorApiRector.php | 102 ++++++++++++++++++ .../ExplicitPhpErrorApiRectorTest.php | 30 ++++++ .../Fixture/php_combination.php.inc | 37 +++++++ .../Fixture/php_deprecation.php.inc | 31 ++++++ .../Fixture/php_error.php.inc | 31 ++++++ .../Fixture/php_notice.php.inc | 31 ++++++ .../Fixture/php_standard_exception.php.inc | 31 ++++++ .../Fixture/php_warning.php.inc | 31 ++++++ 10 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 packages/PHPUnit/src/Rector/MethodCall/ExplicitPhpErrorApiRector.php create mode 100644 packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/ExplicitPhpErrorApiRectorTest.php create mode 100644 packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_combination.php.inc create mode 100644 packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_deprecation.php.inc create mode 100644 packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_error.php.inc create mode 100644 packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_notice.php.inc create mode 100644 packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_standard_exception.php.inc create mode 100644 packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_warning.php.inc diff --git a/config/set/phpunit/phpunit90.yaml b/config/set/phpunit/phpunit90.yaml index e710e977d3d9..0e95b632a639 100644 --- a/config/set/phpunit/phpunit90.yaml +++ b/config/set/phpunit/phpunit90.yaml @@ -1,2 +1,3 @@ services: Rector\PHPUnit\Rector\Class_\TestListenerToHooksRector: null + Rector\PHPUnit\Rector\MethodCall\ExplicitPhpErrorApiRector: null diff --git a/docs/AllRectorsOverview.md b/docs/AllRectorsOverview.md index 162c037c565b..68ec08cdb66c 100644 --- a/docs/AllRectorsOverview.md +++ b/docs/AllRectorsOverview.md @@ -1,4 +1,4 @@ -# All 444 Rectors Overview +# All 445 Rectors Overview - [Projects](#projects) - [General](#general) @@ -4783,6 +4783,31 @@ Takes `setExpectedException()` 2nd and next arguments to own methods in PHPUnit.
+### `ExplicitPhpErrorApiRector` + +- class: `Rector\PHPUnit\Rector\MethodCall\ExplicitPhpErrorApiRector` + +Use explicit API for expecting PHP errors, warnings, and notices + +```diff + final class SomeTest extends \PHPUnit\Framework\TestCase + { + public function test() + { +- $this->expectException(\PHPUnit\Framework\TestCase\Deprecated::class); +- $this->expectException(\PHPUnit\Framework\TestCase\Error::class); +- $this->expectException(\PHPUnit\Framework\TestCase\Notice::class); +- $this->expectException(\PHPUnit\Framework\TestCase\Warning::class); ++ $this->expectDeprecation(); ++ $this->expectError(); ++ $this->expectNotice(); ++ $this->expectWarning(); + } + } +``` + +
+ ### `FixDataProviderAnnotationTypoRector` - class: `Rector\PHPUnit\Rector\ClassMethod\FixDataProviderAnnotationTypoRector` diff --git a/packages/PHPUnit/src/Rector/MethodCall/ExplicitPhpErrorApiRector.php b/packages/PHPUnit/src/Rector/MethodCall/ExplicitPhpErrorApiRector.php new file mode 100644 index 000000000000..a0651294fb9a --- /dev/null +++ b/packages/PHPUnit/src/Rector/MethodCall/ExplicitPhpErrorApiRector.php @@ -0,0 +1,102 @@ +expectException(\PHPUnit\Framework\TestCase\Deprecated::class); + $this->expectException(\PHPUnit\Framework\TestCase\Error::class); + $this->expectException(\PHPUnit\Framework\TestCase\Notice::class); + $this->expectException(\PHPUnit\Framework\TestCase\Warning::class); + } +} +PHP + , + <<<'PHP' +final class SomeTest extends \PHPUnit\Framework\TestCase +{ + public function test() + { + $this->expectDeprecation(); + $this->expectError(); + $this->expectNotice(); + $this->expectWarning(); + } +} +PHP + ), + ] + ); + } + + /** + * @return string[] + */ + public function getNodeTypes(): array + { + return [MethodCall::class, StaticCall::class]; + } + + /** + * @param MethodCall|StaticCall $node + */ + public function refactor(Node $node): ?Node + { + if (! $this->isPHPUnitMethodNames($node, ['expectException'])) { + return null; + } + + $replacements = [ + 'PHPUnit\Framework\TestCase\Notice' => 'expectNotice', + 'PHPUnit\Framework\TestCase\Deprecated' => 'expectDeprecation', + 'PHPUnit\Framework\TestCase\Error' => 'expectError', + 'PHPUnit\Framework\TestCase\Warning' => 'expectWarning', + ]; + + foreach ($replacements as $class => $method) { + $this->replaceExceptionWith($node, $class, $method); + } + + return $node; + } + + /** + * @param MethodCall|StaticCall $node + * @param string $exceptionClass + * @param string $explicitMethod + */ + private function replaceExceptionWith(Node $node, $exceptionClass, $explicitMethod): void + { + if (isset($node->args[0]) && property_exists( + $node->args[0]->value, + 'class' + ) && (string) $node->args[0]->value->class === $exceptionClass) { + $this->replaceNode($node, $this->createPHPUnitCallWithName($node, $explicitMethod)); + } + } +} diff --git a/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/ExplicitPhpErrorApiRectorTest.php b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/ExplicitPhpErrorApiRectorTest.php new file mode 100644 index 000000000000..7837b11a3e50 --- /dev/null +++ b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/ExplicitPhpErrorApiRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($file); + } + + public function provideDataForTest(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + protected function getRectorClass(): string + { + return ExplicitPhpErrorApiRector::class; + } +} diff --git a/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_combination.php.inc b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_combination.php.inc new file mode 100644 index 000000000000..7204a070aade --- /dev/null +++ b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_combination.php.inc @@ -0,0 +1,37 @@ +expectException(\PHPUnit\Framework\TestCase\Deprecated::class); + $this->expectException(\PHPUnit\Framework\TestCase\Error::class); + $this->expectException(\PHPUnit\Framework\TestCase\Notice::class); + $this->expectException(\PHPUnit\Framework\TestCase\Warning::class); + } +} + +?> +----- +expectDeprecation(); + $this->expectError(); + $this->expectNotice(); + $this->expectWarning(); + } +} + +?> diff --git a/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_deprecation.php.inc b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_deprecation.php.inc new file mode 100644 index 000000000000..d2d5464dab9a --- /dev/null +++ b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_deprecation.php.inc @@ -0,0 +1,31 @@ +expectException(\PHPUnit\Framework\TestCase\Deprecated::class); + } +} + +?> +----- +expectDeprecation(); + } +} + +?> diff --git a/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_error.php.inc b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_error.php.inc new file mode 100644 index 000000000000..e562f0b49b86 --- /dev/null +++ b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_error.php.inc @@ -0,0 +1,31 @@ +expectException(\PHPUnit\Framework\TestCase\Error::class); + } +} + +?> +----- +expectError(); + } +} + +?> diff --git a/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_notice.php.inc b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_notice.php.inc new file mode 100644 index 000000000000..2146797473cd --- /dev/null +++ b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_notice.php.inc @@ -0,0 +1,31 @@ +expectException(\PHPUnit\Framework\TestCase\Notice::class); + } +} + +?> +----- +expectNotice(); + } +} + +?> diff --git a/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_standard_exception.php.inc b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_standard_exception.php.inc new file mode 100644 index 000000000000..0606ad406520 --- /dev/null +++ b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_standard_exception.php.inc @@ -0,0 +1,31 @@ +expectException(\Exception::class); + } +} + +?> +----- +expectException(\Exception::class); + } +} + +?> diff --git a/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_warning.php.inc b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_warning.php.inc new file mode 100644 index 000000000000..89a717d77dbb --- /dev/null +++ b/packages/PHPUnit/tests/Rector/MethodCall/ExplicitPhpErrorApiRector/Fixture/php_warning.php.inc @@ -0,0 +1,31 @@ +expectException(\PHPUnit\Framework\TestCase\Warning::class); + } +} + +?> +----- +expectWarning(); + } +} + +?>