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);
+ }
+
+}
+
+?>