Mercurial > hg > isophonics-drupal-site
comparison core/tests/Drupal/Tests/TestRequirementsTrait.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\Tests; | |
4 | |
5 use Drupal\Core\Extension\ExtensionDiscovery; | |
6 | |
7 /** | |
8 * Allows test classes to require Drupal modules as dependencies. | |
9 * | |
10 * This trait is assumed to be on a subclass of \PHPUnit_Framework_TestCase, and | |
11 * overrides \PHPUnit_Framework_TestCase::checkRequirements(). This allows the | |
12 * test to be marked as skipped before any kernel boot processes have happened. | |
13 */ | |
14 trait TestRequirementsTrait { | |
15 | |
16 /** | |
17 * Returns the Drupal root directory. | |
18 * | |
19 * @return string | |
20 */ | |
21 protected static function getDrupalRoot() { | |
22 return dirname(dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)))); | |
23 } | |
24 | |
25 /** | |
26 * Check module requirements for the Drupal use case. | |
27 * | |
28 * This method is assumed to override | |
29 * \PHPUnit_Framework_TestCase::checkRequirements(). | |
30 * | |
31 * @throws \PHPUnit_Framework_SkippedTestError | |
32 * Thrown when the requirements are not met, and this test should be | |
33 * skipped. Callers should not catch this exception. | |
34 */ | |
35 protected function checkRequirements() { | |
36 parent::checkRequirements(); | |
37 | |
38 $root = static::getDrupalRoot(); | |
39 | |
40 // Check if required dependencies exist. | |
41 $annotations = $this->getAnnotations(); | |
42 if (!empty($annotations['class']['requires'])) { | |
43 $this->checkModuleRequirements($root, $annotations['class']['requires']); | |
44 } | |
45 if (!empty($annotations['method']['requires'])) { | |
46 $this->checkModuleRequirements($root, $annotations['method']['requires']); | |
47 } | |
48 } | |
49 | |
50 /** | |
51 * Checks missing module requirements. | |
52 * | |
53 * Iterates through a list of requires annotations and looks for missing | |
54 * modules. The test will be skipped if any of the required modules is | |
55 * missing. | |
56 * | |
57 * @param string $root | |
58 * The path to the root of the Drupal installation to scan. | |
59 * @param string[] $annotations | |
60 * A list of requires annotations from either a method or class annotation. | |
61 * | |
62 * @throws \PHPUnit_Framework_SkippedTestError | |
63 * Thrown when the requirements are not met, and this test should be | |
64 * skipped. Callers should not catch this exception. | |
65 */ | |
66 private function checkModuleRequirements($root, array $annotations) { | |
67 // drupal_valid_ua() might not be loaded. | |
68 require_once $root . '/core/includes/bootstrap.inc'; | |
69 | |
70 // Make a list of required modules. | |
71 $required_modules = []; | |
72 foreach ($annotations as $requirement) { | |
73 if (strpos($requirement, 'module ') === 0) { | |
74 $required_modules[] = trim(str_replace('module ', '', $requirement)); | |
75 } | |
76 } | |
77 | |
78 // If there are required modules, check if they're available. | |
79 if (!empty($required_modules)) { | |
80 // Scan for modules. | |
81 $discovery = new ExtensionDiscovery($root, FALSE); | |
82 $discovery->setProfileDirectories([]); | |
83 $list = array_keys($discovery->scan('module')); | |
84 $not_available = array_diff($required_modules, $list); | |
85 if (!empty($not_available)) { | |
86 throw new \PHPUnit_Framework_SkippedTestError('Required modules: ' . implode(', ', $not_available)); | |
87 } | |
88 } | |
89 } | |
90 | |
91 } |