annotate core/profiles/standard/tests/src/Functional/StandardTest.php @ 17:129ea1e6d783

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