Skip to content

Commit 548fa7c

Browse files
authored
Merge pull request #196 from mglaman/gh-191-defaulttheme-browsertestbase
Detect undefined defaultTheme property
2 parents 0f05048 + c5467f3 commit 548fa7c

File tree

6 files changed

+133
-0
lines changed

6 files changed

+133
-0
lines changed

extension.neon

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,7 @@ services:
6161
-
6262
class: PHPStan\Rules\Deprecations\ConfigEntityConfigExportRule
6363
tags: [phpstan.rules.rule]
64+
65+
-
66+
class: PHPStan\Rules\Drupal\Tests\BrowserTestBaseDefaultThemeRule
67+
tags: [phpstan.rules.rule]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace PHPStan\Rules\Drupal\Tests;
4+
5+
use PhpParser\Node;
6+
use PHPStan\Analyser\Scope;
7+
use PHPStan\Rules\Rule;
8+
use PHPStan\Type\ObjectType;
9+
10+
final class BrowserTestBaseDefaultThemeRule implements Rule
11+
{
12+
13+
public function getNodeType(): string
14+
{
15+
return Node\Stmt\Class_::class;
16+
}
17+
18+
public function processNode(Node $node, Scope $scope): array
19+
{
20+
assert($node instanceof Node\Stmt\Class_);
21+
if ($node->extends === null) {
22+
return [];
23+
}
24+
if ($node->namespacedName === null) {
25+
return [];
26+
}
27+
28+
$classType = $scope->resolveTypeByName($node->namespacedName);
29+
assert($classType instanceof ObjectType);
30+
$browserTestBaseAncestor = $classType->getAncestorWithClassName('Drupal\\Tests\\BrowserTestBase');
31+
if ($browserTestBaseAncestor === null) {
32+
return [];
33+
}
34+
35+
$reflection = $classType->getClassReflection();
36+
assert($reflection !== null);
37+
$defaultProperties = $reflection->getNativeReflection()->getDefaultProperties();
38+
$defaultTheme = $defaultProperties['defaultTheme'] ?? null;
39+
40+
if ($defaultTheme === null || $defaultTheme === '') {
41+
return [
42+
'Drupal\Tests\BrowserTestBase::$defaultTheme is required. See https://www.drupal.org/node/3083055, which includes recommendations on which theme to use.',
43+
];
44+
}
45+
return [];
46+
}
47+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Drupal\Tests\module_with_tests\Functional;
4+
5+
use Drupal\Tests\BrowserTestBase;
6+
7+
class DefaultThemeTest extends BrowserTestBase {
8+
9+
protected $defaultTheme = 'stark';
10+
11+
public function testFoo() {
12+
$this->drupalGet('/');
13+
}
14+
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Drupal\Tests\module_with_tests\Functional;
4+
5+
class ExtendsDefaultThemeTest extends DefaultThemeTest {
6+
7+
public function testBar() {
8+
$this->drupalGet('/');
9+
}
10+
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Drupal\Tests\module_with_tests\Functional;
4+
5+
use Drupal\Tests\BrowserTestBase;
6+
7+
class MissingDefaultThemeTest extends BrowserTestBase {
8+
9+
public function testFoo() {
10+
$this->drupalGet('/');
11+
}
12+
13+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace PHPStan\Drupal\Rules;
4+
5+
use PHPStan\Drupal\AnalyzerTestBase;
6+
7+
final class BrowserTestBaseDefaultThemeRuleTest extends AnalyzerTestBase {
8+
9+
/**
10+
* @dataProvider fileData
11+
*/
12+
public function testRule(string $path, int $count, array $errorMessages): void
13+
{
14+
$errors = $this->runAnalyze($path);
15+
self::assertCount($count, $errors->getErrors(), var_export($errors, true));
16+
foreach ($errors->getErrors() as $key => $error) {
17+
self::assertEquals($errorMessages[$key], $error->getMessage());
18+
}
19+
}
20+
21+
public function fileData(): \Generator
22+
{
23+
yield [
24+
__DIR__ . '/../../fixtures/drupal/modules/module_with_tests/tests/src/Functional/MissingDefaultThemeTest.php',
25+
1,
26+
[
27+
'Drupal\Tests\BrowserTestBase::$defaultTheme is required. See https://www.drupal.org/node/3083055, which includes recommendations on which theme to use.',
28+
]
29+
];
30+
yield [
31+
__DIR__ . '/../../fixtures/drupal/modules/module_with_tests/tests/src/Functional/DefaultThemeTest.php',
32+
0,
33+
[]
34+
];
35+
yield [
36+
__DIR__ . '/../../fixtures/drupal/modules/module_with_tests/tests/src/Functional/ExtendsDefaultThemeTest.php',
37+
0,
38+
[]
39+
];
40+
}
41+
42+
43+
}

0 commit comments

Comments
 (0)