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 }
|