function SiteMaintenanceTest::testSiteMaintenance

Same name and namespace in other branches
  1. 9 core/modules/system/tests/src/Functional/System/SiteMaintenanceTest.php \Drupal\Tests\system\Functional\System\SiteMaintenanceTest::testSiteMaintenance()
  2. 10 core/modules/system/tests/src/Functional/System/SiteMaintenanceTest.php \Drupal\Tests\system\Functional\System\SiteMaintenanceTest::testSiteMaintenance()
  3. 11.x core/modules/system/tests/src/Functional/System/SiteMaintenanceTest.php \Drupal\Tests\system\Functional\System\SiteMaintenanceTest::testSiteMaintenance()

Verifies site maintenance mode functionality.

File

core/modules/system/tests/src/Functional/System/SiteMaintenanceTest.php, line 54

Class

SiteMaintenanceTest
Tests access to site while in maintenance mode.

Namespace

Drupal\Tests\system\Functional\System

Code

public function testSiteMaintenance() {
    // Verify that permission message is displayed.
    $permission_handler = $this->container
        ->get('user.permissions');
    $permissions = $permission_handler->getPermissions();
    $permission_label = $permissions['access site in maintenance mode']['title'];
    $permission_message = t('Visitors will only see the maintenance mode message. Only users with the "@permission-label" <a href=":permissions-url">permission</a> will be able to access the site. Authorized users can log in directly via the <a href=":user-login">user login</a> page.', [
        '@permission-label' => $permission_label,
        ':permissions-url' => Url::fromRoute('user.admin_permissions')->toString(),
        ':user-login' => Url::fromRoute('user.login')->toString(),
    ]);
    $this->drupalGet(Url::fromRoute('system.site_maintenance_mode'));
    $this->assertRaw($permission_message, 'Found the permission message.');
    $this->drupalGet(Url::fromRoute('user.page'));
    // JS should be aggregated, so drupal.js is not in the page source.
    $links = $this->xpath('//script[contains(@src, :href)]', [
        ':href' => '/core/misc/drupal.js',
    ]);
    $this->assertFalse(isset($links[0]), 'script /core/misc/drupal.js not in page');
    // Turn on maintenance mode.
    $edit = [
        'maintenance_mode' => 1,
    ];
    $this->drupalPostForm('admin/config/development/maintenance', $edit, t('Save configuration'));
    $admin_message = t('Operating in maintenance mode. <a href=":url">Go online.</a>', [
        ':url' => Url::fromRoute('system.site_maintenance_mode')->toString(),
    ]);
    $user_message = t('Operating in maintenance mode.');
    $offline_message = t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', [
        '@site' => $this->config('system.site')
            ->get('name'),
    ]);
    $this->drupalGet(Url::fromRoute('user.page'));
    // JS should not be aggregated, so drupal.js is expected in the page source.
    $links = $this->xpath('//script[contains(@src, :href)]', [
        ':href' => '/core/misc/drupal.js',
    ]);
    $this->assertTrue(isset($links[0]), 'script /core/misc/drupal.js in page');
    $this->assertRaw($admin_message, 'Found the site maintenance mode message.');
    // Logout and verify that offline message is displayed.
    $this->drupalLogout();
    $this->drupalGet('');
    $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]
        ->getText());
    $this->assertText($offline_message);
    $this->drupalGet('node');
    $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]
        ->getText());
    $this->assertText($offline_message);
    $this->drupalGet('user/register');
    $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]
        ->getText());
    $this->assertText($offline_message);
    // Verify that user is able to log in.
    $this->drupalGet('user');
    $this->assertNoText($offline_message);
    $this->drupalGet('user/login');
    $this->assertNoText($offline_message);
    // Log in user and verify that maintenance mode message is displayed
    // directly after login.
    $edit = [
        'name' => $this->user
            ->getAccountName(),
        'pass' => $this->user->pass_raw,
    ];
    $this->drupalPostForm(NULL, $edit, t('Log in'));
    $this->assertText($user_message);
    // Log in administrative user and configure a custom site offline message.
    $this->drupalLogout();
    $this->drupalLogin($this->adminUser);
    $this->drupalGet('admin/config/development/maintenance');
    $this->assertNoRaw($admin_message, 'Site maintenance mode message not displayed.');
    $offline_message = 'Sorry, not online.';
    $edit = [
        'maintenance_mode_message' => $offline_message,
    ];
    $this->drupalPostForm(NULL, $edit, t('Save configuration'));
    // Logout and verify that custom site offline message is displayed.
    $this->drupalLogout();
    $this->drupalGet('');
    $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]
        ->getText());
    $this->assertRaw($offline_message, 'Found the site offline message.');
    // Verify that custom site offline message is not displayed on user/password.
    $this->drupalGet('user/password');
    $this->assertText(t('Username or email address'), 'Anonymous users can access user/password');
    // Submit password reset form.
    $edit = [
        'name' => $this->user
            ->getAccountName(),
    ];
    $this->drupalPostForm('user/password', $edit, t('Submit'));
    $mails = $this->drupalGetMails();
    $start = strpos($mails[0]['body'], 'user/reset/' . $this->user
        ->id());
    $path = substr($mails[0]['body'], $start, 66 + strlen($this->user
        ->id()));
    // Log in with temporary login link.
    $this->drupalPostForm($path, [], t('Log in'));
    $this->assertText($user_message);
    // Regression test to check if title displays in Bartik on maintenance page.
    \Drupal::service('theme_installer')->install([
        'bartik',
    ]);
    $this->config('system.theme')
        ->set('default', 'bartik')
        ->save();
    // Logout and verify that offline message is displayed in Bartik.
    $this->drupalLogout();
    $this->drupalGet('');
    $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]
        ->getText());
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.