diff --git a/core/modules/media/tests/src/FunctionalJavascript/MediaInlineFileWidgetTest.php b/core/modules/media/tests/src/FunctionalJavascript/MediaInlineFileWidgetTest.php index 22fdc2e..1e448e2 100644 --- a/core/modules/media/tests/src/FunctionalJavascript/MediaInlineFileWidgetTest.php +++ b/core/modules/media/tests/src/FunctionalJavascript/MediaInlineFileWidgetTest.php @@ -4,7 +4,6 @@ use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; -use Drupal\media\MediaInterface; /** * @group media @@ -147,7 +146,7 @@ protected function setUp() { } /** - * Tests the file widget behavior.. + * Tests the file widget behavior. */ public function testInlineFileWidget() { $assert_session = $this->assertSession(); @@ -173,12 +172,11 @@ public function testInlineFileWidget() { $assert_session->elementNotExists('css', '.field--name-field-media-nonrequired input', $media_field); // By now the media entity should already exist, check that. - $media_id = $this->container->get('entity.query')->get('media') - ->sort('mid', 'DESC') - ->execute(); - $media_id = reset($media_id); - /** @var MediaInterface $media */ - $media = $this->container->get('entity_type.manager')->getStorage('media')->loadUnchanged($media_id); + $filename1 = basename($this->testFilePaths[0]); + $media = $this->container->get('entity_type.manager')->getStorage('media') + ->loadByProperties(['name' => $filename1]); + $media = reset($media); + /** @var \Drupal\media\MediaInterface $media */ $this->assertTrue($media->isPublished()); // Save the node and check page elements correspond to what is expected. @@ -197,6 +195,59 @@ public function testInlineFileWidget() { $required_element = $assert_session->elementExists('css', '.field--name-field-media-required', $media_field); // The required field text is what we expect. $this->assertEquals($required_text, $required_element->getText()); + + // Edit the node, add a second file, check the widget supports multiple + // values and creates a second media without messing up. + $node = $this->container->get('entity_type.manager')->getStorage('node') + ->loadByProperties(['title' => $node_title]); + $node = reset($node); + $this->drupalGet("/node/{$node->id()}/edit"); + // First file is still there, and remove button is present. + $assert_session->elementContains('css', '#edit-field-media-reference-table', $filename1); + $media_field = $assert_session->elementExists('css', 'details[data-drupal-selector="edit-field-media-reference"]'); + $remove_button = $media_field->findButton('Remove'); + $this->assertNotNull($remove_button); + $second_upload_element_id = 'edit-field-media-reference-1-upload'; + // Upload the second file. + $filename2 = basename($this->testFilePaths[1]); + $page->attachFileToField($second_upload_element_id, $this->testFilePaths[1]); + $assert_session->assertWaitOnAjaxRequest(); + + // Fill in the second media required field and save. + $required_text2 = $this->randomMachineName(); + $page->fillField('field_media_required', $required_text2); + $page->pressButton('Save'); + // Check everything was saved correctly. + $assert_session->pageTextContains("{$this->nodeTypeId} $node_title has been updated"); + $assert_session->pageTextContains($filename1); + $assert_session->pageTextContains($filename2); + $assert_session->pageTextContains($required_text); + $assert_session->pageTextContains($required_text2); + + // Both media entities should exist now. + foreach ([$filename1, $filename2] as $filename) { + $media = $this->container->get('entity_type.manager')->getStorage('media') + ->loadByProperties(['name' => $filename]); + $media = reset($media); + /** @var \Drupal\media\MediaInterface $media */ + $this->assertTrue($media->isPublished()); + } + + // Edit the node, verify we can successfuly remove one of the items. + $this->drupalGet("/node/{$node->id()}/edit"); + $assert_session->pageTextContains($filename1); + $assert_session->pageTextContains($filename2); + $assert_session->buttonExists('edit-field-media-reference-0-remove-button'); + $page->pressButton('edit-field-media-reference-0-remove-button'); + $assert_session->assertWaitOnAjaxRequest(); + $assert_session->pageTextNotContains($filename1); + $assert_session->pageTextContains($filename2); + $page->pressButton('Save'); + $assert_session->pageTextContains("{$this->nodeTypeId} $node_title has been updated"); + $assert_session->pageTextNotContains($filename1); + $assert_session->pageTextContains($filename2); + $assert_session->pageTextNotContains($required_text); + $assert_session->pageTextContains($required_text2); } }