b8ff7c556cd1f0e166d7d205d79808fac8de53c8
[yaffs-website] / web / core / modules / media / tests / src / Functional / MediaRevisionTest.php
1 <?php
2
3 namespace Drupal\Tests\media\Functional;
4
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;
10
11 /**
12  * Tests the revisionability of media entities.
13  *
14  * @group media
15  */
16 class MediaRevisionTest extends MediaFunctionalTestBase {
17
18   /**
19    * Checks media revision operations.
20    */
21   public function testRevisions() {
22     $assert = $this->assertSession();
23
24     /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $media_storage */
25     $media_storage = $this->container->get('entity.manager')->getStorage('media');
26
27     // Create a media type and media item.
28     $media_type = $this->createMediaType();
29     $media = $media_storage->create([
30       'bundle' => $media_type->id(),
31       'name' => 'Unnamed',
32     ]);
33     $media->save();
34
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);
38
39     // Create some revisions.
40     $media_revisions = [];
41     $media_revisions[] = clone $media;
42     $revision_count = 3;
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;
47     }
48
49     // Get the last revision for simple checks.
50     /** @var \Drupal\media\MediaInterface $media */
51     $media = end($media_revisions);
52
53     // Test permissions.
54     $this->drupalLogin($this->nonAdminUser);
55     /** @var \Drupal\user\RoleInterface $role */
56     $role = Role::load(RoleInterface::AUTHENTICATED_ID);
57
58     // Test 'view all media revisions' permission ('view media' permission is
59     // needed as well).
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);
66
67     // Confirm the revision page shows the correct title.
68     $assert->pageTextContains($media->getName());
69
70     // Confirm that the last revision is the default revision.
71     $this->assertTrue($media->isDefaultRevision(), 'Last revision is the default.');
72   }
73
74   /**
75    * Tests creating revisions of a File media item.
76    */
77   public function testFileMediaRevision() {
78     $assert = $this->assertSession();
79
80     $uri = 'temporary://foo.txt';
81     file_put_contents($uri, $this->randomString(128));
82
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]+$/');
90
91     // The media item was just created, so it should only have one revision.
92     $media = $this->container
93       ->get('entity_type.manager')
94       ->getStorage('media')
95       ->load(1);
96     $this->assertRevisionCount($media, 1);
97
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);
105
106     // Confirm the correct revision title appears on "view revisions" page.
107     $media = $this->container->get('entity_type.manager')
108       ->getStorage('media')
109       ->loadUnchanged(1);
110     $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
111     $assert->pageTextContains('Foobaz');
112   }
113
114   /**
115    * Tests creating revisions of a Image media item.
116    */
117   public function testImageMediaRevision() {
118     $assert = $this->assertSession();
119
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);
128     $field->save();
129
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]+$/');
137
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')
142       ->load(1);
143     $this->assertRevisionCount($media, 1);
144
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);
152
153     // Confirm the correct revision title appears on "view revisions" page.
154     $media = $this->container->get('entity_type.manager')
155       ->getStorage('media')
156       ->loadUnchanged(1);
157     $this->drupalGet("media/" . $media->id() . "/revisions/" . $media->getRevisionId() . "/view");
158     $assert->pageTextContains('Foobaz');
159   }
160
161   /**
162    * Creates a new revision for a given media item.
163    *
164    * @param \Drupal\media\MediaInterface $media
165    *   A media object.
166    *
167    * @return \Drupal\media\MediaInterface
168    *   A media object with up to date revision information.
169    */
170   protected function createMediaRevision(MediaInterface $media) {
171     $media->setName($this->randomMachineName());
172     $media->setNewRevision();
173     $media->save();
174     return $media;
175   }
176
177   /**
178    * Asserts that an entity has a certain number of revisions.
179    *
180    * @param \Drupal\Core\Entity\EntityInterface $entity
181    *   The entity in question.
182    * @param int $expected_revisions
183    *   The expected number of revisions.
184    */
185   protected function assertRevisionCount(EntityInterface $entity, $expected_revisions) {
186     $entity_type = $entity->getEntityType();
187
188     $count = $this->container
189       ->get('entity.query')
190       ->get($entity_type->id())
191       ->count()
192       ->allRevisions()
193       ->condition($entity_type->getKey('id'), $entity->id())
194       ->execute();
195
196     $this->assertSame($expected_revisions, (int) $count);
197   }
198
199 }