You are here

protected function FunctionalTestSetupTrait::prepareSettings in Drupal 9

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php \Drupal\Core\Test\FunctionalTestSetupTrait::prepareSettings()

Prepares site settings and services before installation.

3 calls to FunctionalTestSetupTrait::prepareSettings()
BrowserTestBase::installDrupal in core/tests/Drupal/Tests/BrowserTestBase.php
Installs Drupal into the Simpletest site.
InstallerPerformanceTest::prepareSettings in core/tests/Drupal/FunctionalTests/Installer/InstallerPerformanceTest.php
Prepares site settings and services before installation.
TestSiteInstallCommand::installDrupal in core/tests/Drupal/TestSite/Commands/TestSiteInstallCommand.php
Installs Drupal into the test site.
2 methods override FunctionalTestSetupTrait::prepareSettings()
InstallerPerformanceTest::prepareSettings in core/tests/Drupal/FunctionalTests/Installer/InstallerPerformanceTest.php
Prepares site settings and services before installation.
UpdatePathTestBase::prepareSettings in core/tests/Drupal/FunctionalTests/Update/UpdatePathTestBase.php
Add settings that are missed since the installer isn't run.

File

core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php, line 64

Class

FunctionalTestSetupTrait
Defines a trait for shared functional test setup functionality.

Namespace

Drupal\Core\Test

Code

protected function prepareSettings() {

  // Prepare installer settings that are not install_drupal() parameters.
  // Copy and prepare an actual settings.php, so as to resemble a regular
  // installation.
  // Not using File API; a potential error must trigger a PHP warning.
  $directory = DRUPAL_ROOT . '/' . $this->siteDirectory;
  copy(DRUPAL_ROOT . '/sites/default/default.settings.php', $directory . '/settings.php');

  // The public file system path is created during installation. Additionally,
  // during tests:
  // - The temporary directory is set and created by install_base_system().
  // - The private file directory is created post install by
  //   FunctionalTestSetupTrait::initConfig().
  // @see system_requirements()
  // @see TestBase::prepareEnvironment()
  // @see install_base_system()
  // @see \Drupal\Core\Test\FunctionalTestSetupTrait::initConfig()
  $settings['settings']['file_public_path'] = (object) [
    'value' => $this->publicFilesDirectory,
    'required' => TRUE,
  ];
  $settings['settings']['file_private_path'] = (object) [
    'value' => $this->privateFilesDirectory,
    'required' => TRUE,
  ];
  $settings['settings']['file_temp_path'] = (object) [
    'value' => $this->tempFilesDirectory,
    'required' => TRUE,
  ];

  // Save the original site directory path, so that extensions in the
  // site-specific directory can still be discovered in the test site
  // environment.
  // @see \Drupal\Core\Extension\ExtensionDiscovery::scan()
  $settings['settings']['test_parent_site'] = (object) [
    'value' => $this->originalSite,
    'required' => TRUE,
  ];
  $settings['settings']['apcu_ensure_unique_prefix'] = (object) [
    'value' => $this->apcuEnsureUniquePrefix,
    'required' => TRUE,
  ];

  // Disable fetching of advisories during tests to avoid outbound calls. This
  // cannot be set in ::initConfig() because it would not stop these calls
  // during install. Tests that need to have the security advisories
  // functionality enabled should override this method and unset this
  // variable.
  // @see \Drupal\Tests\system\Functional\SecurityAdvisories\SecurityAdvisoryTest::writeSettings()
  $settings['config']['system.advisories']['enabled'] = (object) [
    'value' => FALSE,
    'required' => TRUE,
  ];
  $this
    ->writeSettings($settings);

  // Allow for test-specific overrides.
  $settings_testing_file = DRUPAL_ROOT . '/' . $this->originalSite . '/settings.testing.php';
  if (file_exists($settings_testing_file)) {

    // Copy the testing-specific settings.php overrides in place.
    copy($settings_testing_file, $directory . '/settings.testing.php');

    // Add the name of the testing class to settings.php and include the
    // testing specific overrides.
    file_put_contents($directory . '/settings.php', "\n\$test_class = '" . static::class . "';\n" . 'include DRUPAL_ROOT . \'/\' . $site_path . \'/settings.testing.php\';' . "\n", FILE_APPEND);
  }
  $settings_services_file = DRUPAL_ROOT . '/' . $this->originalSite . '/testing.services.yml';
  if (!file_exists($settings_services_file)) {

    // Otherwise, use the default services as a starting point for overrides.
    $settings_services_file = DRUPAL_ROOT . '/sites/default/default.services.yml';
  }

  // Copy the testing-specific service overrides in place.
  copy($settings_services_file, $directory . '/services.yml');
  if ($this->strictConfigSchema) {

    // Add a listener to validate configuration schema on save.
    $yaml = new SymfonyYaml();
    $content = file_get_contents($directory . '/services.yml');
    $services = $yaml
      ->parse($content);
    $services['services']['testing.config_schema_checker'] = [
      'class' => ConfigSchemaChecker::class,
      'arguments' => [
        '@config.typed',
        $this
          ->getConfigSchemaExclusions(),
      ],
      'tags' => [
        [
          'name' => 'event_subscriber',
        ],
      ],
    ];
    file_put_contents($directory . '/services.yml', $yaml
      ->dump($services));
  }

  // Since Drupal is bootstrapped already, install_begin_request() will not
  // bootstrap again. Hence, we have to reload the newly written custom
  // settings.php manually.
  Settings::initialize(DRUPAL_ROOT, $this->siteDirectory, $this->classLoader);
}