Updating Media dependent modules to versions compatible with core Media.
[yaffs-website] / web / modules / contrib / media_entity / tests / src / Functional / CoreMediaUpdatePathTest.php
diff --git a/web/modules/contrib/media_entity/tests/src/Functional/CoreMediaUpdatePathTest.php b/web/modules/contrib/media_entity/tests/src/Functional/CoreMediaUpdatePathTest.php
new file mode 100644 (file)
index 0000000..2ab9adf
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+
+namespace Drupal\Tests\media_entity\Functional;
+
+use Drupal\Core\Config\Entity\Query\QueryFactory;
+use Drupal\FunctionalTests\Update\UpdatePathTestBase;
+
+/**
+ * @group media_entity
+ */
+class CoreMediaUpdatePathTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../fixtures/drupal-8.4.0-media-entity.php.gz',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // All this can be removed when #2877383 lands.
+    $this->config('system.action.media_delete_action')->delete();
+    $this->config('system.action.media_publish_action')->delete();
+    $this->config('system.action.media_save_action')->delete();
+    $this->config('system.action.media_unpublish_action')->delete();
+
+    $this->config('views.view.media')
+      ->clear('display.default.display_options.fields.media_bulk_form')
+      ->save();
+  }
+
+  public function testUpdatePath() {
+    $icon_base_uri = $this->config('media_entity.settings')->get('icon_base');
+
+    $this->runUpdates();
+    $assert = $this->assertSession();
+
+    // As with all translatable, versionable content entity types, media
+    // entities should have the revision_translation_affected base field.
+    // This may have been created during the update path by system_update_8402,
+    // so we should check for it here.
+    /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */
+    $field_manager = $this->container->get('entity_field.manager');
+    $this->assertArrayHasKey('revision_translation_affected', $field_manager->getBaseFieldDefinitions('media'));
+    $field_manager->clearCachedFieldDefinitions();
+
+    $this->drupalLogin($this->rootUser);
+    $this->drupalGet('/admin/modules');
+    $assert->checkboxNotChecked('modules[media_entity_document][enable]');
+    $assert->checkboxNotChecked('modules[media_entity_image][enable]');
+    $assert->checkboxNotChecked('modules[media_entity][enable]');
+    $assert->checkboxChecked('modules[media_entity_generic][enable]');
+    // Media is not currently displayed on the Modules page.
+    $this->assertArrayHasKey('media', $this->config('core.extension')->get('module'));
+
+    $this->drupalGet('/admin/structure/media/manage/file');
+    $assert->statusCodeEquals(200);
+    $assert->fieldValueEquals('source', 'file');
+    $assert->pageTextContains('File field is used to store the essential information');
+
+    $this->drupalGet('/admin/structure/media/manage/image');
+    $assert->statusCodeEquals(200);
+    $assert->fieldValueEquals('source', 'image');
+    $assert->pageTextContains('Image field is used to store the essential information');
+
+    $this->drupalGet('/admin/structure/media/manage/generic');
+    $assert->statusCodeEquals(200);
+    $assert->fieldValueEquals('source', 'generic');
+    $assert->pageTextContains('Generic media field is used to store the essential information');
+
+    $this->assertFrontPageMedia('Image 3', 'main img');
+    $this->assertFrontPageMedia('Generic 1', 'main img[src *= "/media-icons/generic/generic.png"]');
+    $this->assertFrontPageMedia('File 2', 'main img[src *= "/media-icons/generic/document.png"]');
+    $this->assertFrontPageMedia('File 3', 'main img[src *= "/media-icons/generic/document.png"]');
+    $this->assertFrontPageMedia('Image 1', 'main img');
+    $this->assertFrontPageMedia('Generic 3', 'main img[src *= "/media-icons/generic/generic.png"]');
+
+    // Assert that Media Entity's config is migrated.
+    $this->assertTrue($this->config('media_entity.settings')->isNew());
+    $this->assertEquals($icon_base_uri, $this->config('media.settings')->get('icon_base_uri'));
+    $this->assertEmpty(
+      $this->container->get('config.factory')->listAll('media_entity.bundle')
+    );
+
+    $this->activateModule();
+    /** @var \Drupal\Core\Entity\EntityStorageInterface $storage */
+    $storage = $this->container
+      ->get('entity_type.manager')
+      ->getStorage('media_type');
+
+    foreach (['file', 'image', 'generic'] as $type) {
+      $config = $this->config("media.type.$type");
+      $this->assertFalse($config->isNew());
+      $this->assertNull($config->get('type'));
+      $this->assertNull($config->get('type_configuration'));
+      $this->assertInternalType('string', $config->get('source'));
+      $this->assertInternalType('array', $config->get('source_configuration'));
+      $this->assertInternalType('string', $config->get('source_configuration.source_field'));
+
+      // Ensure that the media type can be queried by UUID.
+      $uuid = $config->get('uuid');
+      $this->assertNotEmpty($uuid);
+      $result = $storage->getQuery()->condition('uuid', $uuid)->execute();
+      $this->assertEquals($result[$type], $type);
+    }
+
+    // The UUID map for legacy media bundles should be cleared out.
+    $old_uuid_map = $this->container
+      ->get('keyvalue')
+      ->get(QueryFactory::CONFIG_LOOKUP_PREFIX . 'media_bundle')
+      ->getAll();
+    $this->assertEmpty($old_uuid_map);
+  }
+
+  protected function assertFrontPageMedia($link, $assert_selectors) {
+    $this->drupalGet('<front>');
+    $this->clickLink($link);
+
+    $assert = $this->assertSession();
+    foreach ((array) $assert_selectors as $selector) {
+      $assert->elementExists('css', $selector);
+    }
+  }
+
+  /**
+   * Activates the Media module in PHPUnit's memory space.
+   */
+  protected function activateModule() {
+    $this->container
+      ->get('module_handler')
+      ->addModule('media', 'core/modules/media');
+
+    /** @var \ArrayObject $namespaces */
+    $namespaces = $this->container->get('container.namespaces');
+    $namespaces['Drupal\\media'] = 'core/modules/media/src';
+
+    $this->container
+      ->get('entity_type.manager')
+      ->clearCachedDefinitions();
+  }
+
+}