annotate core/modules/media/tests/src/Functional/MediaUiFunctionalTest.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents a9cd425dd02b
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\media\Functional;
Chris@0 4
Chris@0 5 use Behat\Mink\Element\NodeElement;
Chris@0 6 use Drupal\Core\Field\FieldStorageDefinitionInterface;
Chris@0 7 use Drupal\Core\Url;
Chris@0 8 use Drupal\field\Entity\FieldConfig;
Chris@0 9 use Drupal\field\Entity\FieldStorageConfig;
Chris@0 10
Chris@0 11 /**
Chris@0 12 * Ensures that media UI works correctly.
Chris@0 13 *
Chris@0 14 * @group media
Chris@0 15 */
Chris@0 16 class MediaUiFunctionalTest extends MediaFunctionalTestBase {
Chris@0 17
Chris@0 18 /**
Chris@0 19 * Modules to enable.
Chris@0 20 *
Chris@0 21 * @var array
Chris@0 22 */
Chris@0 23 public static $modules = [
Chris@0 24 'block',
Chris@0 25 'media_test_source',
Chris@0 26 ];
Chris@0 27
Chris@0 28 /**
Chris@0 29 * {@inheritdoc}
Chris@0 30 */
Chris@0 31 protected function setUp() {
Chris@0 32 parent::setUp();
Chris@0 33 $this->drupalPlaceBlock('local_actions_block');
Chris@0 34 $this->drupalPlaceBlock('local_tasks_block');
Chris@0 35 }
Chris@0 36
Chris@0 37 /**
Chris@0 38 * Tests the media actions (add/edit/delete).
Chris@0 39 */
Chris@0 40 public function testMediaWithOnlyOneMediaType() {
Chris@0 41 $session = $this->getSession();
Chris@0 42 $page = $session->getPage();
Chris@0 43 $assert_session = $this->assertSession();
Chris@0 44
Chris@4 45 $media_type = $this->createMediaType('test', [
Chris@0 46 'queue_thumbnail_downloads' => FALSE,
Chris@0 47 ]);
Chris@0 48
Chris@0 49 $this->drupalGet('media/add');
Chris@0 50 $assert_session->statusCodeEquals(200);
Chris@0 51 $assert_session->addressEquals('media/add/' . $media_type->id());
Chris@0 52 $assert_session->elementNotExists('css', '#edit-revision');
Chris@0 53
Chris@0 54 // Tests media add form.
Chris@0 55 $media_name = $this->randomMachineName();
Chris@0 56 $page->fillField('name[0][value]', $media_name);
Chris@0 57 $revision_log_message = $this->randomString();
Chris@0 58 $page->fillField('revision_log_message[0][value]', $revision_log_message);
Chris@0 59 $source_field = $this->randomString();
Chris@0 60 $page->fillField('field_media_test[0][value]', $source_field);
Chris@0 61 $page->pressButton('Save');
Chris@4 62 $media_id = $this->container->get('entity_type.manager')
Chris@4 63 ->getStorage('media')
Chris@4 64 ->getQuery()
Chris@4 65 ->execute();
Chris@0 66 $media_id = reset($media_id);
Chris@0 67 /** @var \Drupal\media\MediaInterface $media */
Chris@0 68 $media = $this->container->get('entity_type.manager')
Chris@0 69 ->getStorage('media')
Chris@0 70 ->loadUnchanged($media_id);
Chris@4 71 $this->assertSame($media->getRevisionLogMessage(), $revision_log_message);
Chris@4 72 $this->assertSame($media->getName(), $media_name);
Chris@0 73
Chris@0 74 // Tests media edit form.
Chris@0 75 $media_type->setNewRevision(FALSE);
Chris@0 76 $media_type->save();
Chris@0 77 $media_name2 = $this->randomMachineName();
Chris@0 78 $this->drupalGet('media/' . $media_id . '/edit');
Chris@0 79 $assert_session->checkboxNotChecked('edit-revision');
Chris@0 80 $media_name = $this->randomMachineName();
Chris@0 81 $page->fillField('name[0][value]', $media_name2);
Chris@0 82 $page->pressButton('Save');
Chris@0 83 /** @var \Drupal\media\MediaInterface $media */
Chris@0 84 $media = $this->container->get('entity_type.manager')
Chris@0 85 ->getStorage('media')
Chris@0 86 ->loadUnchanged($media_id);
Chris@4 87 $this->assertSame($media->getName(), $media_name2);
Chris@0 88
Chris@0 89 // Test that there is no empty vertical tabs element, if the container is
Chris@0 90 // empty (see #2750697).
Chris@0 91 // Make the "Publisher ID" and "Created" fields hidden.
Chris@0 92 $this->drupalGet('/admin/structure/media/manage/' . $media_type->id() . '/form-display');
Chris@0 93 $page->selectFieldOption('fields[created][parent]', 'hidden');
Chris@0 94 $page->selectFieldOption('fields[uid][parent]', 'hidden');
Chris@0 95 $page->pressButton('Save');
Chris@0 96 // Assure we are testing with a user without permission to manage revisions.
Chris@0 97 $this->drupalLogin($this->nonAdminUser);
Chris@0 98 // Check the container is not present.
Chris@0 99 $this->drupalGet('media/' . $media_id . '/edit');
Chris@0 100 $assert_session->elementNotExists('css', 'input.vertical-tabs__active-tab');
Chris@0 101 // Continue testing as admin.
Chris@0 102 $this->drupalLogin($this->adminUser);
Chris@0 103
Chris@0 104 // Enable revisions by default.
Chris@0 105 $previous_revision_id = $media->getRevisionId();
Chris@0 106 $media_type->setNewRevision(TRUE);
Chris@0 107 $media_type->save();
Chris@0 108 $this->drupalGet('media/' . $media_id . '/edit');
Chris@0 109 $assert_session->checkboxChecked('edit-revision');
Chris@0 110 $page->fillField('name[0][value]', $media_name);
Chris@0 111 $page->fillField('revision_log_message[0][value]', $revision_log_message);
Chris@0 112 $page->pressButton('Save');
Chris@4 113 $this->drupalGet('media/' . $media_id);
Chris@5 114 $assert_session->statusCodeEquals(404);
Chris@0 115 /** @var \Drupal\media\MediaInterface $media */
Chris@0 116 $media = $this->container->get('entity_type.manager')
Chris@0 117 ->getStorage('media')
Chris@0 118 ->loadUnchanged($media_id);
Chris@4 119 $this->assertSame($media->getRevisionLogMessage(), $revision_log_message);
Chris@0 120 $this->assertNotEquals($previous_revision_id, $media->getRevisionId());
Chris@0 121
Chris@0 122 // Test the status checkbox.
Chris@0 123 $this->drupalGet('media/' . $media_id . '/edit');
Chris@0 124 $page->uncheckField('status[value]');
Chris@0 125 $page->pressButton('Save');
Chris@0 126 /** @var \Drupal\media\MediaInterface $media */
Chris@0 127 $media = $this->container->get('entity_type.manager')
Chris@0 128 ->getStorage('media')
Chris@0 129 ->loadUnchanged($media_id);
Chris@0 130 $this->assertFalse($media->isPublished());
Chris@0 131
Chris@0 132 // Tests media delete form.
Chris@0 133 $this->drupalGet('media/' . $media_id . '/edit');
Chris@0 134 $page->clickLink('Delete');
Chris@0 135 $assert_session->pageTextContains('This action cannot be undone');
Chris@0 136 $page->pressButton('Delete');
Chris@0 137 $media_id = \Drupal::entityQuery('media')->execute();
Chris@0 138 $this->assertFalse($media_id);
Chris@0 139 }
Chris@0 140
Chris@0 141 /**
Chris@5 142 * Tests the "media/add" page.
Chris@0 143 *
Chris@0 144 * Tests if the "media/add" page gives you a selecting option if there are
Chris@0 145 * multiple media types available.
Chris@0 146 */
Chris@0 147 public function testMediaWithMultipleMediaTypes() {
Chris@0 148 $assert_session = $this->assertSession();
Chris@0 149
Chris@0 150 // Tests and creates the first media type.
Chris@4 151 $first_media_type = $this->createMediaType('test', ['description' => $this->randomMachineName()]);
Chris@0 152
Chris@0 153 // Test and create a second media type.
Chris@4 154 $second_media_type = $this->createMediaType('test', ['description' => $this->randomMachineName()]);
Chris@0 155
Chris@0 156 // Test if media/add displays two media type options.
Chris@0 157 $this->drupalGet('media/add');
Chris@0 158
Chris@0 159 // Checks for the first media type.
Chris@0 160 $assert_session->pageTextContains($first_media_type->label());
Chris@0 161 $assert_session->pageTextContains($first_media_type->getDescription());
Chris@0 162 // Checks for the second media type.
Chris@0 163 $assert_session->pageTextContains($second_media_type->label());
Chris@0 164 $assert_session->pageTextContains($second_media_type->getDescription());
Chris@0 165 }
Chris@0 166
Chris@0 167 /**
Chris@0 168 * Test that media in ER fields use the Rendered Entity formatter by default.
Chris@0 169 */
Chris@0 170 public function testRenderedEntityReferencedMedia() {
Chris@0 171 $page = $this->getSession()->getPage();
Chris@0 172 $assert_session = $this->assertSession();
Chris@0 173
Chris@0 174 $this->drupalCreateContentType(['type' => 'page', 'name' => 'Page']);
Chris@0 175 $this->drupalGet('/admin/structure/types/manage/page/fields/add-field');
Chris@0 176 $page->selectFieldOption('new_storage_type', 'field_ui:entity_reference:media');
Chris@0 177 $page->fillField('label', 'Foo field');
Chris@0 178 $page->fillField('field_name', 'foo_field');
Chris@0 179 $page->pressButton('Save and continue');
Chris@0 180 $this->drupalGet('/admin/structure/types/manage/page/display');
Chris@0 181 $assert_session->fieldValueEquals('fields[field_foo_field][type]', 'entity_reference_entity_view');
Chris@0 182 }
Chris@0 183
Chris@0 184 /**
Chris@0 185 * Data provider for testMediaReferenceWidget().
Chris@0 186 *
Chris@0 187 * @return array[]
Chris@0 188 * Test data. See testMediaReferenceWidget() for the child array structure.
Chris@0 189 */
Chris@0 190 public function providerTestMediaReferenceWidget() {
Chris@0 191 return [
Chris@0 192 // Single-value fields with a single media type and the default widget:
Chris@0 193 // - The user can create and list the media.
Chris@0 194 'single_value:single_type:create_list' => [1, [TRUE], TRUE],
Chris@0 195 // - The user can list but not create the media.
Chris@0 196 'single_value:single_type:list' => [1, [FALSE], TRUE],
Chris@0 197 // - The user can create but not list the media.
Chris@0 198 'single_value:single_type:create' => [1, [TRUE], FALSE],
Chris@0 199 // - The user can neither create nor list the media.
Chris@0 200 'single_value:single_type' => [1, [FALSE], FALSE],
Chris@0 201
Chris@0 202 // Single-value fields with the tags-style widget:
Chris@0 203 // - The user can create and list the media.
Chris@0 204 'single_value:single_type:create_list:tags' => [1, [TRUE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@0 205 // - The user can list but not create the media.
Chris@0 206 'single_value:single_type:list:tags' => [1, [FALSE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@0 207 // - The user can create but not list the media.
Chris@0 208 'single_value:single_type:create:tags' => [1, [TRUE], FALSE, 'entity_reference_autocomplete_tags'],
Chris@0 209 // - The user can neither create nor list the media.
Chris@0 210 'single_value:single_type:tags' => [1, [FALSE], FALSE, 'entity_reference_autocomplete_tags'],
Chris@0 211
Chris@0 212 // Single-value fields with two media types:
Chris@0 213 // - The user can create both types.
Chris@0 214 'single_value:two_type:create2_list' => [1, [TRUE, TRUE], TRUE],
Chris@0 215 // - The user can create only one type.
Chris@0 216 'single_value:two_type:create1_list' => [1, [TRUE, FALSE], TRUE],
Chris@0 217 // - The user cannot create either type.
Chris@0 218 'single_value:two_type:list' => [1, [FALSE, FALSE], TRUE],
Chris@0 219
Chris@0 220 // Multiple-value field with a cardinality of 3, with media the user can
Chris@0 221 // create and list.
Chris@0 222 'multi_value:single_type:create_list' => [3, [TRUE], TRUE],
Chris@0 223 // The same, with the tags field.
Chris@0 224 'multi-value:single_type:create_list:tags' => [3, [TRUE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@0 225
Chris@0 226 // Unlimited value field.
Chris@0 227 'unlimited_value:single_type:create_list' => [FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, [TRUE], TRUE],
Chris@0 228 // Unlimited value field with the tags widget.
Chris@4 229 'unlimited_value:single_type:create_list:tags' => [FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, [TRUE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@0 230 ];
Chris@0 231 }
Chris@0 232
Chris@0 233 /**
Chris@0 234 * Tests the default autocomplete widgets for media reference fields.
Chris@0 235 *
Chris@0 236 * @param int $cardinality
Chris@0 237 * The field cardinality.
Chris@0 238 * @param bool[] $media_type_create_access
Chris@0 239 * An array of booleans indicating whether to grant the test user create
Chris@0 240 * access for each media type. A media type is created automatically for
Chris@0 241 * each; for example, an array [TRUE, FALSE] would create two media types,
Chris@0 242 * one that allows the user to create media and a second that does not.
Chris@0 243 * @param bool $list_access
Chris@0 244 * Whether to grant the test user access to list media.
Chris@0 245 *
Chris@0 246 * @see media_field_widget_entity_reference_autocomplete_form_alter()
Chris@0 247 * @see media_field_widget_multiple_entity_reference_autocomplete_form_alter()
Chris@0 248 *
Chris@0 249 * @dataProvider providerTestMediaReferenceWidget
Chris@0 250 */
Chris@0 251 public function testMediaReferenceWidget($cardinality, array $media_type_create_access, $list_access, $widget_id = 'entity_reference_autocomplete') {
Chris@0 252 $assert_session = $this->assertSession();
Chris@0 253
Chris@0 254 // Create two content types.
Chris@0 255 $non_media_content_type = $this->createContentType();
Chris@0 256 $content_type = $this->createContentType();
Chris@0 257
Chris@0 258 // Create some media types.
Chris@0 259 $media_types = [];
Chris@0 260 $permissions = [];
Chris@0 261 $create_media_types = [];
Chris@0 262 foreach ($media_type_create_access as $id => $access) {
Chris@0 263 if ($access) {
Chris@0 264 $create_media_types[] = "media_type_$id";
Chris@0 265 $permissions[] = "create media_type_$id media";
Chris@0 266 }
Chris@4 267 $this->createMediaType('test', [
Chris@4 268 'id' => "media_type_$id",
Chris@4 269 'label' => "media_type_$id",
Chris@4 270 ]);
Chris@0 271 $media_types["media_type_$id"] = "media_type_$id";
Chris@0 272 }
Chris@0 273
Chris@0 274 // Create a user that can create content of the type, with other
Chris@0 275 // permissions as given by the data provider.
Chris@0 276 $permissions[] = "create {$content_type->id()} content";
Chris@0 277 if ($list_access) {
Chris@0 278 $permissions[] = "access media overview";
Chris@0 279 }
Chris@0 280 $test_user = $this->drupalCreateUser($permissions);
Chris@0 281
Chris@0 282 // Create a non-media entity reference.
Chris@0 283 $non_media_storage = FieldStorageConfig::create([
Chris@0 284 'field_name' => 'field_not_a_media_field',
Chris@0 285 'entity_type' => 'node',
Chris@0 286 'type' => 'entity_reference',
Chris@0 287 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
Chris@0 288 'settings' => [
Chris@0 289 'target_type' => 'node',
Chris@0 290 ],
Chris@0 291 ]);
Chris@0 292 $non_media_storage->save();
Chris@0 293 $non_media_field = FieldConfig::create([
Chris@0 294 'label' => 'No media here!',
Chris@0 295 'field_storage' => $non_media_storage,
Chris@0 296 'entity_type' => 'node',
Chris@0 297 'bundle' => $non_media_content_type->id(),
Chris@0 298 'settings' => [
Chris@0 299 'handler' => 'default',
Chris@0 300 'handler_settings' => [
Chris@0 301 'target_bundles' => [
Chris@0 302 $non_media_content_type->id() => $non_media_content_type->id(),
Chris@0 303 ],
Chris@0 304 ],
Chris@0 305 ],
Chris@0 306 ]);
Chris@0 307 $non_media_field->save();
Chris@0 308 \Drupal::entityTypeManager()
Chris@0 309 ->getStorage('entity_form_display')
Chris@0 310 ->load('node.' . $non_media_content_type->id() . '.default')
Chris@0 311 ->setComponent('field_not_a_media_field', [
Chris@0 312 'type' => $widget_id,
Chris@0 313 ])
Chris@0 314 ->save();
Chris@0 315
Chris@0 316 // Create a media field through the user interface to ensure that the
Chris@0 317 // help text handling does not break the default value entry on the field
Chris@0 318 // settings form.
Chris@0 319 // Using drupalPostForm() to avoid dealing with JavaScript on the previous
Chris@0 320 // page in the field creation.
Chris@0 321 $edit = [
Chris@0 322 'new_storage_type' => 'field_ui:entity_reference:media',
Chris@0 323 'label' => "Media (cardinality $cardinality)",
Chris@0 324 'field_name' => 'media_reference',
Chris@0 325 ];
Chris@0 326 $this->drupalPostForm("admin/structure/types/manage/{$content_type->id()}/fields/add-field", $edit, 'Save and continue');
Chris@0 327 $edit = [];
Chris@0 328 foreach ($media_types as $type) {
Chris@0 329 $edit["settings[handler_settings][target_bundles][$type]"] = TRUE;
Chris@0 330 }
Chris@0 331 $this->drupalPostForm("admin/structure/types/manage/{$content_type->id()}/fields/node.{$content_type->id()}.field_media_reference", $edit, "Save settings");
Chris@0 332 \Drupal::entityTypeManager()
Chris@0 333 ->getStorage('entity_form_display')
Chris@0 334 ->load('node.' . $content_type->id() . '.default')
Chris@0 335 ->setComponent('field_media_reference', [
Chris@0 336 'type' => $widget_id,
Chris@0 337 ])
Chris@0 338 ->save();
Chris@0 339
Chris@0 340 // Some of the expected texts.
Chris@0 341 $create_help = 'Create your media on the media add page (opens a new window), then add it by name to the field below.';
Chris@0 342 $list_text = 'See the media list (opens a new window) to help locate media.';
Chris@0 343 $use_help = 'Type part of the media name.';
Chris@0 344 $create_header = "Create new media";
Chris@0 345 $use_header = "Use existing media";
Chris@0 346
Chris@0 347 // First check that none of the help texts are on the non-media content.
Chris@0 348 $this->drupalGet("/node/add/{$non_media_content_type->id()}");
Chris@0 349 $this->assertNoHelpTexts([
Chris@0 350 $create_header,
Chris@0 351 $create_help,
Chris@0 352 $use_header,
Chris@0 353 $use_help,
Chris@0 354 $list_text,
Chris@0 355 'Allowed media types:',
Chris@0 356 ]);
Chris@0 357
Chris@0 358 // Now, check that the widget displays the expected help text under the
Chris@0 359 // given conditions for the test user.
Chris@0 360 $this->drupalLogin($test_user);
Chris@0 361 $this->drupalGet("/node/add/{$content_type->id()}");
Chris@0 362
Chris@0 363 // Specific expected help texts for the media field.
Chris@0 364 $create_header = "Create new media";
Chris@0 365 $use_header = "Use existing media";
Chris@0 366 $type_list = 'Allowed media types: ' . implode(", ", array_keys($media_types));
Chris@0 367
Chris@0 368 $fieldset_selector = '#edit-field-media-reference-wrapper fieldset';
Chris@0 369 $fieldset = $assert_session->elementExists('css', $fieldset_selector);
Chris@0 370
Chris@0 371 $this->assertSame("Media (cardinality $cardinality)", $assert_session->elementExists('css', 'legend', $fieldset)->getText());
Chris@0 372
Chris@0 373 // Assert text that should be displayed regardless of other access.
Chris@0 374 $this->assertHelpTexts([$use_header, $use_help, $type_list], $fieldset_selector);
Chris@0 375
Chris@0 376 // The entire section for creating new media should only be displayed if
Chris@0 377 // the user can create at least one media of the type.
Chris@0 378 if ($create_media_types) {
Chris@0 379 if (count($create_media_types) === 1) {
Chris@0 380 $url = Url::fromRoute('entity.media.add_form')->setRouteParameter('media_type', $create_media_types[0]);
Chris@0 381 }
Chris@0 382 else {
Chris@0 383 $url = Url::fromRoute('entity.media.add_page');
Chris@0 384 }
Chris@0 385 $this->assertHelpTexts([$create_header, $create_help], $fieldset_selector);
Chris@0 386 $this->assertHelpLink(
Chris@0 387 $fieldset,
Chris@0 388 'media add page',
Chris@0 389 [
Chris@0 390 'target' => '_blank',
Chris@0 391 'href' => $url->toString(),
Chris@0 392 ]
Chris@0 393 );
Chris@0 394 }
Chris@0 395 else {
Chris@0 396 $this->assertNoHelpTexts([$create_header, $create_help]);
Chris@0 397 $this->assertNoHelpLink($fieldset, 'media add page');
Chris@0 398 }
Chris@0 399
Chris@0 400 if ($list_access) {
Chris@0 401 $this->assertHelpTexts([$list_text], $fieldset_selector);
Chris@0 402 $this->assertHelpLink(
Chris@0 403 $fieldset,
Chris@0 404 'media list',
Chris@0 405 [
Chris@0 406 'target' => '_blank',
Chris@0 407 'href' => Url::fromRoute('entity.media.collection')->toString(),
Chris@0 408 ]
Chris@0 409 );
Chris@0 410 }
Chris@0 411 else {
Chris@0 412 $this->assertNoHelpTexts([$list_text]);
Chris@0 413 $this->assertNoHelpLink($fieldset, 'media list');
Chris@0 414 }
Chris@0 415 }
Chris@0 416
Chris@0 417 /**
Chris@4 418 * Tests the redirect URL after creating a media item.
Chris@4 419 */
Chris@4 420 public function testMediaCreateRedirect() {
Chris@4 421 $session = $this->getSession();
Chris@4 422 $page = $session->getPage();
Chris@4 423 $assert_session = $this->assertSession();
Chris@4 424
Chris@4 425 $this->createMediaType('test', [
Chris@4 426 'queue_thumbnail_downloads' => FALSE,
Chris@4 427 ]);
Chris@4 428
Chris@4 429 // Test a redirect to the media canonical URL for a user without the 'access
Chris@4 430 // media overview' permission.
Chris@4 431 $this->drupalLogin($this->drupalCreateUser([
Chris@4 432 'view media',
Chris@4 433 'create media',
Chris@4 434 ]));
Chris@4 435 $this->drupalGet('media/add');
Chris@4 436 $page->fillField('name[0][value]', $this->randomMachineName());
Chris@4 437 $page->fillField('field_media_test[0][value]', $this->randomString());
Chris@4 438 $page->pressButton('Save');
Chris@4 439 $media_id = $this->container->get('entity_type.manager')
Chris@4 440 ->getStorage('media')
Chris@4 441 ->getQuery()
Chris@4 442 ->execute();
Chris@4 443 $media_id = reset($media_id);
Chris@5 444 $assert_session->addressEquals("media/$media_id/edit");
Chris@4 445
Chris@4 446 // Test a redirect to the media overview for a user with the 'access media
Chris@4 447 // overview' permission.
Chris@4 448 $this->drupalLogin($this->drupalCreateUser([
Chris@4 449 'view media',
Chris@4 450 'create media',
Chris@4 451 'access media overview',
Chris@4 452 ]));
Chris@4 453 $this->drupalGet('media/add');
Chris@4 454 $page->fillField('name[0][value]', $this->randomMachineName());
Chris@4 455 $page->fillField('field_media_test[0][value]', $this->randomString());
Chris@4 456 $page->pressButton('Save');
Chris@4 457 $assert_session->addressEquals('admin/content/media');
Chris@4 458 }
Chris@4 459
Chris@4 460 /**
Chris@0 461 * Asserts that the given texts are present exactly once.
Chris@0 462 *
Chris@0 463 * @param string[] $texts
Chris@0 464 * A list of the help texts to check.
Chris@0 465 * @param string $selector
Chris@0 466 * (optional) The selector to search.
Chris@0 467 */
Chris@0 468 public function assertHelpTexts(array $texts, $selector = '') {
Chris@0 469 $assert_session = $this->assertSession();
Chris@0 470 foreach ($texts as $text) {
Chris@0 471 // We only want to escape single quotes, so use str_replace() rather than
Chris@0 472 // addslashes().
Chris@0 473 $text = str_replace("'", "\'", $text);
Chris@0 474 if ($selector) {
Chris@0 475 $assert_session->elementsCount('css', $selector . ":contains('$text')", 1);
Chris@0 476 }
Chris@0 477 else {
Chris@0 478 $assert_session->pageTextContains($text);
Chris@0 479 }
Chris@0 480 }
Chris@0 481 }
Chris@0 482
Chris@0 483 /**
Chris@0 484 * Asserts that none of the given texts are present.
Chris@0 485 *
Chris@0 486 * @param string[] $texts
Chris@0 487 * A list of the help texts to check.
Chris@0 488 */
Chris@0 489 public function assertNoHelpTexts(array $texts) {
Chris@0 490 $assert_session = $this->assertSession();
Chris@0 491 foreach ($texts as $text) {
Chris@0 492 $assert_session->pageTextNotContains($text);
Chris@0 493 }
Chris@0 494 }
Chris@0 495
Chris@0 496 /**
Chris@0 497 * Asserts whether a given link is present.
Chris@0 498 *
Chris@0 499 * @param \Behat\Mink\Element\NodeElement $element
Chris@0 500 * The element to search.
Chris@0 501 * @param string $text
Chris@0 502 * The link text.
Chris@0 503 * @param string[] $attributes
Chris@0 504 * An associative array of any expected attributes, keyed by the
Chris@0 505 * attribute name.
Chris@0 506 */
Chris@0 507 protected function assertHelpLink(NodeElement $element, $text, array $attributes = []) {
Chris@0 508 // Find all the links inside the element.
Chris@0 509 $link = $element->findLink($text);
Chris@0 510
Chris@0 511 $this->assertNotEmpty($link);
Chris@0 512 foreach ($attributes as $attribute => $value) {
Chris@4 513 $this->assertSame($link->getAttribute($attribute), $value);
Chris@0 514 }
Chris@0 515 }
Chris@0 516
Chris@0 517 /**
Chris@0 518 * Asserts that a given link is not present.
Chris@0 519 *
Chris@0 520 * @param \Behat\Mink\Element\NodeElement $element
Chris@0 521 * The element to search.
Chris@0 522 * @param string $text
Chris@0 523 * The link text.
Chris@0 524 */
Chris@0 525 protected function assertNoHelpLink(NodeElement $element, $text) {
Chris@0 526 $assert_session = $this->assertSession();
Chris@0 527 // Assert that the link and its text are not present anywhere on the page.
Chris@0 528 $assert_session->elementNotExists('named', ['link', $text], $element);
Chris@0 529 $assert_session->pageTextNotContains($text);
Chris@0 530 }
Chris@0 531
Chris@0 532 /**
Chris@0 533 * Test the media collection route.
Chris@0 534 */
Chris@0 535 public function testMediaCollectionRoute() {
Chris@0 536 /** @var \Drupal\Core\Entity\EntityStorageInterface $media_storage */
Chris@0 537 $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
Chris@0 538
Chris@0 539 $this->container->get('module_installer')->uninstall(['views']);
Chris@0 540
Chris@0 541 // Create a media type and media item.
Chris@4 542 $media_type = $this->createMediaType('test');
Chris@0 543 $media = $media_storage->create([
Chris@0 544 'bundle' => $media_type->id(),
Chris@0 545 'name' => 'Unnamed',
Chris@0 546 ]);
Chris@0 547 $media->save();
Chris@0 548
Chris@0 549 $this->drupalGet($media->toUrl('collection'));
Chris@0 550
Chris@0 551 $assert_session = $this->assertSession();
Chris@0 552
Chris@0 553 // Media list table exists.
Chris@0 554 $assert_session->elementExists('css', 'th:contains("Media Name")');
Chris@0 555 $assert_session->elementExists('css', 'th:contains("Type")');
Chris@0 556 $assert_session->elementExists('css', 'th:contains("Operations")');
Chris@0 557 // Media item is present.
Chris@0 558 $assert_session->elementExists('css', 'td:contains("Unnamed")');
Chris@0 559 }
Chris@0 560
Chris@0 561 }