3 namespace Drupal\system\Tests\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 Drupal\simpletest\InstallerTestBase;
10 use Symfony\Component\HttpFoundation\Request;
13 * Tests distribution profile support with existing settings.
17 class DistributionProfileExistingSettingsTest extends InstallerTestBase {
20 * The distribution profile info.
29 protected function setUp() {
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);
80 protected function setUpLanguage() {
81 // Make settings file not writable.
82 $filename = $this->siteDirectory . '/settings.php';
83 // Make the settings file read-only.
84 // Not using File API; a potential error must trigger a PHP warning.
85 chmod($filename, 0444);
87 // Verify that the distribution name appears.
88 $this->assertRaw($this->info['distribution']['name']);
89 // Verify that the requested theme is used.
90 $this->assertRaw($this->info['distribution']['install']['theme']);
91 // Verify that the "Choose profile" step does not appear.
92 $this->assertNoText('profile');
94 parent::setUpLanguage();
100 protected function setUpProfile() {
101 // This step is skipped, because there is a distribution profile.
107 protected function setUpSettings() {
108 // This step should not appear, since settings.php is fully configured
113 * Confirms that the installation succeeded.
115 public function testInstalled() {
116 $this->assertUrl('user/1');
117 $this->assertResponse(200);
118 // Confirm that we are logged-in after installation.
119 $this->assertText($this->rootUser->getUsername());
121 // Confirm that Drupal recognizes this distribution as the current profile.
122 $this->assertEqual(\Drupal::installProfile(), 'mydistro');
123 $this->assertNull(Settings::get('install_profile'), 'The install profile has not been written to settings.php.');
124 $this->assertEqual($this->config('core.extension')->get('profile'), 'mydistro', 'The install profile has been written to core.extension configuration.');
126 $this->rebuildContainer();
127 $this->pass('Container can be rebuilt even though distribution is not written to settings.php.');
128 $this->assertEqual(\Drupal::installProfile(), 'mydistro');