annotate core/profiles/standard/tests/src/Functional/StandardTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
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@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 }