annotate core/modules/media/tests/src/Functional/MediaUiFunctionalTest.php @ 4:a9cd425dd02b

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