3 namespace Drupal\FunctionalTests\Installer;
5 use Drupal\Component\Serialization\Yaml;
6 use Drupal\Core\Database\Database;
7 use Drupal\Core\DrupalKernel;
8 use Drupal\Core\Site\Settings;
9 use Symfony\Component\HttpFoundation\Request;
12 * Tests distribution profile support with existing settings.
16 class DistributionProfileExistingSettingsTest extends InstallerTestBase {
19 * The distribution profile info.
28 protected function prepareEnvironment() {
29 parent::prepareEnvironment();
32 'core' => \Drupal::CORE_COMPATIBILITY,
33 'name' => 'Distribution profile',
35 'name' => 'My Distribution',
41 // File API functions are not available yet.
42 $path = $this->siteDirectory . '/profiles/mydistro';
43 mkdir($path, 0777, TRUE);
44 file_put_contents("$path/mydistro.info.yml", Yaml::encode($this->info));
46 // Pre-configure hash salt.
47 // Any string is valid, so simply use the class name of this test.
48 $this->settings['settings']['hash_salt'] = (object) [
53 // Pre-configure database credentials.
54 $connection_info = Database::getConnectionInfo();
55 unset($connection_info['default']['pdo']);
56 unset($connection_info['default']['init_commands']);
58 $this->settings['databases']['default'] = (object) [
59 'value' => $connection_info,
63 // Use the kernel to find the site path because the site.path service should
64 // not be available at this point in the install process.
65 $site_path = DrupalKernel::findSitePath(Request::createFromGlobals());
66 // Pre-configure config directories.
67 $this->settings['config_directories'] = [
68 CONFIG_SYNC_DIRECTORY => (object) [
69 'value' => $site_path . '/files/config_staging',
73 mkdir($this->settings['config_directories'][CONFIG_SYNC_DIRECTORY]->value, 0777, TRUE);
79 protected function setUpLanguage() {
80 // Make settings file not writable.
81 $filename = $this->siteDirectory . '/settings.php';
82 // Make the settings file read-only.
83 // Not using File API; a potential error must trigger a PHP warning.
84 chmod($filename, 0444);
86 // Verify that the distribution name appears.
87 $this->assertRaw($this->info['distribution']['name']);
88 // Verify that the requested theme is used.
89 $this->assertRaw($this->info['distribution']['install']['theme']);
90 // Verify that the "Choose profile" step does not appear.
91 $this->assertNoText('profile');
93 parent::setUpLanguage();
99 protected function setUpProfile() {
100 // This step is skipped, because there is a distribution profile.
106 protected function setUpSettings() {
107 // This step should not appear, since settings.php is fully configured
112 * Confirms that the installation succeeded.
114 public function testInstalled() {
115 $this->assertUrl('user/1');
116 $this->assertResponse(200);
117 // Confirm that we are logged-in after installation.
118 $this->assertText($this->rootUser->getUsername());
120 // Confirm that Drupal recognizes this distribution as the current profile.
121 $this->assertEqual(\Drupal::installProfile(), 'mydistro');
122 $this->assertArrayNotHasKey('install_profile', Settings::getAll(), 'The install profile has not been written to settings.php.');
123 $this->assertEqual($this->config('core.extension')->get('profile'), 'mydistro', 'The install profile has been written to core.extension configuration.');
125 $this->rebuildContainer();
126 $this->pass('Container can be rebuilt even though distribution is not written to settings.php.');
127 $this->assertEqual(\Drupal::installProfile(), 'mydistro');