From 9944485d112e09791eb7cbec7c7bd5af99984c65 Mon Sep 17 00:00:00 2001
From: TomasVotruba <tomas.vot@gmail.com>
Date: Fri, 17 Jan 2020 01:16:38 +0100
Subject: [PATCH] [PHPUnit] Add ClassMethod/RemoveEmptyTestMethodRector

---
 config/set/dead-code/dead-code.yaml           |  1 +
 docs/AllRectorsOverview.md                    | 45 +++++++++++-
 .../RemoveEmptyTestMethodRector.php           | 71 +++++++++++++++++++
 .../Fixture/fixture.php.inc                   | 27 +++++++
 .../RemoveEmptyTestMethodRectorTest.php       | 30 ++++++++
 5 files changed, 173 insertions(+), 1 deletion(-)
 create mode 100644 packages/PHPUnit/src/Rector/ClassMethod/RemoveEmptyTestMethodRector.php
 create mode 100644 packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/Fixture/fixture.php.inc
 create mode 100644 packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/RemoveEmptyTestMethodRectorTest.php

diff --git a/config/set/dead-code/dead-code.yaml b/config/set/dead-code/dead-code.yaml
index dfdc5e4657b..3e7ab49ddc4 100644
--- a/config/set/dead-code/dead-code.yaml
+++ b/config/set/dead-code/dead-code.yaml
@@ -30,3 +30,4 @@ services:
     Rector\DeadCode\Rector\Stmt\RemoveUnreachableStatementRector: null
     Rector\DeadCode\Rector\If_\SimplifyIfElseWithSameContentRector: null
     Rector\DeadCode\Rector\Ternary\TernaryToBooleanOrFalseToBooleanAndRector: null
+    Rector\PHPUnit\Rector\ClassMethod\RemoveEmptyTestMethodRector: null
diff --git a/docs/AllRectorsOverview.md b/docs/AllRectorsOverview.md
index 2a8268a0b66..d09fc2a27ac 100644
--- a/docs/AllRectorsOverview.md
+++ b/docs/AllRectorsOverview.md
@@ -1,4 +1,4 @@
-# All 430 Rectors Overview
+# All 432 Rectors Overview
 
 - [Projects](#projects)
 - [General](#general)
@@ -4536,6 +4536,27 @@ Fix data provider annotation typos
 
 <br>
 
+### `GetMockBuilderGetMockToCreateMockRector`
+
+- class: `Rector\PHPUnit\Rector\MethodCall\GetMockBuilderGetMockToCreateMockRector`
+
+Remove getMockBuilder() to createMock()
+
+```diff
+ class SomeTest extends \PHPUnit\Framework\TestCase
+ {
+     public function test()
+     {
+-        $applicationMock = $this->getMockBuilder('SomeClass')
+-           ->disableOriginalConstructor()
+-           ->getMock();
++        $applicationMock = $this->createMock('SomeClass');
+     }
+ }
+```
+
+<br>
+
 ### `GetMockRector`
 
 - class: `Rector\PHPUnit\Rector\GetMockRector`
@@ -4582,6 +4603,28 @@ Data provider methods cannot start with "test" prefix
 
 <br>
 
+### `RemoveEmptyTestMethodRector`
+
+- class: `Rector\PHPUnit\Rector\ClassMethod\RemoveEmptyTestMethodRector`
+
+Remove empty test methods
+
+```diff
+ class SomeTest extends \PHPUnit\Framework\TestCase
+ {
+-    /**
+-     * testGetTranslatedModelField method
+-     *
+-     * @return void
+-     */
+-    public function testGetTranslatedModelField()
+-    {
+-    }
+ }
+```
+
+<br>
+
 ### `RemoveExpectAnyFromMockRector`
 
 - class: `Rector\PHPUnit\Rector\MethodCall\RemoveExpectAnyFromMockRector`
diff --git a/packages/PHPUnit/src/Rector/ClassMethod/RemoveEmptyTestMethodRector.php b/packages/PHPUnit/src/Rector/ClassMethod/RemoveEmptyTestMethodRector.php
new file mode 100644
index 00000000000..30b0b58de2d
--- /dev/null
+++ b/packages/PHPUnit/src/Rector/ClassMethod/RemoveEmptyTestMethodRector.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Rector\PHPUnit\Rector\ClassMethod;
+
+use PhpParser\Node;
+use PhpParser\Node\Stmt\ClassMethod;
+use Rector\Rector\AbstractPHPUnitRector;
+use Rector\RectorDefinition\CodeSample;
+use Rector\RectorDefinition\RectorDefinition;
+
+/**
+ * @see \Rector\PHPUnit\Tests\Rector\ClassMethod\RemoveEmptyTestMethodRector\RemoveEmptyTestMethodRectorTest
+ */
+final class RemoveEmptyTestMethodRector extends AbstractPHPUnitRector
+{
+    public function getDefinition(): RectorDefinition
+    {
+        return new RectorDefinition('Remove empty test methods', [
+            new CodeSample(
+                <<<'PHP'
+class SomeTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * testGetTranslatedModelField method
+     *
+     * @return void
+     */
+    public function testGetTranslatedModelField()
+    {
+    }
+}
+PHP
+,
+                <<<'PHP'
+class SomeTest extends \PHPUnit\Framework\TestCase
+{
+}
+PHP
+
+            ),
+        ]);
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getNodeTypes(): array
+    {
+        return [ClassMethod::class];
+    }
+
+    /**
+     * @param ClassMethod $node
+     */
+    public function refactor(Node $node): ?Node
+    {
+        if (! $this->isInTestClass($node)) {
+            return null;
+        }
+
+        if (! $this->isName($node->name, 'test*')) {
+            return null;
+        }
+
+        $this->removeNode($node);
+
+        return null;
+    }
+}
diff --git a/packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/Fixture/fixture.php.inc b/packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/Fixture/fixture.php.inc
new file mode 100644
index 00000000000..dd5f3fc1291
--- /dev/null
+++ b/packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/Fixture/fixture.php.inc
@@ -0,0 +1,27 @@
+<?php
+
+namespace Rector\PHPUnit\Tests\Rector\ClassMethod\RemoveEmptyTestMethodRector\Fixture;
+
+class SomeTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * testGetTranslatedModelField method
+     *
+     * @return void
+     */
+    public function testGetTranslatedModelField()
+    {
+    }
+}
+
+?>
+-----
+<?php
+
+namespace Rector\PHPUnit\Tests\Rector\ClassMethod\RemoveEmptyTestMethodRector\Fixture;
+
+class SomeTest extends \PHPUnit\Framework\TestCase
+{
+}
+
+?>
diff --git a/packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/RemoveEmptyTestMethodRectorTest.php b/packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/RemoveEmptyTestMethodRectorTest.php
new file mode 100644
index 00000000000..d807293e60c
--- /dev/null
+++ b/packages/PHPUnit/tests/Rector/ClassMethod/RemoveEmptyTestMethodRector/RemoveEmptyTestMethodRectorTest.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Rector\PHPUnit\Tests\Rector\ClassMethod\RemoveEmptyTestMethodRector;
+
+use Iterator;
+use Rector\PHPUnit\Rector\ClassMethod\RemoveEmptyTestMethodRector;
+use Rector\Testing\PHPUnit\AbstractRectorTestCase;
+
+final class RemoveEmptyTestMethodRectorTest extends AbstractRectorTestCase
+{
+    /**
+     * @dataProvider provideDataForTest()
+     */
+    public function test(string $file): void
+    {
+        $this->doTestFile($file);
+    }
+
+    public function provideDataForTest(): Iterator
+    {
+        return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture');
+    }
+
+    protected function getRectorClass(): string
+    {
+        return RemoveEmptyTestMethodRector::class;
+    }
+}