Mercurial > hg > isophonics-drupal-site
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Test/TestSetupTrait.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,202 @@ +<?php + +namespace Drupal\Core\Test; + +use Drupal\Core\Database\Database; + +/** + * Provides a trait for shared test setup functionality. + */ +trait TestSetupTrait { + + /** + * An array of config object names that are excluded from schema checking. + * + * @var string[] + */ + protected static $configSchemaCheckerExclusions = [ + // Following are used to test lack of or partial schema. Where partial + // schema is provided, that is explicitly tested in specific tests. + 'config_schema_test.noschema', + 'config_schema_test.someschema', + 'config_schema_test.schema_data_types', + 'config_schema_test.no_schema_data_types', + // Used to test application of schema to filtering of configuration. + 'config_test.dynamic.system', + ]; + + /** + * The dependency injection container used in the test. + * + * @var \Symfony\Component\DependencyInjection\ContainerInterface + */ + protected $container; + + /** + * The site directory of this test run. + * + * @var string + */ + protected $siteDirectory = NULL; + + /** + * The public file directory for the test environment. + * + * @see \Drupal\simpletest\TestBase::prepareEnvironment() + * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() + * + * @var string + */ + protected $publicFilesDirectory; + + /** + * The site directory of the original parent site. + * + * @var string + */ + protected $originalSite; + + /** + * The private file directory for the test environment. + * + * @see \Drupal\simpletest\TestBase::prepareEnvironment() + * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() + * + * @var string + */ + protected $privateFilesDirectory; + + /** + * The original installation profile. + * + * @var string + */ + protected $originalProfile; + + /** + * Set to TRUE to strict check all configuration saved. + * + * @see \Drupal\Core\Config\Testing\ConfigSchemaChecker + * + * @var bool + */ + protected $strictConfigSchema = TRUE; + + /** + * The DrupalKernel instance used in the test. + * + * @var \Drupal\Core\DrupalKernel + */ + protected $kernel; + + /** + * The temporary file directory for the test environment. + * + * This value has to match the temporary directory created in + * install_base_system() for test installs. + * + * @see \Drupal\simpletest\TestBase::prepareEnvironment() + * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() + * @see install_base_system() + * + * @var string + */ + protected $tempFilesDirectory; + + /** + * The test run ID. + * + * @var string + */ + protected $testId; + + /** + * Returns the database connection to the site running Simpletest. + * + * @return \Drupal\Core\Database\Connection + * The database connection to use for inserting assertions. + */ + public static function getDatabaseConnection() { + return TestDatabase::getConnection(); + } + + /** + * Generates a database prefix for running tests. + * + * The database prefix is used by prepareEnvironment() to setup a public files + * directory for the test to be run, which also contains the PHP error log, + * which is written to in case of a fatal error. Since that directory is based + * on the database prefix, all tests (even unit tests) need to have one, in + * order to access and read the error log. + * + * The generated database table prefix is used for the Drupal installation + * being performed for the test. It is also used as user agent HTTP header + * value by the cURL-based browser of WebTestBase, which is sent to the Drupal + * installation of the test. During early Drupal bootstrap, the user agent + * HTTP header is parsed, and if it matches, all database queries use the + * database table prefix that has been generated here. + * + * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment() + * @see \Drupal\simpletest\WebTestBase::curlInitialize() + * @see \Drupal\simpletest\TestBase::prepareEnvironment() + * @see drupal_valid_test_ua() + */ + protected function prepareDatabasePrefix() { + $test_db = new TestDatabase(); + $this->siteDirectory = $test_db->getTestSitePath(); + $this->databasePrefix = $test_db->getDatabasePrefix(); + } + + /** + * Changes the database connection to the prefixed one. + */ + protected function changeDatabasePrefix() { + if (empty($this->databasePrefix)) { + $this->prepareDatabasePrefix(); + } + + // If the test is run with argument dburl then use it. + $db_url = getenv('SIMPLETEST_DB'); + if (!empty($db_url)) { + $database = Database::convertDbUrlToConnectionInfo($db_url, isset($this->root) ? $this->root : DRUPAL_ROOT); + Database::addConnectionInfo('default', 'default', $database); + } + + // Clone the current connection and replace the current prefix. + $connection_info = Database::getConnectionInfo('default'); + if (is_null($connection_info)) { + 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.'); + } + else { + Database::renameConnection('default', 'simpletest_original_default'); + foreach ($connection_info as $target => $value) { + // Replace the full table prefix definition to ensure that no table + // prefixes of the test runner leak into the test. + $connection_info[$target]['prefix'] = [ + 'default' => $value['prefix']['default'] . $this->databasePrefix, + ]; + } + Database::addConnectionInfo('default', 'default', $connection_info['default']); + } + } + + /** + * Gets the config schema exclusions for this test. + * + * @return string[] + * An array of config object names that are excluded from schema checking. + */ + protected function getConfigSchemaExclusions() { + $class = get_class($this); + $exceptions = []; + while ($class) { + if (property_exists($class, 'configSchemaCheckerExclusions')) { + $exceptions = array_merge($exceptions, $class::$configSchemaCheckerExclusions); + } + $class = get_parent_class($class); + } + // Filter out any duplicates. + return array_unique($exceptions); + } + +}