Chris@0: assertSession(); Chris@0: Chris@0: /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $media_storage */ Chris@0: $media_storage = $this->container->get('entity.manager')->getStorage('media'); Chris@0: Chris@0: // Create a media type and media item. Chris@17: $media_type = $this->createMediaType('test'); Chris@0: $media = $media_storage->create([ Chris@0: 'bundle' => $media_type->id(), Chris@0: 'name' => 'Unnamed', Chris@0: ]); Chris@0: $media->save(); Chris@0: Chris@0: // You can't access the revision page when there is only 1 revision. Chris@0: $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view'); Chris@0: $assert->statusCodeEquals(403); Chris@0: Chris@0: // Create some revisions. Chris@0: $media_revisions = []; Chris@0: $media_revisions[] = clone $media; Chris@0: $revision_count = 3; Chris@0: for ($i = 0; $i < $revision_count; $i++) { Chris@0: $media->revision_log = $this->randomMachineName(32); Chris@0: $media = $this->createMediaRevision($media); Chris@0: $media_revisions[] = clone $media; Chris@0: } Chris@0: Chris@0: // Get the last revision for simple checks. Chris@0: /** @var \Drupal\media\MediaInterface $media */ Chris@0: $media = end($media_revisions); Chris@0: Chris@0: // Test permissions. Chris@0: $this->drupalLogin($this->nonAdminUser); Chris@0: /** @var \Drupal\user\RoleInterface $role */ Chris@0: $role = Role::load(RoleInterface::AUTHENTICATED_ID); Chris@0: Chris@0: // Test 'view all media revisions' permission ('view media' permission is Chris@0: // needed as well). Chris@0: user_role_revoke_permissions($role->id(), ['view media', 'view all media revisions']); Chris@0: $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view'); Chris@0: $assert->statusCodeEquals(403); Chris@0: $this->grantPermissions($role, ['view media', 'view all media revisions']); Chris@0: $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view'); Chris@0: $assert->statusCodeEquals(200); Chris@0: Chris@0: // Confirm the revision page shows the correct title. Chris@0: $assert->pageTextContains($media->getName()); Chris@0: Chris@0: // Confirm that the last revision is the default revision. Chris@0: $this->assertTrue($media->isDefaultRevision(), 'Last revision is the default.'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests creating revisions of a File media item. Chris@0: */ Chris@0: public function testFileMediaRevision() { Chris@0: $assert = $this->assertSession(); Chris@0: Chris@0: $uri = 'temporary://foo.txt'; Chris@0: file_put_contents($uri, $this->randomString(128)); Chris@0: Chris@17: $this->createMediaType('file', ['id' => 'file', 'new_revision' => TRUE]); Chris@14: Chris@0: // Create a media item. Chris@0: $this->drupalGet('/media/add/file'); Chris@0: $page = $this->getSession()->getPage(); Chris@0: $page->fillField('Name', 'Foobar'); Chris@0: $page->attachFileToField('File', $this->container->get('file_system')->realpath($uri)); Chris@0: $page->pressButton('Save'); Chris@17: $assert->addressEquals('admin/content/media'); Chris@0: Chris@0: // The media item was just created, so it should only have one revision. Chris@0: $media = $this->container Chris@0: ->get('entity_type.manager') Chris@0: ->getStorage('media') Chris@0: ->load(1); Chris@0: $this->assertRevisionCount($media, 1); Chris@0: Chris@0: // If we edit the item, we should get a new revision. Chris@0: $this->drupalGet('/media/1/edit'); Chris@0: $assert->checkboxChecked('Create new revision'); Chris@0: $page = $this->getSession()->getPage(); Chris@0: $page->fillField('Name', 'Foobaz'); Chris@0: $page->pressButton('Save'); Chris@0: $this->assertRevisionCount($media, 2); Chris@0: Chris@0: // Confirm the correct revision title appears on "view revisions" page. Chris@0: $media = $this->container->get('entity_type.manager') Chris@0: ->getStorage('media') Chris@0: ->loadUnchanged(1); Chris@0: $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view"); Chris@0: $assert->pageTextContains('Foobaz'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests creating revisions of a Image media item. Chris@0: */ Chris@0: public function testImageMediaRevision() { Chris@0: $assert = $this->assertSession(); Chris@0: Chris@17: $this->createMediaType('image', ['id' => 'image', 'new_revision' => TRUE]); Chris@14: Chris@0: /** @var \Drupal\field\FieldConfigInterface $field */ Chris@0: // Disable the alt text field, because this is not a JavaScript test and Chris@0: // the alt text field will therefore not appear without a full page refresh. Chris@0: $field = FieldConfig::load('media.image.field_media_image'); Chris@0: $settings = $field->getSettings(); Chris@0: $settings['alt_field'] = FALSE; Chris@0: $settings['alt_field_required'] = FALSE; Chris@0: $field->set('settings', $settings); Chris@0: $field->save(); Chris@0: Chris@0: // Create a media item. Chris@0: $this->drupalGet('/media/add/image'); Chris@0: $page = $this->getSession()->getPage(); Chris@0: $page->fillField('Name', 'Foobar'); Chris@17: $page->attachFileToField('Image', $this->root . '/core/modules/media/tests/fixtures/example_1.jpeg'); Chris@0: $page->pressButton('Save'); Chris@17: $assert->addressEquals('admin/content/media'); Chris@0: Chris@0: // The media item was just created, so it should only have one revision. Chris@0: $media = $this->container Chris@0: ->get('entity_type.manager') Chris@0: ->getStorage('media') Chris@0: ->load(1); Chris@0: $this->assertRevisionCount($media, 1); Chris@0: Chris@0: // If we edit the item, we should get a new revision. Chris@0: $this->drupalGet('/media/1/edit'); Chris@0: $assert->checkboxChecked('Create new revision'); Chris@0: $page = $this->getSession()->getPage(); Chris@0: $page->fillField('Name', 'Foobaz'); Chris@0: $page->pressButton('Save'); Chris@0: $this->assertRevisionCount($media, 2); Chris@0: Chris@0: // Confirm the correct revision title appears on "view revisions" page. Chris@0: $media = $this->container->get('entity_type.manager') Chris@0: ->getStorage('media') Chris@0: ->loadUnchanged(1); Chris@0: $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view"); Chris@0: $assert->pageTextContains('Foobaz'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Creates a new revision for a given media item. Chris@0: * Chris@0: * @param \Drupal\media\MediaInterface $media Chris@0: * A media object. Chris@0: * Chris@0: * @return \Drupal\media\MediaInterface Chris@0: * A media object with up to date revision information. Chris@0: */ Chris@0: protected function createMediaRevision(MediaInterface $media) { Chris@0: $media->setName($this->randomMachineName()); Chris@0: $media->setNewRevision(); Chris@0: $media->save(); Chris@0: return $media; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Asserts that an entity has a certain number of revisions. Chris@0: * Chris@0: * @param \Drupal\Core\Entity\EntityInterface $entity Chris@0: * The entity in question. Chris@0: * @param int $expected_revisions Chris@0: * The expected number of revisions. Chris@0: */ Chris@0: protected function assertRevisionCount(EntityInterface $entity, $expected_revisions) { Chris@0: $entity_type = $entity->getEntityType(); Chris@0: Chris@0: $count = $this->container Chris@17: ->get('entity_type.manager') Chris@17: ->getStorage($entity_type->id()) Chris@17: ->getQuery() Chris@0: ->count() Chris@0: ->allRevisions() Chris@0: ->condition($entity_type->getKey('id'), $entity->id()) Chris@0: ->execute(); Chris@0: Chris@0: $this->assertSame($expected_revisions, (int) $count); Chris@0: } Chris@0: Chris@0: }