annotate core/modules/system/src/Tests/System/SiteMaintenanceTest.php @ 12:7a779792577d

Update Drupal core to v8.4.5 (via Composer)
author Chris Cannam
date Fri, 23 Feb 2018 15:52:07 +0000
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\system\Tests\System;
Chris@0 4
Chris@0 5 use Drupal\Core\Url;
Chris@0 6 use Drupal\simpletest\WebTestBase;
Chris@0 7
Chris@0 8 /**
Chris@0 9 * Tests access to site while in maintenance mode.
Chris@0 10 *
Chris@0 11 * @group system
Chris@0 12 */
Chris@0 13 class SiteMaintenanceTest extends WebTestBase {
Chris@0 14
Chris@0 15 /**
Chris@0 16 * Modules to enable.
Chris@0 17 *
Chris@0 18 * @var array
Chris@0 19 */
Chris@0 20 public static $modules = ['node'];
Chris@0 21
Chris@0 22 protected $adminUser;
Chris@0 23
Chris@0 24 protected function setUp() {
Chris@0 25 parent::setUp();
Chris@0 26
Chris@0 27 // Configure 'node' as front page.
Chris@0 28 $this->config('system.site')->set('page.front', '/node')->save();
Chris@0 29 $this->config('system.performance')->set('js.preprocess', 1)->save();
Chris@0 30
Chris@0 31 // Create a user allowed to access site in maintenance mode.
Chris@0 32 $this->user = $this->drupalCreateUser(['access site in maintenance mode']);
Chris@0 33 // Create an administrative user.
Chris@0 34 $this->adminUser = $this->drupalCreateUser(['administer site configuration', 'access site in maintenance mode']);
Chris@0 35 $this->drupalLogin($this->adminUser);
Chris@0 36 }
Chris@0 37
Chris@0 38 /**
Chris@0 39 * Verifies site maintenance mode functionality.
Chris@0 40 */
Chris@0 41 public function testSiteMaintenance() {
Chris@0 42
Chris@0 43 // Verify that permission message is displayed.
Chris@0 44 $permission_handler = $this->container->get('user.permissions');
Chris@0 45 $permissions = $permission_handler->getPermissions();
Chris@0 46 $permission_label = $permissions['access site in maintenance mode']['title'];
Chris@0 47 $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' => \Drupal::url('user.admin_permissions'), ':user-login' => \Drupal::url('user.login')]);
Chris@0 48 $this->drupalGet(Url::fromRoute('system.site_maintenance_mode'));
Chris@0 49 $this->assertRaw($permission_message, 'Found the permission message.');
Chris@0 50
Chris@0 51 $this->drupalGet(Url::fromRoute('user.page'));
Chris@0 52 // JS should be aggregated, so drupal.js is not in the page source.
Chris@0 53 $links = $this->xpath('//script[contains(@src, :href)]', [':href' => '/core/misc/drupal.js']);
Chris@0 54 $this->assertFalse(isset($links[0]), 'script /core/misc/drupal.js not in page');
Chris@0 55 // Turn on maintenance mode.
Chris@0 56 $edit = [
Chris@0 57 'maintenance_mode' => 1,
Chris@0 58 ];
Chris@0 59 $this->drupalPostForm('admin/config/development/maintenance', $edit, t('Save configuration'));
Chris@0 60
Chris@0 61 $admin_message = t('Operating in maintenance mode. <a href=":url">Go online.</a>', [':url' => \Drupal::url('system.site_maintenance_mode')]);
Chris@0 62 $user_message = t('Operating in maintenance mode.');
Chris@0 63 $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')]);
Chris@0 64
Chris@0 65 $this->drupalGet(Url::fromRoute('user.page'));
Chris@0 66 // JS should not be aggregated, so drupal.js is expected in the page source.
Chris@0 67 $links = $this->xpath('//script[contains(@src, :href)]', [':href' => '/core/misc/drupal.js']);
Chris@0 68 $this->assertTrue(isset($links[0]), 'script /core/misc/drupal.js in page');
Chris@0 69 $this->assertRaw($admin_message, 'Found the site maintenance mode message.');
Chris@0 70
Chris@0 71 // Logout and verify that offline message is displayed.
Chris@0 72 $this->drupalLogout();
Chris@0 73 $this->drupalGet('');
Chris@0 74 $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]);
Chris@0 75 $this->assertText($offline_message);
Chris@0 76 $this->drupalGet('node');
Chris@0 77 $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]);
Chris@0 78 $this->assertText($offline_message);
Chris@0 79 $this->drupalGet('user/register');
Chris@0 80 $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]);
Chris@0 81 $this->assertText($offline_message);
Chris@0 82
Chris@0 83 // Verify that user is able to log in.
Chris@0 84 $this->drupalGet('user');
Chris@0 85 $this->assertNoText($offline_message);
Chris@0 86 $this->drupalGet('user/login');
Chris@0 87 $this->assertNoText($offline_message);
Chris@0 88
Chris@0 89 // Log in user and verify that maintenance mode message is displayed
Chris@0 90 // directly after login.
Chris@0 91 $edit = [
Chris@0 92 'name' => $this->user->getUsername(),
Chris@0 93 'pass' => $this->user->pass_raw,
Chris@0 94 ];
Chris@0 95 $this->drupalPostForm(NULL, $edit, t('Log in'));
Chris@0 96 $this->assertText($user_message);
Chris@0 97
Chris@0 98 // Log in administrative user and configure a custom site offline message.
Chris@0 99 $this->drupalLogout();
Chris@0 100 $this->drupalLogin($this->adminUser);
Chris@0 101 $this->drupalGet('admin/config/development/maintenance');
Chris@0 102 $this->assertNoRaw($admin_message, 'Site maintenance mode message not displayed.');
Chris@0 103
Chris@0 104 $offline_message = 'Sorry, not online.';
Chris@0 105 $edit = [
Chris@0 106 'maintenance_mode_message' => $offline_message,
Chris@0 107 ];
Chris@0 108 $this->drupalPostForm(NULL, $edit, t('Save configuration'));
Chris@0 109
Chris@0 110 // Logout and verify that custom site offline message is displayed.
Chris@0 111 $this->drupalLogout();
Chris@0 112 $this->drupalGet('');
Chris@0 113 $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]);
Chris@0 114 $this->assertRaw($offline_message, 'Found the site offline message.');
Chris@0 115
Chris@0 116 // Verify that custom site offline message is not displayed on user/password.
Chris@0 117 $this->drupalGet('user/password');
Chris@0 118 $this->assertText(t('Username or email address'), 'Anonymous users can access user/password');
Chris@0 119
Chris@0 120 // Submit password reset form.
Chris@0 121 $edit = [
Chris@0 122 'name' => $this->user->getUsername(),
Chris@0 123 ];
Chris@0 124 $this->drupalPostForm('user/password', $edit, t('Submit'));
Chris@0 125 $mails = $this->drupalGetMails();
Chris@0 126 $start = strpos($mails[0]['body'], 'user/reset/' . $this->user->id());
Chris@0 127 $path = substr($mails[0]['body'], $start, 66 + strlen($this->user->id()));
Chris@0 128
Chris@0 129 // Log in with temporary login link.
Chris@0 130 $this->drupalPostForm($path, [], t('Log in'));
Chris@0 131 $this->assertText($user_message);
Chris@0 132
Chris@0 133 // Regression test to check if title displays in Bartik on maintenance page.
Chris@0 134 \Drupal::service('theme_handler')->install(['bartik']);
Chris@0 135 $this->config('system.theme')->set('default', 'bartik')->save();
Chris@0 136
Chris@0 137 // Logout and verify that offline message is displayed in Bartik.
Chris@0 138 $this->drupalLogout();
Chris@0 139 $this->drupalGet('');
Chris@0 140 $this->assertEqual('Site under maintenance', $this->cssSelect('main h1')[0]);
Chris@0 141 }
Chris@0 142
Chris@0 143 /**
Chris@0 144 * Tests responses to non-HTML requests when in maintenance mode.
Chris@0 145 */
Chris@0 146 public function testNonHtmlRequest() {
Chris@0 147 $this->drupalLogout();
Chris@0 148 \Drupal::state()->set('system.maintenance_mode', TRUE);
Chris@0 149 $formats = ['json', 'xml', 'non-existing'];
Chris@0 150 foreach ($formats as $format) {
Chris@0 151 $this->pass('Testing format ' . $format);
Chris@0 152 $this->drupalGet('<front>', ['query' => ['_format' => $format]]);
Chris@0 153 $this->assertResponse(503);
Chris@0 154 $this->assertRaw('Drupal is currently under maintenance. We should be back shortly. Thank you for your patience.');
Chris@0 155 $this->assertHeader('Content-Type', 'text/plain; charset=UTF-8');
Chris@0 156 }
Chris@0 157 }
Chris@0 158
Chris@0 159 }