You are here

MediaUiFunctionalTest.php in Media entity 8

File

tests/src/Functional/MediaUiFunctionalTest.php
View source
<?php

namespace Drupal\Tests\media_entity\Functional;

use Drupal\media_entity\Entity\Media;

/**
 * Ensures that media UI works correctly.
 *
 * @group media_entity
 */
class MediaUiFunctionalTest extends MediaEntityFunctionalTestBase {

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = [
    'block',
    'media_entity_test_type',
  ];

  /**
   * The test media bundle.
   *
   * @var \Drupal\media_entity\MediaBundleInterface
   */
  protected $testBundle;

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();
    $this
      ->drupalPlaceBlock('local_actions_block');
    $this
      ->drupalPlaceBlock('local_tasks_block');
  }

  /**
   * Tests the media actions (add/edit/delete).
   */
  public function testMediaWithOnlyOneBundle() {
    $session = $this
      ->getSession();
    $page = $session
      ->getPage();
    $assert_session = $this
      ->assertSession();

    /** @var \Drupal\media_entity\MediaBundleInterface $bundle */
    $bundle = $this
      ->drupalCreateMediaBundle();

    // Assert that media item list is empty.
    $this
      ->drupalGet('admin/content/media');
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->pageTextContains('No content available.');
    $this
      ->drupalGet('media/add');
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->addressEquals('media/add/' . $bundle
      ->id());
    $assert_session
      ->checkboxChecked('edit-revision');

    // Tests media item add form.
    $media_name = $this
      ->randomMachineName();
    $page
      ->fillField('name[0][value]', $media_name);
    $revision_log_message = $this
      ->randomString();
    $page
      ->fillField('revision_log', $revision_log_message);
    $page
      ->pressButton('Save and publish');
    $media_id = $this->container
      ->get('entity.query')
      ->get('media')
      ->execute();
    $media_id = reset($media_id);

    /** @var \Drupal\media_entity\MediaInterface $media */
    $media = $this->container
      ->get('entity_type.manager')
      ->getStorage('media')
      ->loadUnchanged($media_id);
    $this
      ->assertEquals($media
      ->getRevisionLogMessage(), $revision_log_message);
    $assert_session
      ->titleEquals($media
      ->label() . ' | Drupal');

    // Test if the media list contains exactly 1 media bundle.
    $this
      ->drupalGet('admin/content/media');
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->pageTextContains($media
      ->label());

    // Tests media edit form.
    $media_name2 = $this
      ->randomMachineName();
    $this
      ->drupalGet('media/' . $media_id . '/edit');
    $assert_session
      ->checkboxNotChecked('edit-revision');
    $media_name = $this
      ->randomMachineName();
    $page
      ->fillField('name[0][value]', $media_name2);
    $page
      ->pressButton('Save and keep published');
    $assert_session
      ->titleEquals($media_name2 . ' | Drupal');

    // Assert that the media list updates after an edit.
    $this
      ->drupalGet('admin/content/media');
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->pageTextContains($media_name2);

    // Test that there is no empty vertical tabs element, if the container is
    // empty (see #2750697).
    // Make the "Publisher ID" and "Created" fields hidden.
    $this
      ->drupalGet('/admin/structure/media/manage/' . $bundle->id . '/form-display');
    $page
      ->selectFieldOption('fields[created][parent]', 'hidden');
    $page
      ->selectFieldOption('fields[uid][parent]', 'hidden');
    $page
      ->pressButton('Save');

    // Assure we are testing with a user without permission to manage revisions.
    $this
      ->drupalLogin($this->nonAdminUser);

    // Check the container is not present.
    $this
      ->drupalGet('media/' . $media_id . '/edit');

    // An empty tab container would look like this.
    $raw_html = '<div data-drupal-selector="edit-advanced" data-vertical-tabs-panes><input class="vertical-tabs__active-tab" data-drupal-selector="edit-advanced-active-tab" type="hidden" name="advanced__active_tab" value="" />' . "\n" . '</div>';
    $assert_session
      ->responseNotContains($raw_html);

    // Continue testing as admin.
    $this
      ->drupalLogin($this->adminUser);

    // Enable revisions by default.
    $bundle
      ->setNewRevision(TRUE);
    $bundle
      ->save();
    $this
      ->drupalGet('media/' . $media_id . '/edit');
    $assert_session
      ->checkboxChecked('edit-revision');
    $page
      ->fillField('name[0][value]', $media_name);
    $page
      ->fillField('revision_log', $revision_log_message);
    $page
      ->pressButton('Save and keep published');
    $assert_session
      ->titleEquals($media_name . ' | Drupal');

    /** @var \Drupal\media_entity\MediaInterface $media */
    $media = $this->container
      ->get('entity_type.manager')
      ->getStorage('media')
      ->loadUnchanged($media_id);
    $this
      ->assertEquals($media
      ->getRevisionLogMessage(), $revision_log_message);

    // Tests media delete form.
    $this
      ->drupalGet('media/' . $media_id . '/edit');
    $page
      ->clickLink('Delete');
    $assert_session
      ->pageTextContains('This action cannot be undone');
    $page
      ->pressButton('Delete');
    $media_id = \Drupal::entityQuery('media')
      ->execute();
    $this
      ->assertFalse($media_id);

    // Assert that the media list is empty after deleting the media item.
    $this
      ->drupalGet('admin/content/media');
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->pageTextNotContains($media_name);
    $assert_session
      ->pageTextContains('No content available.');
  }

  /**
   * Tests the "media/add" and "admin/content/media" pages.
   *
   * Tests if the "media/add" page gives you a selecting option if there are
   * multiple media bundles available.
   */
  public function testMediaWithMultipleBundles() {
    $session = $this
      ->getSession();
    $page = $session
      ->getPage();
    $assert_session = $this
      ->assertSession();

    // Test access to media overview page.
    $this
      ->drupalLogout();
    $this
      ->drupalGet('admin/content/media');
    $assert_session
      ->statusCodeEquals(403);
    $this
      ->drupalLogin($this->adminUser);
    $this
      ->drupalGet('admin/content');

    // Test there is a media tab in the menu.
    $page
      ->clickLink('Media');
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->pageTextContains('No content available.');

    // Tests and creates the first media bundle.
    $first_media_bundle = $this
      ->drupalCreateMediaBundle([
      'description' => $this
        ->randomMachineName(32),
    ]);

    // Test and create a second media bundle.
    $second_media_bundle = $this
      ->drupalCreateMediaBundle([
      'description' => $this
        ->randomMachineName(32),
    ]);

    // Test if media/add displays two media bundle options.
    $this
      ->drupalGet('media/add');

    // Checks for the first media bundle.
    $assert_session
      ->pageTextContains($first_media_bundle
      ->label());
    $assert_session
      ->pageTextContains($first_media_bundle->description);

    // Checks for the second media bundle.
    $assert_session
      ->pageTextContains($second_media_bundle
      ->label());
    $assert_session
      ->pageTextContains($second_media_bundle->description);

    // Continue testing media bundle filter.
    $first_media_item = Media::create([
      'bundle' => $first_media_bundle
        ->id(),
    ]);
    $first_media_item
      ->save();
    $second_media_item = Media::create([
      'bundle' => $second_media_bundle
        ->id(),
    ]);
    $second_media_item
      ->save();

    // Go to media item list.
    $this
      ->drupalGet('admin/content/media');
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->linkExists('Add media');

    // Assert that all available media items are in the list.
    $assert_session
      ->pageTextContains($first_media_item
      ->label());
    $assert_session
      ->pageTextContains($first_media_bundle
      ->label());
    $assert_session
      ->pageTextContains($second_media_item
      ->label());
    $assert_session
      ->pageTextContains($second_media_bundle
      ->label());

    // Filter for each bundle and assert that the list has been updated.
    $this
      ->drupalGet('admin/content/media', [
      'query' => [
        'provider' => $first_media_bundle
          ->id(),
      ],
    ]);
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->pageTextContains($first_media_item
      ->label());
    $assert_session
      ->pageTextNotContains($second_media_item
      ->label());

    // Filter all and check for all items again.
    $this
      ->drupalGet('admin/content/media', [
      'query' => [
        'provider' => 'All',
      ],
    ]);
    $assert_session
      ->statusCodeEquals(200);
    $assert_session
      ->pageTextContains($first_media_item
      ->label());
    $assert_session
      ->pageTextContains($first_media_bundle
      ->label());
    $assert_session
      ->pageTextContains($second_media_item
      ->label());
    $assert_session
      ->pageTextContains($second_media_bundle
      ->label());
  }

}

Classes

Namesort descending Description
MediaUiFunctionalTest Ensures that media UI works correctly.