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;
14 * Tests distribution profile support with existing settings.
18 class DistributionProfileExistingSettingsTest extends InstallerTestBase {
21 * The distribution profile info.
30 protected function setUp() {
33 'core' => \Drupal::CORE_COMPATIBILITY,
34 'name' => 'Distribution profile',
36 'name' => 'My Distribution',
42 // File API functions are not available yet.
43 $path = $this->siteDirectory . '/profiles/mydistro';
44 mkdir($path, 0777, TRUE);
45 file_put_contents("$path/mydistro.info.yml", Yaml::encode($this->info));
47 // Pre-configure hash salt.
48 // Any string is valid, so simply use the class name of this test.
49 $this->settings['settings']['hash_salt'] = (object) [
54 // Pre-configure database credentials.
55 $connection_info = Database::getConnectionInfo();
56 unset($connection_info['default']['pdo']);
57 unset($connection_info['default']['init_commands']);
59 $this->settings['databases']['default'] = (object) [
60 'value' => $connection_info,
64 // Use the kernel to find the site path because the site.path service should
65 // not be available at this point in the install process.
66 $site_path = DrupalKernel::findSitePath(Request::createFromGlobals());
67 // Pre-configure config directories.
68 $this->settings['config_directories'] = [
69 CONFIG_SYNC_DIRECTORY => (object) [
70 'value' => $site_path . '/files/config_staging',
74 mkdir($this->settings['config_directories'][CONFIG_SYNC_DIRECTORY]->value, 0777, TRUE);
81 protected function setUpLanguage() {
82 // Make settings file not writable.
83 $filename = $this->siteDirectory . '/settings.php';
84 // Make the settings file read-only.
85 // Not using File API; a potential error must trigger a PHP warning.
86 chmod($filename, 0444);
88 // Verify that the distribution name appears.
89 $this->assertRaw($this->info['distribution']['name']);
90 // Verify that the requested theme is used.
91 $this->assertRaw($this->info['distribution']['install']['theme']);
92 // Verify that the "Choose profile" step does not appear.
93 $this->assertNoText('profile');
95 parent::setUpLanguage();
101 protected function setUpProfile() {
102 // This step is skipped, because there is a distribution profile.
108 protected function setUpSettings() {
109 // This step should not appear, since settings.php is fully configured
114 * Confirms that the installation succeeded.
116 public function testInstalled() {
117 $this->assertUrl('user/1');
118 $this->assertResponse(200);
119 // Confirm that we are logged-in after installation.
120 $this->assertText($this->rootUser->getUsername());
122 // Confirm that Drupal recognizes this distribution as the current profile.
123 $this->assertEqual(\Drupal::installProfile(), 'mydistro');
124 $this->assertNull(Settings::get('install_profile'), 'The install profile has not been written to settings.php.');
125 $this->assertEqual($this->config('core.extension')->get('profile'), 'mydistro', 'The install profile has been written to core.extension configuration.');
127 $this->rebuildContainer();
128 $this->pass('Container can be rebuilt even though distribution is not written to settings.php.');
129 $this->assertEqual(\Drupal::installProfile(), 'mydistro');