Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\standard\Functional;
|
Chris@0
|
4
|
Chris@17
|
5 use Drupal\Component\Utility\Html;
|
Chris@17
|
6 use Drupal\media\Entity\MediaType;
|
Chris@0
|
7 use Drupal\Tests\SchemaCheckTestTrait;
|
Chris@0
|
8 use Drupal\contact\Entity\ContactForm;
|
Chris@0
|
9 use Drupal\Core\Url;
|
Chris@0
|
10 use Drupal\dynamic_page_cache\EventSubscriber\DynamicPageCacheSubscriber;
|
Chris@0
|
11 use Drupal\filter\Entity\FilterFormat;
|
Chris@0
|
12 use Drupal\Tests\BrowserTestBase;
|
Chris@18
|
13 use Drupal\Tests\RequirementsPageTrait;
|
Chris@0
|
14 use Drupal\user\Entity\Role;
|
Chris@0
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * Tests Standard installation profile expectations.
|
Chris@0
|
18 *
|
Chris@0
|
19 * @group standard
|
Chris@0
|
20 */
|
Chris@0
|
21 class StandardTest extends BrowserTestBase {
|
Chris@0
|
22
|
Chris@0
|
23 use SchemaCheckTestTrait;
|
Chris@18
|
24 use RequirementsPageTrait;
|
Chris@0
|
25
|
Chris@0
|
26 protected $profile = 'standard';
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * The admin user.
|
Chris@0
|
30 *
|
Chris@0
|
31 * @var \Drupal\user\UserInterface
|
Chris@0
|
32 */
|
Chris@0
|
33 protected $adminUser;
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@0
|
36 * Tests Standard installation profile.
|
Chris@0
|
37 */
|
Chris@0
|
38 public function testStandard() {
|
Chris@0
|
39 $this->drupalGet('');
|
Chris@0
|
40 $this->assertLink(t('Contact'));
|
Chris@0
|
41 $this->clickLink(t('Contact'));
|
Chris@0
|
42 $this->assertResponse(200);
|
Chris@0
|
43
|
Chris@0
|
44 // Test anonymous user can access 'Main navigation' block.
|
Chris@0
|
45 $this->adminUser = $this->drupalCreateUser([
|
Chris@0
|
46 'administer blocks',
|
Chris@0
|
47 'post comments',
|
Chris@0
|
48 'skip comment approval',
|
Chris@0
|
49 'create article content',
|
Chris@0
|
50 'create page content',
|
Chris@0
|
51 ]);
|
Chris@0
|
52 $this->drupalLogin($this->adminUser);
|
Chris@0
|
53 // Configure the block.
|
Chris@0
|
54 $this->drupalGet('admin/structure/block/add/system_menu_block:main/bartik');
|
Chris@0
|
55 $this->drupalPostForm(NULL, [
|
Chris@0
|
56 'region' => 'sidebar_first',
|
Chris@0
|
57 'id' => 'main_navigation',
|
Chris@0
|
58 ], t('Save block'));
|
Chris@0
|
59 // Verify admin user can see the block.
|
Chris@0
|
60 $this->drupalGet('');
|
Chris@0
|
61 $this->assertText('Main navigation');
|
Chris@0
|
62
|
Chris@0
|
63 // Verify we have role = aria on system_powered_by and help_block
|
Chris@0
|
64 // blocks.
|
Chris@0
|
65 $this->drupalGet('admin/structure/block');
|
Chris@0
|
66 $elements = $this->xpath('//div[@role=:role and @id=:id]', [
|
Chris@0
|
67 ':role' => 'complementary',
|
Chris@0
|
68 ':id' => 'block-bartik-help',
|
Chris@0
|
69 ]);
|
Chris@0
|
70
|
Chris@0
|
71 $this->assertEqual(count($elements), 1, 'Found complementary role on help block.');
|
Chris@0
|
72
|
Chris@0
|
73 $this->drupalGet('');
|
Chris@0
|
74 $elements = $this->xpath('//div[@role=:role and @id=:id]', [
|
Chris@0
|
75 ':role' => 'complementary',
|
Chris@0
|
76 ':id' => 'block-bartik-powered',
|
Chris@0
|
77 ]);
|
Chris@0
|
78 $this->assertEqual(count($elements), 1, 'Found complementary role on powered by block.');
|
Chris@0
|
79
|
Chris@0
|
80 // Verify anonymous user can see the block.
|
Chris@0
|
81 $this->drupalLogout();
|
Chris@0
|
82 $this->assertText('Main navigation');
|
Chris@0
|
83
|
Chris@0
|
84 // Ensure comments don't show in the front page RSS feed.
|
Chris@0
|
85 // Create an article.
|
Chris@0
|
86 $this->drupalCreateNode([
|
Chris@0
|
87 'type' => 'article',
|
Chris@0
|
88 'title' => 'Foobar',
|
Chris@0
|
89 'promote' => 1,
|
Chris@0
|
90 'status' => 1,
|
Chris@0
|
91 'body' => [['value' => 'Then she picked out two somebodies,<br />Sally and me', 'format' => 'basic_html']],
|
Chris@0
|
92 ]);
|
Chris@0
|
93
|
Chris@0
|
94 // Add a comment.
|
Chris@0
|
95 $this->drupalLogin($this->adminUser);
|
Chris@0
|
96 $this->drupalGet('node/1');
|
Chris@0
|
97 $this->assertRaw('Then she picked out two somebodies,<br />Sally and me', 'Found a line break.');
|
Chris@0
|
98 $this->drupalPostForm(NULL, [
|
Chris@0
|
99 'subject[0][value]' => 'Barfoo',
|
Chris@0
|
100 'comment_body[0][value]' => 'Then she picked out two somebodies, Sally and me',
|
Chris@0
|
101 ], t('Save'));
|
Chris@0
|
102 // Fetch the feed.
|
Chris@0
|
103 $this->drupalGet('rss.xml');
|
Chris@0
|
104 $this->assertText('Foobar');
|
Chris@0
|
105 $this->assertNoText('Then she picked out two somebodies, Sally and me');
|
Chris@0
|
106
|
Chris@0
|
107 // Ensure block body exists.
|
Chris@0
|
108 $this->drupalGet('block/add');
|
Chris@0
|
109 $this->assertFieldByName('body[0][value]');
|
Chris@0
|
110
|
Chris@0
|
111 // Now we have all configuration imported, test all of them for schema
|
Chris@0
|
112 // conformance. Ensures all imported default configuration is valid when
|
Chris@0
|
113 // standard profile modules are enabled.
|
Chris@0
|
114 $names = $this->container->get('config.storage')->listAll();
|
Chris@0
|
115 /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config */
|
Chris@0
|
116 $typed_config = $this->container->get('config.typed');
|
Chris@0
|
117 foreach ($names as $name) {
|
Chris@0
|
118 $config = $this->config($name);
|
Chris@0
|
119 $this->assertConfigSchema($typed_config, $name, $config->get());
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 // Ensure that configuration from the Standard profile is not reused when
|
Chris@0
|
123 // enabling a module again since it contains configuration that can not be
|
Chris@0
|
124 // installed. For example, editor.editor.basic_html is editor configuration
|
Chris@0
|
125 // that depends on the ckeditor module. The ckeditor module can not be
|
Chris@0
|
126 // installed before the editor module since it depends on the editor module.
|
Chris@0
|
127 // The installer does not have this limitation since it ensures that all of
|
Chris@0
|
128 // the install profiles dependencies are installed before creating the
|
Chris@0
|
129 // editor configuration.
|
Chris@0
|
130 foreach (FilterFormat::loadMultiple() as $filter) {
|
Chris@0
|
131 // Ensure that editor can be uninstalled by removing use in filter
|
Chris@0
|
132 // formats. It is necessary to prime the filter collection before removing
|
Chris@0
|
133 // the filter.
|
Chris@0
|
134 $filter->filters();
|
Chris@0
|
135 $filter->removeFilter('editor_file_reference');
|
Chris@0
|
136 $filter->save();
|
Chris@0
|
137 }
|
Chris@0
|
138 \Drupal::service('module_installer')->uninstall(['editor', 'ckeditor']);
|
Chris@0
|
139 $this->rebuildContainer();
|
Chris@0
|
140 \Drupal::service('module_installer')->install(['editor']);
|
Chris@0
|
141 /** @var \Drupal\contact\ContactFormInterface $contact_form */
|
Chris@0
|
142 $contact_form = ContactForm::load('feedback');
|
Chris@0
|
143 $recipients = $contact_form->getRecipients();
|
Chris@0
|
144 $this->assertEqual(['simpletest@example.com'], $recipients);
|
Chris@0
|
145
|
Chris@0
|
146 $role = Role::create([
|
Chris@0
|
147 'id' => 'admin_theme',
|
Chris@0
|
148 'label' => 'Admin theme',
|
Chris@0
|
149 ]);
|
Chris@0
|
150 $role->grantPermission('view the administration theme');
|
Chris@0
|
151 $role->save();
|
Chris@0
|
152 $this->adminUser->addRole($role->id());
|
Chris@0
|
153 $this->adminUser->save();
|
Chris@0
|
154 $this->drupalGet('node/add');
|
Chris@0
|
155 $this->assertResponse(200);
|
Chris@0
|
156
|
Chris@0
|
157 // Ensure that there are no pending updates after installation.
|
Chris@0
|
158 $this->drupalLogin($this->rootUser);
|
Chris@0
|
159 $this->drupalGet('update.php/selection');
|
Chris@18
|
160 $this->updateRequirementsProblem();
|
Chris@18
|
161 $this->drupalGet('update.php/selection');
|
Chris@0
|
162 $this->assertText('No pending updates.');
|
Chris@0
|
163
|
Chris@0
|
164 // Ensure that there are no pending entity updates after installation.
|
Chris@0
|
165 $this->assertFalse($this->container->get('entity.definition_update_manager')->needsUpdates(), 'After installation, entity schema is up to date.');
|
Chris@0
|
166
|
Chris@0
|
167 // Make sure the optional image styles are not installed.
|
Chris@0
|
168 $this->drupalGet('admin/config/media/image-styles');
|
Chris@0
|
169 $this->assertNoText('Max 325x325');
|
Chris@0
|
170 $this->assertNoText('Max 650x650');
|
Chris@0
|
171 $this->assertNoText('Max 1300x1300');
|
Chris@0
|
172 $this->assertNoText('Max 2600x2600');
|
Chris@0
|
173
|
Chris@0
|
174 // Make sure the optional image styles are installed after enabling
|
Chris@0
|
175 // the responsive_image module.
|
Chris@0
|
176 \Drupal::service('module_installer')->install(['responsive_image']);
|
Chris@0
|
177 $this->rebuildContainer();
|
Chris@0
|
178 $this->drupalGet('admin/config/media/image-styles');
|
Chris@0
|
179 $this->assertText('Max 325x325');
|
Chris@0
|
180 $this->assertText('Max 650x650');
|
Chris@0
|
181 $this->assertText('Max 1300x1300');
|
Chris@0
|
182 $this->assertText('Max 2600x2600');
|
Chris@0
|
183
|
Chris@0
|
184 // Verify certain routes' responses are cacheable by Dynamic Page Cache, to
|
Chris@0
|
185 // ensure these responses are very fast for authenticated users.
|
Chris@0
|
186 $this->dumpHeaders = TRUE;
|
Chris@0
|
187 $this->drupalLogin($this->adminUser);
|
Chris@0
|
188 $url = Url::fromRoute('contact.site_page');
|
Chris@0
|
189 $this->drupalGet($url);
|
Chris@0
|
190 $this->assertEqual('UNCACHEABLE', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Site-wide contact page cannot be cached by Dynamic Page Cache.');
|
Chris@0
|
191
|
Chris@0
|
192 $url = Url::fromRoute('<front>');
|
Chris@0
|
193 $this->drupalGet($url);
|
Chris@0
|
194 $this->drupalGet($url);
|
Chris@0
|
195 $this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Frontpage is cached by Dynamic Page Cache.');
|
Chris@0
|
196
|
Chris@0
|
197 $url = Url::fromRoute('entity.node.canonical', ['node' => 1]);
|
Chris@0
|
198 $this->drupalGet($url);
|
Chris@0
|
199 $this->drupalGet($url);
|
Chris@0
|
200 $this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Full node page is cached by Dynamic Page Cache.');
|
Chris@0
|
201
|
Chris@0
|
202 $url = Url::fromRoute('entity.user.canonical', ['user' => 1]);
|
Chris@0
|
203 $this->drupalGet($url);
|
Chris@0
|
204 $this->drupalGet($url);
|
Chris@0
|
205 $this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'User profile page is cached by Dynamic Page Cache.');
|
Chris@17
|
206
|
Chris@17
|
207 // Make sure the editorial workflow is installed after enabling the
|
Chris@17
|
208 // content_moderation module.
|
Chris@17
|
209 \Drupal::service('module_installer')->install(['content_moderation']);
|
Chris@17
|
210 $role = Role::create([
|
Chris@17
|
211 'id' => 'admin_workflows',
|
Chris@17
|
212 'label' => 'Admin workflow',
|
Chris@17
|
213 ]);
|
Chris@17
|
214 $role->grantPermission('administer workflows');
|
Chris@17
|
215 $role->save();
|
Chris@17
|
216 $this->adminUser->addRole($role->id());
|
Chris@17
|
217 $this->adminUser->save();
|
Chris@17
|
218 $this->rebuildContainer();
|
Chris@17
|
219 $this->drupalGet('admin/config/workflow/workflows/manage/editorial');
|
Chris@17
|
220 $this->assertText('Draft');
|
Chris@17
|
221 $this->assertText('Published');
|
Chris@17
|
222 $this->assertText('Archived');
|
Chris@17
|
223 $this->assertText('Create New Draft');
|
Chris@17
|
224 $this->assertText('Publish');
|
Chris@17
|
225 $this->assertText('Archive');
|
Chris@17
|
226 $this->assertText('Restore to Draft');
|
Chris@17
|
227 $this->assertText('Restore');
|
Chris@17
|
228
|
Chris@17
|
229 \Drupal::service('module_installer')->install(['media']);
|
Chris@17
|
230 $role = Role::create([
|
Chris@17
|
231 'id' => 'admin_media',
|
Chris@17
|
232 'label' => 'Admin media',
|
Chris@17
|
233 ]);
|
Chris@17
|
234 $role->grantPermission('administer media');
|
Chris@17
|
235 $role->save();
|
Chris@17
|
236 $this->adminUser->addRole($role->id());
|
Chris@17
|
237 $this->adminUser->save();
|
Chris@17
|
238 $assert_session = $this->assertSession();
|
Chris@17
|
239 $page = $this->getSession()->getPage();
|
Chris@17
|
240 /** @var \Drupal\media\Entity\MediaType $media_type */
|
Chris@17
|
241 foreach (MediaType::loadMultiple() as $media_type) {
|
Chris@17
|
242 $media_type_machine_name = $media_type->id();
|
Chris@17
|
243 $this->drupalGet('media/add/' . $media_type_machine_name);
|
Chris@17
|
244 // Get the form element, and its HTML representation.
|
Chris@17
|
245 $form_selector = '#media-' . Html::cleanCssIdentifier($media_type_machine_name) . '-add-form';
|
Chris@17
|
246 $form = $assert_session->elementExists('css', $form_selector);
|
Chris@17
|
247 $form_html = $form->getOuterHtml();
|
Chris@17
|
248
|
Chris@18
|
249 // The name field should be hidden.
|
Chris@18
|
250 $assert_session->fieldNotExists('Name', $form);
|
Chris@18
|
251 // The source field should be shown before the vertical tabs.
|
Chris@17
|
252 $test_source_field = $assert_session->fieldExists($media_type->getSource()->getSourceFieldDefinition($media_type)->getLabel(), $form)->getOuterHtml();
|
Chris@17
|
253 $vertical_tabs = $assert_session->elementExists('css', '.form-type-vertical-tabs', $form)->getOuterHtml();
|
Chris@18
|
254 $this->assertTrue(strpos($form_html, $vertical_tabs) > strpos($form_html, $test_source_field));
|
Chris@18
|
255 // The "Published" checkbox should be the last element.
|
Chris@17
|
256 $date_field = $assert_session->fieldExists('Date', $form)->getOuterHtml();
|
Chris@17
|
257 $published_checkbox = $assert_session->fieldExists('Published', $form)->getOuterHtml();
|
Chris@17
|
258 $this->assertTrue(strpos($form_html, $published_checkbox) > strpos($form_html, $date_field));
|
Chris@17
|
259 }
|
Chris@0
|
260 }
|
Chris@0
|
261
|
Chris@0
|
262 }
|