Mercurial > hg > isophonics-drupal-site
comparison core/lib/Drupal/Core/Test/TestSetupTrait.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\Core\Test; | |
4 | |
5 use Drupal\Core\Database\Database; | |
6 | |
7 /** | |
8 * Provides a trait for shared test setup functionality. | |
9 */ | |
10 trait TestSetupTrait { | |
11 | |
12 /** | |
13 * An array of config object names that are excluded from schema checking. | |
14 * | |
15 * @var string[] | |
16 */ | |
17 protected static $configSchemaCheckerExclusions = [ | |
18 // Following are used to test lack of or partial schema. Where partial | |
19 // schema is provided, that is explicitly tested in specific tests. | |
20 'config_schema_test.noschema', | |
21 'config_schema_test.someschema', | |
22 'config_schema_test.schema_data_types', | |
23 'config_schema_test.no_schema_data_types', | |
24 // Used to test application of schema to filtering of configuration. | |
25 'config_test.dynamic.system', | |
26 ]; | |
27 | |
28 /** | |
29 * The dependency injection container used in the test. | |
30 * | |
31 * @var \Symfony\Component\DependencyInjection\ContainerInterface | |
32 */ | |
33 protected $container; | |
34 | |
35 /** | |
36 * The site directory of this test run. | |
37 * | |
38 * @var string | |
39 */ | |
40 protected $siteDirectory = NULL; | |
41 | |
42 /** | |
43 * The public file directory for the test environment. | |
44 * | |
45 * @see \Drupal\simpletest\TestBase::prepareEnvironment() | |
46 * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() | |
47 * | |
48 * @var string | |
49 */ | |
50 protected $publicFilesDirectory; | |
51 | |
52 /** | |
53 * The site directory of the original parent site. | |
54 * | |
55 * @var string | |
56 */ | |
57 protected $originalSite; | |
58 | |
59 /** | |
60 * The private file directory for the test environment. | |
61 * | |
62 * @see \Drupal\simpletest\TestBase::prepareEnvironment() | |
63 * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() | |
64 * | |
65 * @var string | |
66 */ | |
67 protected $privateFilesDirectory; | |
68 | |
69 /** | |
70 * The original installation profile. | |
71 * | |
72 * @var string | |
73 */ | |
74 protected $originalProfile; | |
75 | |
76 /** | |
77 * Set to TRUE to strict check all configuration saved. | |
78 * | |
79 * @see \Drupal\Core\Config\Testing\ConfigSchemaChecker | |
80 * | |
81 * @var bool | |
82 */ | |
83 protected $strictConfigSchema = TRUE; | |
84 | |
85 /** | |
86 * The DrupalKernel instance used in the test. | |
87 * | |
88 * @var \Drupal\Core\DrupalKernel | |
89 */ | |
90 protected $kernel; | |
91 | |
92 /** | |
93 * The temporary file directory for the test environment. | |
94 * | |
95 * This value has to match the temporary directory created in | |
96 * install_base_system() for test installs. | |
97 * | |
98 * @see \Drupal\simpletest\TestBase::prepareEnvironment() | |
99 * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() | |
100 * @see install_base_system() | |
101 * | |
102 * @var string | |
103 */ | |
104 protected $tempFilesDirectory; | |
105 | |
106 /** | |
107 * The test run ID. | |
108 * | |
109 * @var string | |
110 */ | |
111 protected $testId; | |
112 | |
113 /** | |
114 * Returns the database connection to the site running Simpletest. | |
115 * | |
116 * @return \Drupal\Core\Database\Connection | |
117 * The database connection to use for inserting assertions. | |
118 */ | |
119 public static function getDatabaseConnection() { | |
120 return TestDatabase::getConnection(); | |
121 } | |
122 | |
123 /** | |
124 * Generates a database prefix for running tests. | |
125 * | |
126 * The database prefix is used by prepareEnvironment() to setup a public files | |
127 * directory for the test to be run, which also contains the PHP error log, | |
128 * which is written to in case of a fatal error. Since that directory is based | |
129 * on the database prefix, all tests (even unit tests) need to have one, in | |
130 * order to access and read the error log. | |
131 * | |
132 * The generated database table prefix is used for the Drupal installation | |
133 * being performed for the test. It is also used as user agent HTTP header | |
134 * value by the cURL-based browser of WebTestBase, which is sent to the Drupal | |
135 * installation of the test. During early Drupal bootstrap, the user agent | |
136 * HTTP header is parsed, and if it matches, all database queries use the | |
137 * database table prefix that has been generated here. | |
138 * | |
139 * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() | |
140 * @see \Drupal\simpletest\WebTestBase::curlInitialize() | |
141 * @see \Drupal\simpletest\TestBase::prepareEnvironment() | |
142 * @see drupal_valid_test_ua() | |
143 */ | |
144 protected function prepareDatabasePrefix() { | |
145 $test_db = new TestDatabase(); | |
146 $this->siteDirectory = $test_db->getTestSitePath(); | |
147 $this->databasePrefix = $test_db->getDatabasePrefix(); | |
148 } | |
149 | |
150 /** | |
151 * Changes the database connection to the prefixed one. | |
152 */ | |
153 protected function changeDatabasePrefix() { | |
154 if (empty($this->databasePrefix)) { | |
155 $this->prepareDatabasePrefix(); | |
156 } | |
157 | |
158 // If the test is run with argument dburl then use it. | |
159 $db_url = getenv('SIMPLETEST_DB'); | |
160 if (!empty($db_url)) { | |
161 $database = Database::convertDbUrlToConnectionInfo($db_url, isset($this->root) ? $this->root : DRUPAL_ROOT); | |
162 Database::addConnectionInfo('default', 'default', $database); | |
163 } | |
164 | |
165 // Clone the current connection and replace the current prefix. | |
166 $connection_info = Database::getConnectionInfo('default'); | |
167 if (is_null($connection_info)) { | |
168 throw new \InvalidArgumentException('There is no database connection so no tests can be run. You must provide a SIMPLETEST_DB environment variable to run PHPUnit based functional tests outside of run-tests.sh.'); | |
169 } | |
170 else { | |
171 Database::renameConnection('default', 'simpletest_original_default'); | |
172 foreach ($connection_info as $target => $value) { | |
173 // Replace the full table prefix definition to ensure that no table | |
174 // prefixes of the test runner leak into the test. | |
175 $connection_info[$target]['prefix'] = [ | |
176 'default' => $value['prefix']['default'] . $this->databasePrefix, | |
177 ]; | |
178 } | |
179 Database::addConnectionInfo('default', 'default', $connection_info['default']); | |
180 } | |
181 } | |
182 | |
183 /** | |
184 * Gets the config schema exclusions for this test. | |
185 * | |
186 * @return string[] | |
187 * An array of config object names that are excluded from schema checking. | |
188 */ | |
189 protected function getConfigSchemaExclusions() { | |
190 $class = get_class($this); | |
191 $exceptions = []; | |
192 while ($class) { | |
193 if (property_exists($class, 'configSchemaCheckerExclusions')) { | |
194 $exceptions = array_merge($exceptions, $class::$configSchemaCheckerExclusions); | |
195 } | |
196 $class = get_parent_class($class); | |
197 } | |
198 // Filter out any duplicates. | |
199 return array_unique($exceptions); | |
200 } | |
201 | |
202 } |