annotate core/modules/media/tests/src/Functional/MediaRevisionTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
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@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 }