annotate core/modules/media/tests/src/Functional/MediaRevisionTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
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 }