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@0
|
28 $media_type = $this->createMediaType();
|
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@0
|
83 // Create a media item.
|
Chris@0
|
84 $this->drupalGet('/media/add/file');
|
Chris@0
|
85 $page = $this->getSession()->getPage();
|
Chris@0
|
86 $page->fillField('Name', 'Foobar');
|
Chris@0
|
87 $page->attachFileToField('File', $this->container->get('file_system')->realpath($uri));
|
Chris@0
|
88 $page->pressButton('Save');
|
Chris@0
|
89 $assert->addressMatches('/^\/media\/[0-9]+$/');
|
Chris@0
|
90
|
Chris@0
|
91 // The media item was just created, so it should only have one revision.
|
Chris@0
|
92 $media = $this->container
|
Chris@0
|
93 ->get('entity_type.manager')
|
Chris@0
|
94 ->getStorage('media')
|
Chris@0
|
95 ->load(1);
|
Chris@0
|
96 $this->assertRevisionCount($media, 1);
|
Chris@0
|
97
|
Chris@0
|
98 // If we edit the item, we should get a new revision.
|
Chris@0
|
99 $this->drupalGet('/media/1/edit');
|
Chris@0
|
100 $assert->checkboxChecked('Create new revision');
|
Chris@0
|
101 $page = $this->getSession()->getPage();
|
Chris@0
|
102 $page->fillField('Name', 'Foobaz');
|
Chris@0
|
103 $page->pressButton('Save');
|
Chris@0
|
104 $this->assertRevisionCount($media, 2);
|
Chris@0
|
105
|
Chris@0
|
106 // Confirm the correct revision title appears on "view revisions" page.
|
Chris@0
|
107 $media = $this->container->get('entity_type.manager')
|
Chris@0
|
108 ->getStorage('media')
|
Chris@0
|
109 ->loadUnchanged(1);
|
Chris@0
|
110 $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
|
Chris@0
|
111 $assert->pageTextContains('Foobaz');
|
Chris@0
|
112 }
|
Chris@0
|
113
|
Chris@0
|
114 /**
|
Chris@0
|
115 * Tests creating revisions of a Image media item.
|
Chris@0
|
116 */
|
Chris@0
|
117 public function testImageMediaRevision() {
|
Chris@0
|
118 $assert = $this->assertSession();
|
Chris@0
|
119
|
Chris@0
|
120 /** @var \Drupal\field\FieldConfigInterface $field */
|
Chris@0
|
121 // Disable the alt text field, because this is not a JavaScript test and
|
Chris@0
|
122 // the alt text field will therefore not appear without a full page refresh.
|
Chris@0
|
123 $field = FieldConfig::load('media.image.field_media_image');
|
Chris@0
|
124 $settings = $field->getSettings();
|
Chris@0
|
125 $settings['alt_field'] = FALSE;
|
Chris@0
|
126 $settings['alt_field_required'] = FALSE;
|
Chris@0
|
127 $field->set('settings', $settings);
|
Chris@0
|
128 $field->save();
|
Chris@0
|
129
|
Chris@0
|
130 // Create a media item.
|
Chris@0
|
131 $this->drupalGet('/media/add/image');
|
Chris@0
|
132 $page = $this->getSession()->getPage();
|
Chris@0
|
133 $page->fillField('Name', 'Foobar');
|
Chris@0
|
134 $page->attachFileToField('Image', \Drupal::root() . '/core/modules/media/tests/fixtures/example_1.jpeg');
|
Chris@0
|
135 $page->pressButton('Save');
|
Chris@0
|
136 $assert->addressMatches('/^\/media\/[0-9]+$/');
|
Chris@0
|
137
|
Chris@0
|
138 // The media item was just created, so it should only have one revision.
|
Chris@0
|
139 $media = $this->container
|
Chris@0
|
140 ->get('entity_type.manager')
|
Chris@0
|
141 ->getStorage('media')
|
Chris@0
|
142 ->load(1);
|
Chris@0
|
143 $this->assertRevisionCount($media, 1);
|
Chris@0
|
144
|
Chris@0
|
145 // If we edit the item, we should get a new revision.
|
Chris@0
|
146 $this->drupalGet('/media/1/edit');
|
Chris@0
|
147 $assert->checkboxChecked('Create new revision');
|
Chris@0
|
148 $page = $this->getSession()->getPage();
|
Chris@0
|
149 $page->fillField('Name', 'Foobaz');
|
Chris@0
|
150 $page->pressButton('Save');
|
Chris@0
|
151 $this->assertRevisionCount($media, 2);
|
Chris@0
|
152
|
Chris@0
|
153 // Confirm the correct revision title appears on "view revisions" page.
|
Chris@0
|
154 $media = $this->container->get('entity_type.manager')
|
Chris@0
|
155 ->getStorage('media')
|
Chris@0
|
156 ->loadUnchanged(1);
|
Chris@0
|
157 $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
|
Chris@0
|
158 $assert->pageTextContains('Foobaz');
|
Chris@0
|
159 }
|
Chris@0
|
160
|
Chris@0
|
161 /**
|
Chris@0
|
162 * Creates a new revision for a given media item.
|
Chris@0
|
163 *
|
Chris@0
|
164 * @param \Drupal\media\MediaInterface $media
|
Chris@0
|
165 * A media object.
|
Chris@0
|
166 *
|
Chris@0
|
167 * @return \Drupal\media\MediaInterface
|
Chris@0
|
168 * A media object with up to date revision information.
|
Chris@0
|
169 */
|
Chris@0
|
170 protected function createMediaRevision(MediaInterface $media) {
|
Chris@0
|
171 $media->setName($this->randomMachineName());
|
Chris@0
|
172 $media->setNewRevision();
|
Chris@0
|
173 $media->save();
|
Chris@0
|
174 return $media;
|
Chris@0
|
175 }
|
Chris@0
|
176
|
Chris@0
|
177 /**
|
Chris@0
|
178 * Asserts that an entity has a certain number of revisions.
|
Chris@0
|
179 *
|
Chris@0
|
180 * @param \Drupal\Core\Entity\EntityInterface $entity
|
Chris@0
|
181 * The entity in question.
|
Chris@0
|
182 * @param int $expected_revisions
|
Chris@0
|
183 * The expected number of revisions.
|
Chris@0
|
184 */
|
Chris@0
|
185 protected function assertRevisionCount(EntityInterface $entity, $expected_revisions) {
|
Chris@0
|
186 $entity_type = $entity->getEntityType();
|
Chris@0
|
187
|
Chris@0
|
188 $count = $this->container
|
Chris@0
|
189 ->get('entity.query')
|
Chris@0
|
190 ->get($entity_type->id())
|
Chris@0
|
191 ->count()
|
Chris@0
|
192 ->allRevisions()
|
Chris@0
|
193 ->condition($entity_type->getKey('id'), $entity->id())
|
Chris@0
|
194 ->execute();
|
Chris@0
|
195
|
Chris@0
|
196 $this->assertSame($expected_revisions, (int) $count);
|
Chris@0
|
197 }
|
Chris@0
|
198
|
Chris@0
|
199 }
|