annotate core/modules/media/tests/src/Functional/MediaUiFunctionalTest.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\media\Functional;
Chris@0 4
Chris@14 5 use Behat\Mink\Element\NodeElement;
Chris@14 6 use Drupal\Core\Field\FieldStorageDefinitionInterface;
Chris@14 7 use Drupal\Core\Url;
Chris@14 8 use Drupal\field\Entity\FieldConfig;
Chris@14 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@17 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@14 59 $source_field = $this->randomString();
Chris@14 60 $page->fillField('field_media_test[0][value]', $source_field);
Chris@0 61 $page->pressButton('Save');
Chris@17 62 $media_id = $this->container->get('entity_type.manager')
Chris@17 63 ->getStorage('media')
Chris@17 64 ->getQuery()
Chris@17 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@17 71 $this->assertSame($media->getRevisionLogMessage(), $revision_log_message);
Chris@17 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@17 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@17 113 $this->drupalGet('media/' . $media_id);
Chris@18 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@17 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@18 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@17 151 $first_media_type = $this->createMediaType('test', ['description' => $this->randomMachineName()]);
Chris@0 152
Chris@0 153 // Test and create a second media type.
Chris@17 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@14 167 /**
Chris@14 168 * Test that media in ER fields use the Rendered Entity formatter by default.
Chris@14 169 */
Chris@14 170 public function testRenderedEntityReferencedMedia() {
Chris@14 171 $page = $this->getSession()->getPage();
Chris@14 172 $assert_session = $this->assertSession();
Chris@14 173
Chris@14 174 $this->drupalCreateContentType(['type' => 'page', 'name' => 'Page']);
Chris@14 175 $this->drupalGet('/admin/structure/types/manage/page/fields/add-field');
Chris@14 176 $page->selectFieldOption('new_storage_type', 'field_ui:entity_reference:media');
Chris@14 177 $page->fillField('label', 'Foo field');
Chris@14 178 $page->fillField('field_name', 'foo_field');
Chris@14 179 $page->pressButton('Save and continue');
Chris@14 180 $this->drupalGet('/admin/structure/types/manage/page/display');
Chris@14 181 $assert_session->fieldValueEquals('fields[field_foo_field][type]', 'entity_reference_entity_view');
Chris@14 182 }
Chris@14 183
Chris@14 184 /**
Chris@14 185 * Data provider for testMediaReferenceWidget().
Chris@14 186 *
Chris@14 187 * @return array[]
Chris@14 188 * Test data. See testMediaReferenceWidget() for the child array structure.
Chris@14 189 */
Chris@14 190 public function providerTestMediaReferenceWidget() {
Chris@14 191 return [
Chris@14 192 // Single-value fields with a single media type and the default widget:
Chris@14 193 // - The user can create and list the media.
Chris@14 194 'single_value:single_type:create_list' => [1, [TRUE], TRUE],
Chris@14 195 // - The user can list but not create the media.
Chris@14 196 'single_value:single_type:list' => [1, [FALSE], TRUE],
Chris@14 197 // - The user can create but not list the media.
Chris@14 198 'single_value:single_type:create' => [1, [TRUE], FALSE],
Chris@14 199 // - The user can neither create nor list the media.
Chris@14 200 'single_value:single_type' => [1, [FALSE], FALSE],
Chris@14 201
Chris@14 202 // Single-value fields with the tags-style widget:
Chris@14 203 // - The user can create and list the media.
Chris@14 204 'single_value:single_type:create_list:tags' => [1, [TRUE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@14 205 // - The user can list but not create the media.
Chris@14 206 'single_value:single_type:list:tags' => [1, [FALSE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@14 207 // - The user can create but not list the media.
Chris@14 208 'single_value:single_type:create:tags' => [1, [TRUE], FALSE, 'entity_reference_autocomplete_tags'],
Chris@14 209 // - The user can neither create nor list the media.
Chris@14 210 'single_value:single_type:tags' => [1, [FALSE], FALSE, 'entity_reference_autocomplete_tags'],
Chris@14 211
Chris@14 212 // Single-value fields with two media types:
Chris@14 213 // - The user can create both types.
Chris@14 214 'single_value:two_type:create2_list' => [1, [TRUE, TRUE], TRUE],
Chris@14 215 // - The user can create only one type.
Chris@14 216 'single_value:two_type:create1_list' => [1, [TRUE, FALSE], TRUE],
Chris@14 217 // - The user cannot create either type.
Chris@14 218 'single_value:two_type:list' => [1, [FALSE, FALSE], TRUE],
Chris@14 219
Chris@14 220 // Multiple-value field with a cardinality of 3, with media the user can
Chris@14 221 // create and list.
Chris@14 222 'multi_value:single_type:create_list' => [3, [TRUE], TRUE],
Chris@14 223 // The same, with the tags field.
Chris@14 224 'multi-value:single_type:create_list:tags' => [3, [TRUE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@14 225
Chris@14 226 // Unlimited value field.
Chris@14 227 'unlimited_value:single_type:create_list' => [FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, [TRUE], TRUE],
Chris@14 228 // Unlimited value field with the tags widget.
Chris@17 229 'unlimited_value:single_type:create_list:tags' => [FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, [TRUE], TRUE, 'entity_reference_autocomplete_tags'],
Chris@14 230 ];
Chris@14 231 }
Chris@14 232
Chris@14 233 /**
Chris@14 234 * Tests the default autocomplete widgets for media reference fields.
Chris@14 235 *
Chris@14 236 * @param int $cardinality
Chris@14 237 * The field cardinality.
Chris@14 238 * @param bool[] $media_type_create_access
Chris@14 239 * An array of booleans indicating whether to grant the test user create
Chris@14 240 * access for each media type. A media type is created automatically for
Chris@14 241 * each; for example, an array [TRUE, FALSE] would create two media types,
Chris@14 242 * one that allows the user to create media and a second that does not.
Chris@14 243 * @param bool $list_access
Chris@14 244 * Whether to grant the test user access to list media.
Chris@14 245 *
Chris@14 246 * @see media_field_widget_entity_reference_autocomplete_form_alter()
Chris@14 247 * @see media_field_widget_multiple_entity_reference_autocomplete_form_alter()
Chris@14 248 *
Chris@14 249 * @dataProvider providerTestMediaReferenceWidget
Chris@14 250 */
Chris@14 251 public function testMediaReferenceWidget($cardinality, array $media_type_create_access, $list_access, $widget_id = 'entity_reference_autocomplete') {
Chris@14 252 $assert_session = $this->assertSession();
Chris@14 253
Chris@14 254 // Create two content types.
Chris@14 255 $non_media_content_type = $this->createContentType();
Chris@14 256 $content_type = $this->createContentType();
Chris@14 257
Chris@14 258 // Create some media types.
Chris@14 259 $media_types = [];
Chris@14 260 $permissions = [];
Chris@14 261 $create_media_types = [];
Chris@14 262 foreach ($media_type_create_access as $id => $access) {
Chris@14 263 if ($access) {
Chris@14 264 $create_media_types[] = "media_type_$id";
Chris@14 265 $permissions[] = "create media_type_$id media";
Chris@14 266 }
Chris@17 267 $this->createMediaType('test', [
Chris@17 268 'id' => "media_type_$id",
Chris@17 269 'label' => "media_type_$id",
Chris@17 270 ]);
Chris@14 271 $media_types["media_type_$id"] = "media_type_$id";
Chris@14 272 }
Chris@14 273
Chris@14 274 // Create a user that can create content of the type, with other
Chris@14 275 // permissions as given by the data provider.
Chris@14 276 $permissions[] = "create {$content_type->id()} content";
Chris@14 277 if ($list_access) {
Chris@14 278 $permissions[] = "access media overview";
Chris@14 279 }
Chris@14 280 $test_user = $this->drupalCreateUser($permissions);
Chris@14 281
Chris@14 282 // Create a non-media entity reference.
Chris@14 283 $non_media_storage = FieldStorageConfig::create([
Chris@14 284 'field_name' => 'field_not_a_media_field',
Chris@14 285 'entity_type' => 'node',
Chris@14 286 'type' => 'entity_reference',
Chris@14 287 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
Chris@14 288 'settings' => [
Chris@14 289 'target_type' => 'node',
Chris@14 290 ],
Chris@14 291 ]);
Chris@14 292 $non_media_storage->save();
Chris@14 293 $non_media_field = FieldConfig::create([
Chris@14 294 'label' => 'No media here!',
Chris@14 295 'field_storage' => $non_media_storage,
Chris@14 296 'entity_type' => 'node',
Chris@14 297 'bundle' => $non_media_content_type->id(),
Chris@14 298 'settings' => [
Chris@14 299 'handler' => 'default',
Chris@14 300 'handler_settings' => [
Chris@14 301 'target_bundles' => [
Chris@14 302 $non_media_content_type->id() => $non_media_content_type->id(),
Chris@14 303 ],
Chris@14 304 ],
Chris@14 305 ],
Chris@14 306 ]);
Chris@14 307 $non_media_field->save();
Chris@14 308 \Drupal::entityTypeManager()
Chris@14 309 ->getStorage('entity_form_display')
Chris@14 310 ->load('node.' . $non_media_content_type->id() . '.default')
Chris@14 311 ->setComponent('field_not_a_media_field', [
Chris@14 312 'type' => $widget_id,
Chris@14 313 ])
Chris@14 314 ->save();
Chris@14 315
Chris@14 316 // Create a media field through the user interface to ensure that the
Chris@14 317 // help text handling does not break the default value entry on the field
Chris@14 318 // settings form.
Chris@14 319 // Using drupalPostForm() to avoid dealing with JavaScript on the previous
Chris@14 320 // page in the field creation.
Chris@14 321 $edit = [
Chris@14 322 'new_storage_type' => 'field_ui:entity_reference:media',
Chris@14 323 'label' => "Media (cardinality $cardinality)",
Chris@14 324 'field_name' => 'media_reference',
Chris@14 325 ];
Chris@14 326 $this->drupalPostForm("admin/structure/types/manage/{$content_type->id()}/fields/add-field", $edit, 'Save and continue');
Chris@14 327 $edit = [];
Chris@14 328 foreach ($media_types as $type) {
Chris@14 329 $edit["settings[handler_settings][target_bundles][$type]"] = TRUE;
Chris@14 330 }
Chris@14 331 $this->drupalPostForm("admin/structure/types/manage/{$content_type->id()}/fields/node.{$content_type->id()}.field_media_reference", $edit, "Save settings");
Chris@14 332 \Drupal::entityTypeManager()
Chris@14 333 ->getStorage('entity_form_display')
Chris@14 334 ->load('node.' . $content_type->id() . '.default')
Chris@14 335 ->setComponent('field_media_reference', [
Chris@14 336 'type' => $widget_id,
Chris@14 337 ])
Chris@14 338 ->save();
Chris@14 339
Chris@14 340 // Some of the expected texts.
Chris@14 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@14 342 $list_text = 'See the media list (opens a new window) to help locate media.';
Chris@14 343 $use_help = 'Type part of the media name.';
Chris@14 344 $create_header = "Create new media";
Chris@14 345 $use_header = "Use existing media";
Chris@14 346
Chris@14 347 // First check that none of the help texts are on the non-media content.
Chris@14 348 $this->drupalGet("/node/add/{$non_media_content_type->id()}");
Chris@14 349 $this->assertNoHelpTexts([
Chris@14 350 $create_header,
Chris@14 351 $create_help,
Chris@14 352 $use_header,
Chris@14 353 $use_help,
Chris@14 354 $list_text,
Chris@14 355 'Allowed media types:',
Chris@14 356 ]);
Chris@14 357
Chris@14 358 // Now, check that the widget displays the expected help text under the
Chris@14 359 // given conditions for the test user.
Chris@14 360 $this->drupalLogin($test_user);
Chris@14 361 $this->drupalGet("/node/add/{$content_type->id()}");
Chris@14 362
Chris@14 363 // Specific expected help texts for the media field.
Chris@14 364 $create_header = "Create new media";
Chris@14 365 $use_header = "Use existing media";
Chris@14 366 $type_list = 'Allowed media types: ' . implode(", ", array_keys($media_types));
Chris@14 367
Chris@14 368 $fieldset_selector = '#edit-field-media-reference-wrapper fieldset';
Chris@14 369 $fieldset = $assert_session->elementExists('css', $fieldset_selector);
Chris@14 370
Chris@14 371 $this->assertSame("Media (cardinality $cardinality)", $assert_session->elementExists('css', 'legend', $fieldset)->getText());
Chris@14 372
Chris@14 373 // Assert text that should be displayed regardless of other access.
Chris@14 374 $this->assertHelpTexts([$use_header, $use_help, $type_list], $fieldset_selector);
Chris@14 375
Chris@14 376 // The entire section for creating new media should only be displayed if
Chris@14 377 // the user can create at least one media of the type.
Chris@14 378 if ($create_media_types) {
Chris@14 379 if (count($create_media_types) === 1) {
Chris@14 380 $url = Url::fromRoute('entity.media.add_form')->setRouteParameter('media_type', $create_media_types[0]);
Chris@14 381 }
Chris@14 382 else {
Chris@14 383 $url = Url::fromRoute('entity.media.add_page');
Chris@14 384 }
Chris@14 385 $this->assertHelpTexts([$create_header, $create_help], $fieldset_selector);
Chris@14 386 $this->assertHelpLink(
Chris@14 387 $fieldset,
Chris@14 388 'media add page',
Chris@14 389 [
Chris@14 390 'target' => '_blank',
Chris@14 391 'href' => $url->toString(),
Chris@14 392 ]
Chris@14 393 );
Chris@14 394 }
Chris@14 395 else {
Chris@14 396 $this->assertNoHelpTexts([$create_header, $create_help]);
Chris@14 397 $this->assertNoHelpLink($fieldset, 'media add page');
Chris@14 398 }
Chris@14 399
Chris@14 400 if ($list_access) {
Chris@14 401 $this->assertHelpTexts([$list_text], $fieldset_selector);
Chris@14 402 $this->assertHelpLink(
Chris@14 403 $fieldset,
Chris@14 404 'media list',
Chris@14 405 [
Chris@14 406 'target' => '_blank',
Chris@14 407 'href' => Url::fromRoute('entity.media.collection')->toString(),
Chris@14 408 ]
Chris@14 409 );
Chris@14 410 }
Chris@14 411 else {
Chris@14 412 $this->assertNoHelpTexts([$list_text]);
Chris@14 413 $this->assertNoHelpLink($fieldset, 'media list');
Chris@14 414 }
Chris@14 415 }
Chris@14 416
Chris@14 417 /**
Chris@17 418 * Tests the redirect URL after creating a media item.
Chris@17 419 */
Chris@17 420 public function testMediaCreateRedirect() {
Chris@17 421 $session = $this->getSession();
Chris@17 422 $page = $session->getPage();
Chris@17 423 $assert_session = $this->assertSession();
Chris@17 424
Chris@17 425 $this->createMediaType('test', [
Chris@17 426 'queue_thumbnail_downloads' => FALSE,
Chris@17 427 ]);
Chris@17 428
Chris@17 429 // Test a redirect to the media canonical URL for a user without the 'access
Chris@17 430 // media overview' permission.
Chris@17 431 $this->drupalLogin($this->drupalCreateUser([
Chris@17 432 'view media',
Chris@17 433 'create media',
Chris@17 434 ]));
Chris@17 435 $this->drupalGet('media/add');
Chris@17 436 $page->fillField('name[0][value]', $this->randomMachineName());
Chris@17 437 $page->fillField('field_media_test[0][value]', $this->randomString());
Chris@17 438 $page->pressButton('Save');
Chris@17 439 $media_id = $this->container->get('entity_type.manager')
Chris@17 440 ->getStorage('media')
Chris@17 441 ->getQuery()
Chris@17 442 ->execute();
Chris@17 443 $media_id = reset($media_id);
Chris@18 444 $assert_session->addressEquals("media/$media_id/edit");
Chris@17 445
Chris@17 446 // Test a redirect to the media overview for a user with the 'access media
Chris@17 447 // overview' permission.
Chris@17 448 $this->drupalLogin($this->drupalCreateUser([
Chris@17 449 'view media',
Chris@17 450 'create media',
Chris@17 451 'access media overview',
Chris@17 452 ]));
Chris@17 453 $this->drupalGet('media/add');
Chris@17 454 $page->fillField('name[0][value]', $this->randomMachineName());
Chris@17 455 $page->fillField('field_media_test[0][value]', $this->randomString());
Chris@17 456 $page->pressButton('Save');
Chris@17 457 $assert_session->addressEquals('admin/content/media');
Chris@17 458 }
Chris@17 459
Chris@17 460 /**
Chris@14 461 * Asserts that the given texts are present exactly once.
Chris@14 462 *
Chris@14 463 * @param string[] $texts
Chris@14 464 * A list of the help texts to check.
Chris@14 465 * @param string $selector
Chris@14 466 * (optional) The selector to search.
Chris@14 467 */
Chris@14 468 public function assertHelpTexts(array $texts, $selector = '') {
Chris@14 469 $assert_session = $this->assertSession();
Chris@14 470 foreach ($texts as $text) {
Chris@14 471 // We only want to escape single quotes, so use str_replace() rather than
Chris@14 472 // addslashes().
Chris@14 473 $text = str_replace("'", "\'", $text);
Chris@14 474 if ($selector) {
Chris@14 475 $assert_session->elementsCount('css', $selector . ":contains('$text')", 1);
Chris@14 476 }
Chris@14 477 else {
Chris@14 478 $assert_session->pageTextContains($text);
Chris@14 479 }
Chris@14 480 }
Chris@14 481 }
Chris@14 482
Chris@14 483 /**
Chris@14 484 * Asserts that none of the given texts are present.
Chris@14 485 *
Chris@14 486 * @param string[] $texts
Chris@14 487 * A list of the help texts to check.
Chris@14 488 */
Chris@14 489 public function assertNoHelpTexts(array $texts) {
Chris@14 490 $assert_session = $this->assertSession();
Chris@14 491 foreach ($texts as $text) {
Chris@14 492 $assert_session->pageTextNotContains($text);
Chris@14 493 }
Chris@14 494 }
Chris@14 495
Chris@14 496 /**
Chris@14 497 * Asserts whether a given link is present.
Chris@14 498 *
Chris@14 499 * @param \Behat\Mink\Element\NodeElement $element
Chris@14 500 * The element to search.
Chris@14 501 * @param string $text
Chris@14 502 * The link text.
Chris@14 503 * @param string[] $attributes
Chris@14 504 * An associative array of any expected attributes, keyed by the
Chris@14 505 * attribute name.
Chris@14 506 */
Chris@14 507 protected function assertHelpLink(NodeElement $element, $text, array $attributes = []) {
Chris@14 508 // Find all the links inside the element.
Chris@14 509 $link = $element->findLink($text);
Chris@14 510
Chris@14 511 $this->assertNotEmpty($link);
Chris@14 512 foreach ($attributes as $attribute => $value) {
Chris@17 513 $this->assertSame($link->getAttribute($attribute), $value);
Chris@14 514 }
Chris@14 515 }
Chris@14 516
Chris@14 517 /**
Chris@14 518 * Asserts that a given link is not present.
Chris@14 519 *
Chris@14 520 * @param \Behat\Mink\Element\NodeElement $element
Chris@14 521 * The element to search.
Chris@14 522 * @param string $text
Chris@14 523 * The link text.
Chris@14 524 */
Chris@14 525 protected function assertNoHelpLink(NodeElement $element, $text) {
Chris@14 526 $assert_session = $this->assertSession();
Chris@14 527 // Assert that the link and its text are not present anywhere on the page.
Chris@14 528 $assert_session->elementNotExists('named', ['link', $text], $element);
Chris@14 529 $assert_session->pageTextNotContains($text);
Chris@14 530 }
Chris@14 531
Chris@14 532 /**
Chris@14 533 * Test the media collection route.
Chris@14 534 */
Chris@14 535 public function testMediaCollectionRoute() {
Chris@14 536 /** @var \Drupal\Core\Entity\EntityStorageInterface $media_storage */
Chris@14 537 $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
Chris@14 538
Chris@14 539 $this->container->get('module_installer')->uninstall(['views']);
Chris@14 540
Chris@14 541 // Create a media type and media item.
Chris@17 542 $media_type = $this->createMediaType('test');
Chris@14 543 $media = $media_storage->create([
Chris@14 544 'bundle' => $media_type->id(),
Chris@14 545 'name' => 'Unnamed',
Chris@14 546 ]);
Chris@14 547 $media->save();
Chris@14 548
Chris@14 549 $this->drupalGet($media->toUrl('collection'));
Chris@14 550
Chris@14 551 $assert_session = $this->assertSession();
Chris@14 552
Chris@14 553 // Media list table exists.
Chris@14 554 $assert_session->elementExists('css', 'th:contains("Media Name")');
Chris@14 555 $assert_session->elementExists('css', 'th:contains("Type")');
Chris@14 556 $assert_session->elementExists('css', 'th:contains("Operations")');
Chris@14 557 // Media item is present.
Chris@14 558 $assert_session->elementExists('css', 'td:contains("Unnamed")');
Chris@14 559 }
Chris@14 560
Chris@0 561 }