annotate core/modules/media/tests/src/FunctionalJavascript/MediaUiJavascriptTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\media\FunctionalJavascript;
Chris@0 4
Chris@0 5 use Drupal\field\FieldConfigInterface;
Chris@0 6 use Drupal\media\Entity\Media;
Chris@0 7 use Drupal\media\Entity\MediaType;
Chris@0 8 use Drupal\media\MediaSourceInterface;
Chris@0 9
Chris@0 10 /**
Chris@0 11 * Ensures that media UI works correctly.
Chris@0 12 *
Chris@0 13 * @group media
Chris@0 14 */
Chris@0 15 class MediaUiJavascriptTest extends MediaJavascriptTestBase {
Chris@0 16
Chris@0 17 /**
Chris@0 18 * Modules to enable.
Chris@0 19 *
Chris@0 20 * @var array
Chris@0 21 */
Chris@0 22 public static $modules = [
Chris@0 23 'block',
Chris@0 24 'media_test_source',
Chris@0 25 ];
Chris@0 26
Chris@0 27 /**
Chris@0 28 * The test media type.
Chris@0 29 *
Chris@0 30 * @var \Drupal\media\MediaTypeInterface
Chris@0 31 */
Chris@0 32 protected $testMediaType;
Chris@0 33
Chris@0 34 /**
Chris@0 35 * {@inheritdoc}
Chris@0 36 */
Chris@0 37 protected function setUp() {
Chris@0 38 parent::setUp();
Chris@0 39 $this->drupalPlaceBlock('local_actions_block');
Chris@0 40 $this->drupalPlaceBlock('local_tasks_block');
Chris@0 41 }
Chris@0 42
Chris@0 43 /**
Chris@0 44 * Tests a media type administration.
Chris@0 45 */
Chris@0 46 public function testMediaTypes() {
Chris@0 47 $session = $this->getSession();
Chris@0 48 $page = $session->getPage();
Chris@0 49 $assert_session = $this->assertSession();
Chris@0 50
Chris@0 51 $this->drupalGet('admin/structure/media');
Chris@0 52 $assert_session->pageTextContains('No media types available. Add media type.');
Chris@0 53 $assert_session->linkExists('Add media type');
Chris@0 54
Chris@0 55 // Test the creation of a media type using the UI.
Chris@0 56 $name = $this->randomMachineName();
Chris@0 57 $description = $this->randomMachineName();
Chris@0 58 $this->drupalGet('admin/structure/media/add');
Chris@0 59 $page->fillField('label', $name);
Chris@0 60 $machine_name = strtolower($name);
Chris@0 61 $this->assertJsCondition("jQuery('.machine-name-value').html() == '$machine_name'");
Chris@0 62 $page->selectFieldOption('source', 'test');
Chris@0 63 $this->assertJsCondition("jQuery('.form-item-source-configuration-test-config-value').length > 0;");
Chris@0 64 $page->fillField('description', $description);
Chris@0 65 $page->pressButton('Save');
Chris@14 66 // The wait prevents intermittent test failures.
Chris@14 67 $result = $assert_session->waitForLink('Add media type');
Chris@14 68 $this->assertNotEmpty($result);
Chris@14 69 $assert_session->addressEquals('admin/structure/media');
Chris@0 70 $assert_session->pageTextContains('The media type ' . $name . ' has been added.');
Chris@0 71 $this->drupalGet('admin/structure/media');
Chris@0 72 $assert_session->pageTextContains($name);
Chris@0 73 $assert_session->pageTextContains($description);
Chris@0 74
Chris@0 75 // We need to clear the statically cached field definitions to account for
Chris@0 76 // fields that have been created by API calls in this test, since they exist
Chris@0 77 // in a separate memory space from the web server.
Chris@0 78 $this->container->get('entity_field.manager')->clearCachedFieldDefinitions();
Chris@0 79 // Assert that the field and field storage were created.
Chris@0 80 $media_type = MediaType::load($machine_name);
Chris@0 81 $source = $media_type->getSource();
Chris@0 82 /** @var \Drupal\field\FieldConfigInterface $source_field */
Chris@0 83 $source_field = $source->getSourceFieldDefinition($media_type);
Chris@0 84 $this->assertInstanceOf(FieldConfigInterface::class, $source_field, 'Source field exists.');
Chris@0 85 $this->assertFalse($source_field->isNew(), 'Source field was saved.');
Chris@0 86 /** @var \Drupal\field\FieldStorageConfigInterface $storage */
Chris@0 87 $storage = $source_field->getFieldStorageDefinition();
Chris@0 88 $this->assertFalse($storage->isNew(), 'Source field storage definition was saved.');
Chris@0 89 $this->assertFalse($storage->isLocked(), 'Source field storage definition was not locked.');
Chris@0 90
Chris@0 91 /** @var \Drupal\media\MediaTypeInterface $media_type_storage */
Chris@0 92 $media_type_storage = $this->container->get('entity_type.manager')->getStorage('media_type');
Chris@0 93 $this->testMediaType = $media_type_storage->load(strtolower($name));
Chris@0 94
Chris@0 95 // Check if all action links exist.
Chris@0 96 $assert_session->linkByHrefExists('admin/structure/media/add');
Chris@0 97 $assert_session->linkByHrefExists('admin/structure/media/manage/' . $this->testMediaType->id());
Chris@0 98 $assert_session->linkByHrefExists('admin/structure/media/manage/' . $this->testMediaType->id() . '/fields');
Chris@0 99 $assert_session->linkByHrefExists('admin/structure/media/manage/' . $this->testMediaType->id() . '/form-display');
Chris@0 100 $assert_session->linkByHrefExists('admin/structure/media/manage/' . $this->testMediaType->id() . '/display');
Chris@0 101
Chris@0 102 // Assert that fields have expected values before editing.
Chris@0 103 $page->clickLink('Edit');
Chris@0 104 $assert_session->fieldValueEquals('label', $name);
Chris@0 105 $assert_session->fieldValueEquals('description', $description);
Chris@0 106 $assert_session->fieldValueEquals('source', 'test');
Chris@0 107 $assert_session->fieldValueEquals('label', $name);
Chris@0 108 $assert_session->checkboxNotChecked('edit-options-new-revision');
Chris@0 109 $assert_session->checkboxChecked('edit-options-status');
Chris@0 110 $assert_session->checkboxNotChecked('edit-options-queue-thumbnail-downloads');
Chris@0 111 $assert_session->pageTextContains('Create new revision');
Chris@0 112 $assert_session->pageTextContains('Automatically create new revisions. Users with the "Administer media" permission will be able to override this option.');
Chris@0 113 $assert_session->pageTextContains('Download thumbnails via a queue.');
Chris@0 114 $assert_session->pageTextContains('Media will be automatically published when created.');
Chris@0 115 $assert_session->pageTextContains('Media sources can provide metadata fields such as title, caption, size information, credits, etc. Media can automatically save this metadata information to entity fields, which can be configured below. Information will only be mapped if the entity field is empty.');
Chris@0 116
Chris@0 117 // Try to change media type and check if new configuration sub-form appears.
Chris@0 118 $page->selectFieldOption('source', 'test');
Chris@0 119 $result = $assert_session->waitForElementVisible('css', 'fieldset[data-drupal-selector="edit-source-configuration"]');
Chris@0 120 $this->assertNotEmpty($result);
Chris@0 121 $assert_session->fieldExists('Test config value');
Chris@0 122 $assert_session->fieldValueEquals('Test config value', 'This is default value.');
Chris@0 123 $assert_session->fieldExists('Attribute 1');
Chris@0 124 $assert_session->fieldExists('Attribute 2');
Chris@0 125
Chris@0 126 // Test if the edit machine name is not editable.
Chris@0 127 $assert_session->fieldDisabled('Machine-readable name');
Chris@0 128
Chris@0 129 // Edit and save media type form fields with new values.
Chris@0 130 $new_name = $this->randomMachineName();
Chris@0 131 $new_description = $this->randomMachineName();
Chris@0 132 $page->fillField('label', $new_name);
Chris@0 133 $page->fillField('description', $new_description);
Chris@0 134 $page->selectFieldOption('source', 'test');
Chris@0 135 $page->fillField('Test config value', 'This is new config value.');
Chris@0 136 $page->selectFieldOption('field_map[attribute_1]', 'name');
Chris@0 137 $page->checkField('options[new_revision]');
Chris@0 138 $page->uncheckField('options[status]');
Chris@0 139 $page->checkField('options[queue_thumbnail_downloads]');
Chris@0 140 $page->pressButton('Save');
Chris@14 141 // The wait prevents intermittent test failures.
Chris@14 142 $result = $assert_session->waitForLink('Add media type');
Chris@14 143 $this->assertNotEmpty($result);
Chris@14 144 $assert_session->addressEquals('admin/structure/media');
Chris@0 145 $assert_session->pageTextContains("The media type $new_name has been updated.");
Chris@0 146
Chris@0 147 // Test if edit worked and if new field values have been saved as expected.
Chris@0 148 $this->drupalGet('admin/structure/media/manage/' . $this->testMediaType->id());
Chris@0 149 $assert_session->fieldValueEquals('label', $new_name);
Chris@0 150 $assert_session->fieldValueEquals('description', $new_description);
Chris@0 151 $assert_session->fieldValueEquals('source', 'test');
Chris@0 152 $assert_session->checkboxChecked('options[new_revision]');
Chris@0 153 $assert_session->checkboxNotChecked('options[status]');
Chris@0 154 $assert_session->checkboxChecked('options[queue_thumbnail_downloads]');
Chris@0 155 $assert_session->fieldValueEquals('Test config value', 'This is new config value.');
Chris@0 156 $assert_session->fieldValueEquals('Attribute 1', 'name');
Chris@0 157 $assert_session->fieldValueEquals('Attribute 2', MediaSourceInterface::METADATA_FIELD_EMPTY);
Chris@0 158
Chris@0 159 /** @var \Drupal\media\MediaTypeInterface $loaded_media_type */
Chris@0 160 $loaded_media_type = $this->container->get('entity_type.manager')
Chris@0 161 ->getStorage('media_type')
Chris@0 162 ->load($this->testMediaType->id());
Chris@17 163 $this->assertSame($loaded_media_type->id(), $this->testMediaType->id());
Chris@17 164 $this->assertSame($loaded_media_type->label(), $new_name);
Chris@17 165 $this->assertSame($loaded_media_type->getDescription(), $new_description);
Chris@17 166 $this->assertSame($loaded_media_type->getSource()->getPluginId(), 'test');
Chris@17 167 $this->assertSame($loaded_media_type->getSource()->getConfiguration()['test_config_value'], 'This is new config value.');
Chris@0 168 $this->assertTrue($loaded_media_type->shouldCreateNewRevision());
Chris@0 169 $this->assertTrue($loaded_media_type->thumbnailDownloadsAreQueued());
Chris@0 170 $this->assertFalse($loaded_media_type->getStatus());
Chris@17 171 $this->assertSame($loaded_media_type->getFieldMap(), ['attribute_1' => 'name']);
Chris@0 172
Chris@0 173 // We need to clear the statically cached field definitions to account for
Chris@0 174 // fields that have been created by API calls in this test, since they exist
Chris@0 175 // in a separate memory space from the web server.
Chris@0 176 $this->container->get('entity_field.manager')->clearCachedFieldDefinitions();
Chris@0 177
Chris@0 178 // Test that a media item being created with default status to "FALSE",
Chris@0 179 // will be created unpublished.
Chris@0 180 /** @var \Drupal\media\MediaInterface $unpublished_media */
Chris@0 181 $unpublished_media = Media::create(['name' => 'unpublished test media', 'bundle' => $loaded_media_type->id()]);
Chris@0 182 $this->assertFalse($unpublished_media->isPublished());
Chris@0 183 $unpublished_media->delete();
Chris@0 184
Chris@0 185 // Tests media type delete form.
Chris@0 186 $page->clickLink('Delete');
Chris@0 187 $assert_session->addressEquals('admin/structure/media/manage/' . $this->testMediaType->id() . '/delete');
Chris@0 188 $page->pressButton('Delete');
Chris@0 189 $assert_session->addressEquals('admin/structure/media');
Chris@0 190 $assert_session->pageTextContains('The media type ' . $new_name . ' has been deleted.');
Chris@0 191
Chris@0 192 // Test that the system for preventing the deletion of media types works
Chris@0 193 // (they cannot be deleted if there is media content of that type/bundle).
Chris@17 194 $media_type2 = $this->createMediaType('test');
Chris@0 195 $label2 = $media_type2->label();
Chris@0 196 $media = Media::create(['name' => 'lorem ipsum', 'bundle' => $media_type2->id()]);
Chris@0 197 $media->save();
Chris@0 198 $this->drupalGet('admin/structure/media/manage/' . $media_type2->id());
Chris@0 199 $page->clickLink('Delete');
Chris@0 200 $assert_session->addressEquals('admin/structure/media/manage/' . $media_type2->id() . '/delete');
Chris@0 201 $assert_session->buttonNotExists('edit-submit');
Chris@0 202 $assert_session->pageTextContains("$label2 is used by 1 media item on your site. You can not remove this media type until you have removed all of the $label2 media items.");
Chris@0 203 }
Chris@0 204
Chris@0 205 }