Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\media\Functional;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Entity\EntityInterface;
|
Chris@0
|
6 use Drupal\field\Entity\FieldConfig;
|
Chris@0
|
7 use Drupal\media\MediaInterface;
|
Chris@0
|
8 use Drupal\user\Entity\Role;
|
Chris@0
|
9 use Drupal\user\RoleInterface;
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * Tests the revisionability of media entities.
|
Chris@0
|
13 *
|
Chris@0
|
14 * @group media
|
Chris@0
|
15 */
|
Chris@0
|
16 class MediaRevisionTest extends MediaFunctionalTestBase {
|
Chris@0
|
17
|
Chris@0
|
18 /**
|
Chris@0
|
19 * Checks media revision operations.
|
Chris@0
|
20 */
|
Chris@0
|
21 public function testRevisions() {
|
Chris@0
|
22 $assert = $this->assertSession();
|
Chris@0
|
23
|
Chris@0
|
24 /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $media_storage */
|
Chris@0
|
25 $media_storage = $this->container->get('entity.manager')->getStorage('media');
|
Chris@0
|
26
|
Chris@0
|
27 // Create a media type and media item.
|
Chris@17
|
28 $media_type = $this->createMediaType('test');
|
Chris@0
|
29 $media = $media_storage->create([
|
Chris@0
|
30 'bundle' => $media_type->id(),
|
Chris@0
|
31 'name' => 'Unnamed',
|
Chris@0
|
32 ]);
|
Chris@0
|
33 $media->save();
|
Chris@0
|
34
|
Chris@0
|
35 // You can't access the revision page when there is only 1 revision.
|
Chris@0
|
36 $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view');
|
Chris@0
|
37 $assert->statusCodeEquals(403);
|
Chris@0
|
38
|
Chris@0
|
39 // Create some revisions.
|
Chris@0
|
40 $media_revisions = [];
|
Chris@0
|
41 $media_revisions[] = clone $media;
|
Chris@0
|
42 $revision_count = 3;
|
Chris@0
|
43 for ($i = 0; $i < $revision_count; $i++) {
|
Chris@0
|
44 $media->revision_log = $this->randomMachineName(32);
|
Chris@0
|
45 $media = $this->createMediaRevision($media);
|
Chris@0
|
46 $media_revisions[] = clone $media;
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@0
|
49 // Get the last revision for simple checks.
|
Chris@0
|
50 /** @var \Drupal\media\MediaInterface $media */
|
Chris@0
|
51 $media = end($media_revisions);
|
Chris@0
|
52
|
Chris@0
|
53 // Test permissions.
|
Chris@0
|
54 $this->drupalLogin($this->nonAdminUser);
|
Chris@0
|
55 /** @var \Drupal\user\RoleInterface $role */
|
Chris@0
|
56 $role = Role::load(RoleInterface::AUTHENTICATED_ID);
|
Chris@0
|
57
|
Chris@0
|
58 // Test 'view all media revisions' permission ('view media' permission is
|
Chris@0
|
59 // needed as well).
|
Chris@0
|
60 user_role_revoke_permissions($role->id(), ['view media', 'view all media revisions']);
|
Chris@0
|
61 $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view');
|
Chris@0
|
62 $assert->statusCodeEquals(403);
|
Chris@0
|
63 $this->grantPermissions($role, ['view media', 'view all media revisions']);
|
Chris@0
|
64 $this->drupalGet('media/' . $media->id() . '/revisions/' . $media->getRevisionId() . '/view');
|
Chris@0
|
65 $assert->statusCodeEquals(200);
|
Chris@0
|
66
|
Chris@0
|
67 // Confirm the revision page shows the correct title.
|
Chris@0
|
68 $assert->pageTextContains($media->getName());
|
Chris@0
|
69
|
Chris@0
|
70 // Confirm that the last revision is the default revision.
|
Chris@0
|
71 $this->assertTrue($media->isDefaultRevision(), 'Last revision is the default.');
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 /**
|
Chris@0
|
75 * Tests creating revisions of a File media item.
|
Chris@0
|
76 */
|
Chris@0
|
77 public function testFileMediaRevision() {
|
Chris@0
|
78 $assert = $this->assertSession();
|
Chris@0
|
79
|
Chris@0
|
80 $uri = 'temporary://foo.txt';
|
Chris@0
|
81 file_put_contents($uri, $this->randomString(128));
|
Chris@0
|
82
|
Chris@17
|
83 $this->createMediaType('file', ['id' => 'file', 'new_revision' => TRUE]);
|
Chris@14
|
84
|
Chris@0
|
85 // Create a media item.
|
Chris@0
|
86 $this->drupalGet('/media/add/file');
|
Chris@0
|
87 $page = $this->getSession()->getPage();
|
Chris@0
|
88 $page->fillField('Name', 'Foobar');
|
Chris@0
|
89 $page->attachFileToField('File', $this->container->get('file_system')->realpath($uri));
|
Chris@0
|
90 $page->pressButton('Save');
|
Chris@17
|
91 $assert->addressEquals('admin/content/media');
|
Chris@0
|
92
|
Chris@0
|
93 // The media item was just created, so it should only have one revision.
|
Chris@0
|
94 $media = $this->container
|
Chris@0
|
95 ->get('entity_type.manager')
|
Chris@0
|
96 ->getStorage('media')
|
Chris@0
|
97 ->load(1);
|
Chris@0
|
98 $this->assertRevisionCount($media, 1);
|
Chris@0
|
99
|
Chris@0
|
100 // If we edit the item, we should get a new revision.
|
Chris@0
|
101 $this->drupalGet('/media/1/edit');
|
Chris@0
|
102 $assert->checkboxChecked('Create new revision');
|
Chris@0
|
103 $page = $this->getSession()->getPage();
|
Chris@0
|
104 $page->fillField('Name', 'Foobaz');
|
Chris@0
|
105 $page->pressButton('Save');
|
Chris@0
|
106 $this->assertRevisionCount($media, 2);
|
Chris@0
|
107
|
Chris@0
|
108 // Confirm the correct revision title appears on "view revisions" page.
|
Chris@0
|
109 $media = $this->container->get('entity_type.manager')
|
Chris@0
|
110 ->getStorage('media')
|
Chris@0
|
111 ->loadUnchanged(1);
|
Chris@0
|
112 $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
|
Chris@0
|
113 $assert->pageTextContains('Foobaz');
|
Chris@0
|
114 }
|
Chris@0
|
115
|
Chris@0
|
116 /**
|
Chris@0
|
117 * Tests creating revisions of a Image media item.
|
Chris@0
|
118 */
|
Chris@0
|
119 public function testImageMediaRevision() {
|
Chris@0
|
120 $assert = $this->assertSession();
|
Chris@0
|
121
|
Chris@17
|
122 $this->createMediaType('image', ['id' => 'image', 'new_revision' => TRUE]);
|
Chris@14
|
123
|
Chris@0
|
124 /** @var \Drupal\field\FieldConfigInterface $field */
|
Chris@0
|
125 // Disable the alt text field, because this is not a JavaScript test and
|
Chris@0
|
126 // the alt text field will therefore not appear without a full page refresh.
|
Chris@0
|
127 $field = FieldConfig::load('media.image.field_media_image');
|
Chris@0
|
128 $settings = $field->getSettings();
|
Chris@0
|
129 $settings['alt_field'] = FALSE;
|
Chris@0
|
130 $settings['alt_field_required'] = FALSE;
|
Chris@0
|
131 $field->set('settings', $settings);
|
Chris@0
|
132 $field->save();
|
Chris@0
|
133
|
Chris@0
|
134 // Create a media item.
|
Chris@0
|
135 $this->drupalGet('/media/add/image');
|
Chris@0
|
136 $page = $this->getSession()->getPage();
|
Chris@0
|
137 $page->fillField('Name', 'Foobar');
|
Chris@17
|
138 $page->attachFileToField('Image', $this->root . '/core/modules/media/tests/fixtures/example_1.jpeg');
|
Chris@0
|
139 $page->pressButton('Save');
|
Chris@17
|
140 $assert->addressEquals('admin/content/media');
|
Chris@0
|
141
|
Chris@0
|
142 // The media item was just created, so it should only have one revision.
|
Chris@0
|
143 $media = $this->container
|
Chris@0
|
144 ->get('entity_type.manager')
|
Chris@0
|
145 ->getStorage('media')
|
Chris@0
|
146 ->load(1);
|
Chris@0
|
147 $this->assertRevisionCount($media, 1);
|
Chris@0
|
148
|
Chris@0
|
149 // If we edit the item, we should get a new revision.
|
Chris@0
|
150 $this->drupalGet('/media/1/edit');
|
Chris@0
|
151 $assert->checkboxChecked('Create new revision');
|
Chris@0
|
152 $page = $this->getSession()->getPage();
|
Chris@0
|
153 $page->fillField('Name', 'Foobaz');
|
Chris@0
|
154 $page->pressButton('Save');
|
Chris@0
|
155 $this->assertRevisionCount($media, 2);
|
Chris@0
|
156
|
Chris@0
|
157 // Confirm the correct revision title appears on "view revisions" page.
|
Chris@0
|
158 $media = $this->container->get('entity_type.manager')
|
Chris@0
|
159 ->getStorage('media')
|
Chris@0
|
160 ->loadUnchanged(1);
|
Chris@0
|
161 $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
|
Chris@0
|
162 $assert->pageTextContains('Foobaz');
|
Chris@0
|
163 }
|
Chris@0
|
164
|
Chris@0
|
165 /**
|
Chris@0
|
166 * Creates a new revision for a given media item.
|
Chris@0
|
167 *
|
Chris@0
|
168 * @param \Drupal\media\MediaInterface $media
|
Chris@0
|
169 * A media object.
|
Chris@0
|
170 *
|
Chris@0
|
171 * @return \Drupal\media\MediaInterface
|
Chris@0
|
172 * A media object with up to date revision information.
|
Chris@0
|
173 */
|
Chris@0
|
174 protected function createMediaRevision(MediaInterface $media) {
|
Chris@0
|
175 $media->setName($this->randomMachineName());
|
Chris@0
|
176 $media->setNewRevision();
|
Chris@0
|
177 $media->save();
|
Chris@0
|
178 return $media;
|
Chris@0
|
179 }
|
Chris@0
|
180
|
Chris@0
|
181 /**
|
Chris@0
|
182 * Asserts that an entity has a certain number of revisions.
|
Chris@0
|
183 *
|
Chris@0
|
184 * @param \Drupal\Core\Entity\EntityInterface $entity
|
Chris@0
|
185 * The entity in question.
|
Chris@0
|
186 * @param int $expected_revisions
|
Chris@0
|
187 * The expected number of revisions.
|
Chris@0
|
188 */
|
Chris@0
|
189 protected function assertRevisionCount(EntityInterface $entity, $expected_revisions) {
|
Chris@0
|
190 $entity_type = $entity->getEntityType();
|
Chris@0
|
191
|
Chris@0
|
192 $count = $this->container
|
Chris@17
|
193 ->get('entity_type.manager')
|
Chris@17
|
194 ->getStorage($entity_type->id())
|
Chris@17
|
195 ->getQuery()
|
Chris@0
|
196 ->count()
|
Chris@0
|
197 ->allRevisions()
|
Chris@0
|
198 ->condition($entity_type->getKey('id'), $entity->id())
|
Chris@0
|
199 ->execute();
|
Chris@0
|
200
|
Chris@0
|
201 $this->assertSame($expected_revisions, (int) $count);
|
Chris@0
|
202 }
|
Chris@0
|
203
|
Chris@0
|
204 }
|