3 namespace Drupal\Tests\media\Functional;
5 use Drupal\Core\Entity\EntityInterface;
6 use Drupal\field\Entity\FieldConfig;
7 use Drupal\media\MediaInterface;
8 use Drupal\user\Entity\Role;
9 use Drupal\user\RoleInterface;
12 * Tests the revisionability of media entities.
16 class MediaRevisionTest extends MediaFunctionalTestBase {
19 * Checks media revision operations.
21 public function testRevisions() {
22 $assert = $this->assertSession();
24 /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $media_storage */
25 $media_storage = $this->container->get('entity.manager')->getStorage('media');
27 // Create a media type and media item.
28 $media_type = $this->createMediaType();
29 $media = $media_storage->create([
30 'bundle' => $media_type->id(),
35 // You can't access the revision page when there is only 1 revision.
36 $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view');
37 $assert->statusCodeEquals(403);
39 // Create some revisions.
40 $media_revisions = [];
41 $media_revisions[] = clone $media;
43 for ($i = 0; $i < $revision_count; $i++) {
44 $media->revision_log = $this->randomMachineName(32);
45 $media = $this->createMediaRevision($media);
46 $media_revisions[] = clone $media;
49 // Get the last revision for simple checks.
50 /** @var \Drupal\media\MediaInterface $media */
51 $media = end($media_revisions);
54 $this->drupalLogin($this->nonAdminUser);
55 /** @var \Drupal\user\RoleInterface $role */
56 $role = Role::load(RoleInterface::AUTHENTICATED_ID);
58 // Test 'view all media revisions' permission ('view media' permission is
60 user_role_revoke_permissions($role->id(), ['view media', 'view all media revisions']);
61 $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view');
62 $assert->statusCodeEquals(403);
63 $this->grantPermissions($role, ['view media', 'view all media revisions']);
64 $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view');
65 $assert->statusCodeEquals(200);
67 // Confirm the revision page shows the correct title.
68 $assert->pageTextContains($media->getName());
70 // Confirm that the last revision is the default revision.
71 $this->assertTrue($media->isDefaultRevision(), 'Last revision is the default.');
75 * Tests creating revisions of a File media item.
77 public function testFileMediaRevision() {
78 $assert = $this->assertSession();
80 $uri = 'temporary://foo.txt';
81 file_put_contents($uri, $this->randomString(128));
83 // Create a media item.
84 $this->drupalGet('/media/add/file');
85 $page = $this->getSession()->getPage();
86 $page->fillField('Name', 'Foobar');
87 $page->attachFileToField('File', $this->container->get('file_system')->realpath($uri));
88 $page->pressButton('Save');
89 $assert->addressMatches('/^\/media\/[0-9]+$/');
91 // The media item was just created, so it should only have one revision.
92 $media = $this->container
93 ->get('entity_type.manager')
96 $this->assertRevisionCount($media, 1);
98 // If we edit the item, we should get a new revision.
99 $this->drupalGet('/media/1/edit');
100 $assert->checkboxChecked('Create new revision');
101 $page = $this->getSession()->getPage();
102 $page->fillField('Name', 'Foobaz');
103 $page->pressButton('Save');
104 $this->assertRevisionCount($media, 2);
106 // Confirm the correct revision title appears on "view revisions" page.
107 $media = $this->container->get('entity_type.manager')
108 ->getStorage('media')
110 $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
111 $assert->pageTextContains('Foobaz');
115 * Tests creating revisions of a Image media item.
117 public function testImageMediaRevision() {
118 $assert = $this->assertSession();
120 /** @var \Drupal\field\FieldConfigInterface $field */
121 // Disable the alt text field, because this is not a JavaScript test and
122 // the alt text field will therefore not appear without a full page refresh.
123 $field = FieldConfig::load('media.image.field_media_image');
124 $settings = $field->getSettings();
125 $settings['alt_field'] = FALSE;
126 $settings['alt_field_required'] = FALSE;
127 $field->set('settings', $settings);
130 // Create a media item.
131 $this->drupalGet('/media/add/image');
132 $page = $this->getSession()->getPage();
133 $page->fillField('Name', 'Foobar');
134 $page->attachFileToField('Image', \Drupal::root() . '/core/modules/media/tests/fixtures/example_1.jpeg');
135 $page->pressButton('Save');
136 $assert->addressMatches('/^\/media\/[0-9]+$/');
138 // The media item was just created, so it should only have one revision.
139 $media = $this->container
140 ->get('entity_type.manager')
141 ->getStorage('media')
143 $this->assertRevisionCount($media, 1);
145 // If we edit the item, we should get a new revision.
146 $this->drupalGet('/media/1/edit');
147 $assert->checkboxChecked('Create new revision');
148 $page = $this->getSession()->getPage();
149 $page->fillField('Name', 'Foobaz');
150 $page->pressButton('Save');
151 $this->assertRevisionCount($media, 2);
153 // Confirm the correct revision title appears on "view revisions" page.
154 $media = $this->container->get('entity_type.manager')
155 ->getStorage('media')
157 $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
158 $assert->pageTextContains('Foobaz');
162 * Creates a new revision for a given media item.
164 * @param \Drupal\media\MediaInterface $media
167 * @return \Drupal\media\MediaInterface
168 * A media object with up to date revision information.
170 protected function createMediaRevision(MediaInterface $media) {
171 $media->setName($this->randomMachineName());
172 $media->setNewRevision();
178 * Asserts that an entity has a certain number of revisions.
180 * @param \Drupal\Core\Entity\EntityInterface $entity
181 * The entity in question.
182 * @param int $expected_revisions
183 * The expected number of revisions.
185 protected function assertRevisionCount(EntityInterface $entity, $expected_revisions) {
186 $entity_type = $entity->getEntityType();
188 $count = $this->container
189 ->get('entity.query')
190 ->get($entity_type->id())
193 ->condition($entity_type->getKey('id'), $entity->id())
196 $this->assertSame($expected_revisions, (int) $count);