diff --git a/config/drupal-8/drupal-8.8-deprecations.php b/config/drupal-8/drupal-8.8-deprecations.php index ca534221..40360618 100644 --- a/config/drupal-8/drupal-8.8-deprecations.php +++ b/config/drupal-8/drupal-8.8-deprecations.php @@ -4,6 +4,7 @@ use DrupalRector\Drupal8\Rector\Deprecation\DrupalServiceRenameRector; use DrupalRector\Drupal8\Rector\Deprecation\FileDefaultSchemeRector; +use DrupalRector\Drupal8\Rector\Deprecation\FunctionalTestDefaultThemePropertyRector; use DrupalRector\Drupal8\Rector\ValueObject\DrupalServiceRenameConfiguration; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; @@ -44,4 +45,7 @@ // https://www.drupal.org/node/3075567 new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityTypeInterface', 'getLowercaseLabel', 'getSingularLabel'), ]); + + // https://www.drupal.org/node/3083055 + $rectorConfig->rule(FunctionalTestDefaultThemePropertyRector::class); }; diff --git a/docs/rules_overview.md b/docs/rules_overview.md index 31bbad0c..0398f4cf 100644 --- a/docs/rules_overview.md +++ b/docs/rules_overview.md @@ -1,4 +1,4 @@ -# 49 Rules Overview +# 50 Rules Overview
@@ -6,7 +6,7 @@ - [Drupal10](#drupal10) (1) -- [Drupal8](#drupal8) (18) +- [Drupal8](#drupal8) (19) - [Drupal9](#drupal9) (26) @@ -243,6 +243,20 @@ Fixes deprecated file_default_scheme calls
+### FunctionalTestDefaultThemePropertyRector + +Adds `$defaultTheme` property to Functional and FunctionalJavascript tests which do not have them. + +- class: [`DrupalRector\Drupal8\Rector\Deprecation\FunctionalTestDefaultThemePropertyRector`](../src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php) + +```diff + class SomeClassTest { ++ protected $defaultTheme = 'stark' + } +``` + +
+ ### GetMockRector Fixes deprecated `getMock()` calls diff --git a/fixtures/d8/rector_examples_updated/db_query.php b/fixtures/d8/rector_examples_updated/db_query.php index 19296cfa..ea451471 100644 --- a/fixtures/d8/rector_examples_updated/db_query.php +++ b/fixtures/d8/rector_examples_updated/db_query.php @@ -1,6 +1,5 @@ query('select * from user where name="%test"', ['%test'=>'Adam'], [ + \Drupal\core\Database\Database::getConnection('my_non_default_database')->query('select * from user where name="%test"', ['%test'=>'Adam'], [ 'fetch' => \PDO::FETCH_OBJ, 'return' => Database::RETURN_STATEMENT, 'throw_exception' => TRUE, diff --git a/fixtures/d8/rector_examples_updated/test/src/Functional/BrowserTestBaseGetMock.php b/fixtures/d8/rector_examples_updated/test/src/Functional/BrowserTestBaseGetMock.php index 247708e5..4157862e 100644 --- a/fixtures/d8/rector_examples_updated/test/src/Functional/BrowserTestBaseGetMock.php +++ b/fixtures/d8/rector_examples_updated/test/src/Functional/BrowserTestBaseGetMock.php @@ -7,6 +7,11 @@ class BrowserTestBaseGetMock extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + /** * A simple example using the class property. */ diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertCacheTagTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertCacheTagTest.php index a4b14c45..d5fafbbd 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertCacheTagTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertCacheTagTest.php @@ -6,6 +6,11 @@ class AssertCacheTagTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testAssertCacheTag() { $this->drupalGet(''); $this->assertSession()->responseHeaderContains('X-Drupal-Cache-Tags', 'config:block_list'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertElementPresentTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertElementPresentTest.php index 11b8ad8f..e6caa50f 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertElementPresentTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertElementPresentTest.php @@ -6,6 +6,11 @@ class AssertElementPresentTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testAssertElementPresent() { $this->assertSession()->elementExists('css', '.region-content-message.region-empty'); $this->assertSession()->elementNotExists('css', '.region-content-message.region-empty'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEqualTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEqualTest.php index 1aa929b1..e31d0200 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEqualTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEqualTest.php @@ -6,6 +6,11 @@ class AssertEqualTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertEquals('Actual', 'Expected', 'Message'); $this->assertNotEquals('Actual', 'Expected', 'Message'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEscapedTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEscapedTest.php index 13bde977..9fcee391 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEscapedTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertEscapedTest.php @@ -6,6 +6,11 @@ class AssertEscapedTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testAssertElementPresent() { $this->assertSession()->assertEscaped('Demonstrate block regions (<"Cat" & \'Mouse\'>)'); $this->assertSession()->assertNoEscaped('
'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByIdTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByIdTest.php index c7f1138e..97d854f8 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByIdTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByIdTest.php @@ -6,6 +6,11 @@ class AssertFieldByIdTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testFieldById() { $this->assertSession()->fieldExists('edit-name'); $this->assertSession()->fieldValueEquals('edit-name', 'Test name'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByNameTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByNameTest.php index 0e18fcf5..9c90ab99 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByNameTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldByNameTest.php @@ -6,6 +6,11 @@ class AssertFieldByNameTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testFieldByName() { $this->assertSession()->fieldValueEquals('field_name', 'expected_value'); $this->assertSession()->fieldValueEquals("field_name[0][value][date]", ''); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldCheckedTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldCheckedTest.php index 5dbc8662..b6788aa8 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldCheckedTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldCheckedTest.php @@ -6,6 +6,11 @@ class AssertFieldCheckedTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testFieldChecked() { $this->assertSession()->checkboxChecked('edit-settings-view-mode', 'default'); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldTest.php index 3b351034..5f94b016 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertFieldTest.php @@ -6,6 +6,11 @@ class AssertFieldTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testField() { // TODO: Drupal Rector Notice: Please delete the following comment after you've made any necessary changes. // Change assertion to buttonExists() if checking for a button. diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertHeaderTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertHeaderTest.php index d57ddc90..be2313f3 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertHeaderTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertHeaderTest.php @@ -6,6 +6,11 @@ class AssertHeaderTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSession()->responseHeaderEquals('Foo', 'Bar'); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalObjectTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalObjectTest.php index f6f600ba..264bd5f8 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalObjectTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalObjectTest.php @@ -6,6 +6,11 @@ class AssertIdenticalObjectTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertEquals('Actual', 'Expected', 'Message'); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalTest.php index 865748d0..14c08774 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertIdenticalTest.php @@ -6,6 +6,11 @@ class AssertIdenticalTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSame('Actual', 'Expected', 'Message'); $this->assertNotSame('Actual', 'Expected', 'Message'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkByHrefTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkByHrefTest.php index 03d28799..eeea7a05 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkByHrefTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkByHrefTest.php @@ -6,6 +6,11 @@ class AssertLinkByHrefTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testLinkByHref() { $this->assertSession()->linkByHrefExists('user/1/translations'); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkTest.php index 9e978b9d..26f10284 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertLinkTest.php @@ -6,6 +6,11 @@ class AssertLinkTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testLink() { $this->assertSession()->linkExists('Anonymous comment title'); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertOptionTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertOptionTest.php index 553d9038..dbe109dc 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertOptionTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertOptionTest.php @@ -6,6 +6,11 @@ class AssertOptionTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSession()->optionExists('edit-settings-view-mode', 'default'); $this->assertSession()->optionNotExists('edit-settings-view-mode', 'default'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertPatternTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertPatternTest.php index 8122a3b5..07c60b64 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertPatternTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertPatternTest.php @@ -6,6 +6,11 @@ class AssertPatternTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSession()->responseMatches('|]*>|', 'No empty H4 element found.'); $this->assertSession()->responseNotMatches('|]*>|', 'No empty H4 element found.'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertRawTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertRawTest.php index 731b42af..8f51c6fb 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertRawTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertRawTest.php @@ -6,6 +6,11 @@ class AssertRawTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSession()->responseContains('bartik/logo.svg'); $this->assertSession()->responseNotContains('bartik/logo.svg'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertResponseTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertResponseTest.php index 0778bcfd..71fb49ea 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertResponseTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertResponseTest.php @@ -6,6 +6,11 @@ class AssertResponseTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSession()->statusCodeEquals(200); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTest.php index 81480795..34abb542 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTest.php @@ -6,6 +6,11 @@ class AssertTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $foo = TRUE; $this->assertTrue($foo); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTextTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTextTest.php index 219da621..88db43bf 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTextTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTextTest.php @@ -6,6 +6,11 @@ class AssertTextTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testAssertText() { $current_content = $this->randomMachineName(); $this->drupalGet('test-page'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTitleTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTitleTest.php index 919ea983..ecaeea4c 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTitleTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertTitleTest.php @@ -6,6 +6,11 @@ class AssertTitleTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSession()->titleEquals('Block layout | Drupal'); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUniqueTextTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUniqueTextTest.php index c256335f..c9a4e702 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUniqueTextTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUniqueTextTest.php @@ -6,6 +6,11 @@ class AssertUniqueTextTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testAssertText() { $this->assertSession()->pageTextContainsOnce('Color set'); $page_text = $this->getSession()->getPage()->getText(); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUrlTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUrlTest.php index de2acfe9..ddd74e9a 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUrlTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/AssertUrlTest.php @@ -6,6 +6,11 @@ class AssertUrlTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->assertSession()->addressEquals('myrootuser'); } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/BuildXpathQueryTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/BuildXpathQueryTest.php index 42ef689b..b6624b95 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/BuildXpathQueryTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/BuildXpathQueryTest.php @@ -6,6 +6,11 @@ class BuildXpathQueryTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $xpath = $this->assertSession()->buildXPathQuery('//select[@name=:name]', [':name' => $name]); $fields = $this->xpath($xpath); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/ConstructFieldXpathTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/ConstructFieldXpathTest.php index 24608f89..7a2220cf 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/ConstructFieldXpathTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/ConstructFieldXpathTest.php @@ -6,6 +6,11 @@ class ConstructFieldXpathTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->drupalGet('/form-test/select'); $this->getSession()->getPage()->findField('edit-preferred-admin-langcode'); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/DrupalPostFormTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/DrupalPostFormTest.php index 4677d526..650ec1a1 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/DrupalPostFormTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/DrupalPostFormTest.php @@ -6,6 +6,11 @@ class DrupalPostFormTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + /** * A simple example using the class property. */ diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/GetAllOptionsTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/GetAllOptionsTest.php index 18331d39..b471fad8 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/GetAllOptionsTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/GetAllOptionsTest.php @@ -6,6 +6,11 @@ class GetAllOptionsTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->drupalGet('/form-test/select'); $this->assertCount(6, $this->cssSelect('select[name="opt_groups"]')[0]->findAll('xpath', '//option')); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/GetRawContentTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/GetRawContentTest.php index f445f4c6..962f1393 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/GetRawContentTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/GetRawContentTest.php @@ -6,6 +6,11 @@ class GetRawContentTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { $this->drupalGet('/form-test/select'); $this->getSession()->getPage()->getContent(); diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/PassTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/PassTest.php index 4b855e1d..b1d7678a 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/PassTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/PassTest.php @@ -6,6 +6,11 @@ class PassTest extends BrowserTestBase { + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + public function testExample() { } diff --git a/fixtures/d9/rector_examples_updated/tests/src/Functional/PublicStaticModulesTest.php b/fixtures/d9/rector_examples_updated/tests/src/Functional/PublicStaticModulesTest.php index 443adb10..8e2f05ac 100644 --- a/fixtures/d9/rector_examples_updated/tests/src/Functional/PublicStaticModulesTest.php +++ b/fixtures/d9/rector_examples_updated/tests/src/Functional/PublicStaticModulesTest.php @@ -5,5 +5,11 @@ use Drupal\Tests\BrowserTestBase; class PublicStaticModulesTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + protected static $modules = []; } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index e89503f7..1ef10e01 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -100,6 +100,11 @@ parameters: count: 1 path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php + - + message: "#^Doing instanceof PHPStan\\\\Type\\\\ObjectType is error\\-prone and deprecated\\. Use Type\\:\\:isObject\\(\\) or Type\\:\\:getObjectClassNames\\(\\) instead\\.$#" + count: 1 + path: src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php + - message: "#^Call to an undefined method PHPStan\\\\Type\\\\Type\\:\\:getValue\\(\\)\\.$#" count: 1 diff --git a/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php b/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php new file mode 100644 index 00000000..26d7820e --- /dev/null +++ b/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php @@ -0,0 +1,120 @@ +phpDocInfoFactory = $phpDocInfoFactory; + $this->valueResolver = $valueResolver; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Adds $defaultTheme property to Functional and FunctionalJavascript tests which do not have them.', [ + new CodeSample( + <<<'CODE_SAMPLE' +class SomeClassTest { +} +CODE_SAMPLE + + , + <<<'CODE_SAMPLE' +class SomeClassTest { + protected $defaultTheme = 'stark' +} +CODE_SAMPLE + ), + ]); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [Node\Stmt\Class_::class]; + } + + /** + * @param \PhpParser\Node\Stmt\Class_ $node + */ + public function refactorWithScope(Node $node, Scope $scope): ?Node + { + assert($node instanceof Node\Stmt\Class_); + if ($node->isAbstract() || $node->isAnonymous()) { + return null; + } + $type = $this->nodeTypeResolver->getType($node); + + if (count($type->getObjectClassNames()) === 0 || !$type->isObject()->yes()) { + return null; + } + + assert($type instanceof ObjectType); + $browserTestBaseType = new ObjectType(BrowserTestBase::class); + if ($type->isSmallerThanOrEqual($browserTestBaseType)->yes()) { + return null; + } + if ($type->isSuperTypeOf(new ObjectType(BrowserTestBase::class))->no()) { + return null; + } + $classReflection = $type->getClassReflection(); + if ($classReflection === null || !$classReflection->hasNativeProperty('defaultTheme')) { + throw new ShouldNotHappenException(sprintf('Functional test class %s should have had a defaultTheme property but one not found.', $type->getClassName())); + } + + $defaultThemeProperty = $classReflection->getProperty('defaultTheme', $scope); + assert($defaultThemeProperty instanceof \PHPStan\Reflection\Php\PhpPropertyReflection); + + $reflectionProperty = $defaultThemeProperty->getNativeReflection(); + $betterReflection = $reflectionProperty->getBetterReflection(); + $defaultValueExpression = $betterReflection->getDefaultValueExpression(); + + if ($defaultValueExpression instanceof Node\Scalar\String_ && strlen($this->valueResolver->getValue($defaultValueExpression)) > 0) { + return null; + } + + // Is processed by \Rector\PostRector\Rector\PropertyAddingPostRector + // Sets as `private`, which we need `protected` and default value. + $propertyBuilder = new Property('defaultTheme'); + $propertyBuilder->makeProtected(); + $propertyBuilder->setDefault('stark'); + $propertyBuilder->setDocComment("/**\n * {@inheritdoc}\n */"); + $property = $propertyBuilder->getNode(); + $this->phpDocInfoFactory->createFromNode($property); + $node->stmts = array_merge([$property, new Node\Stmt\Nop()], $node->stmts); + + return $node; + } +} diff --git a/stubs/Drupal/Tests/BrowserTestBase.php b/stubs/Drupal/Tests/BrowserTestBase.php index 725a518a..98e9343f 100644 --- a/stubs/Drupal/Tests/BrowserTestBase.php +++ b/stubs/Drupal/Tests/BrowserTestBase.php @@ -15,4 +15,13 @@ abstract class BrowserTestBase extends TestCase { use AssertLegacyTrait; + /** + * The theme to install as the default for testing. + * + * Defaults to the install profile's default theme, if it specifies any. + * + * @var string + */ + protected $defaultTheme; + } diff --git a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php new file mode 100644 index 00000000..0bf8cea9 --- /dev/null +++ b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php @@ -0,0 +1,32 @@ +doTestFile($filePath); + } + + /** + * @return Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/config/configured_rule.php b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/config/configured_rule.php new file mode 100644 index 00000000..fe548ec0 --- /dev/null +++ b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/config/configured_rule.php @@ -0,0 +1,9 @@ +rule(\DrupalRector\Drupal8\Rector\Deprecation\FunctionalTestDefaultThemePropertyRector::class); +}; diff --git a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/fixture/extends.php.inc b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/fixture/extends.php.inc new file mode 100644 index 00000000..961ba4e3 --- /dev/null +++ b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/fixture/extends.php.inc @@ -0,0 +1,47 @@ +assertTrue(TRUE); + } + +} + +?> +----- +assertTrue(TRUE); + } + +} + +?> diff --git a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/fixture/some_class.php.inc b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/fixture/some_class.php.inc new file mode 100644 index 00000000..cf68e5a6 --- /dev/null +++ b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/fixture/some_class.php.inc @@ -0,0 +1,36 @@ +assertTrue(TRUE); + } + +} + +?> +----- +assertTrue(TRUE); + } + +} + +?>