annotate core/modules/jsonapi/tests/src/Functional/MediaTest.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents
children
rev   line source
Chris@5 1 <?php
Chris@5 2
Chris@5 3 namespace Drupal\Tests\jsonapi\Functional;
Chris@5 4
Chris@5 5 use Drupal\Core\Entity\EntityInterface;
Chris@5 6 use Drupal\Core\Url;
Chris@5 7 use Drupal\file\Entity\File;
Chris@5 8 use Drupal\media\Entity\Media;
Chris@5 9 use Drupal\media\Entity\MediaType;
Chris@5 10 use Drupal\Tests\jsonapi\Traits\CommonCollectionFilterAccessTestPatternsTrait;
Chris@5 11 use Drupal\user\Entity\User;
Chris@5 12
Chris@5 13 /**
Chris@5 14 * JSON:API integration test for the "Media" content entity type.
Chris@5 15 *
Chris@5 16 * @group jsonapi
Chris@5 17 */
Chris@5 18 class MediaTest extends ResourceTestBase {
Chris@5 19
Chris@5 20 use CommonCollectionFilterAccessTestPatternsTrait;
Chris@5 21
Chris@5 22 /**
Chris@5 23 * {@inheritdoc}
Chris@5 24 */
Chris@5 25 public static $modules = ['media'];
Chris@5 26
Chris@5 27 /**
Chris@5 28 * {@inheritdoc}
Chris@5 29 */
Chris@5 30 protected static $entityTypeId = 'media';
Chris@5 31
Chris@5 32 /**
Chris@5 33 * {@inheritdoc}
Chris@5 34 */
Chris@5 35 protected static $resourceTypeName = 'media--camelids';
Chris@5 36
Chris@5 37 /**
Chris@5 38 * {@inheritdoc}
Chris@5 39 */
Chris@5 40 protected static $resourceTypeIsVersionable = TRUE;
Chris@5 41
Chris@5 42 /**
Chris@5 43 * {@inheritdoc}
Chris@5 44 *
Chris@5 45 * @var \Drupal\media\MediaInterface
Chris@5 46 */
Chris@5 47 protected $entity;
Chris@5 48
Chris@5 49 /**
Chris@5 50 * {@inheritdoc}
Chris@5 51 */
Chris@5 52 protected static $patchProtectedFieldNames = [
Chris@5 53 'changed' => NULL,
Chris@5 54 ];
Chris@5 55
Chris@5 56 /**
Chris@5 57 * {@inheritdoc}
Chris@5 58 */
Chris@5 59 protected function setUpAuthorization($method) {
Chris@5 60 switch ($method) {
Chris@5 61 case 'GET':
Chris@5 62 $this->grantPermissionsToTestedRole(['view media']);
Chris@5 63 break;
Chris@5 64
Chris@5 65 case 'POST':
Chris@5 66 $this->grantPermissionsToTestedRole(['create camelids media', 'access content']);
Chris@5 67 break;
Chris@5 68
Chris@5 69 case 'PATCH':
Chris@5 70 $this->grantPermissionsToTestedRole(['edit any camelids media']);
Chris@5 71 // @todo Remove this in https://www.drupal.org/node/2824851.
Chris@5 72 $this->grantPermissionsToTestedRole(['access content']);
Chris@5 73 break;
Chris@5 74
Chris@5 75 case 'DELETE':
Chris@5 76 $this->grantPermissionsToTestedRole(['delete any camelids media']);
Chris@5 77 break;
Chris@5 78 }
Chris@5 79 }
Chris@5 80
Chris@5 81 /**
Chris@5 82 * {@inheritdoc}
Chris@5 83 */
Chris@5 84 protected function setUpRevisionAuthorization($method) {
Chris@5 85 parent::setUpRevisionAuthorization($method);
Chris@5 86 $this->grantPermissionsToTestedRole(['view all media revisions']);
Chris@5 87 }
Chris@5 88
Chris@5 89 /**
Chris@5 90 * {@inheritdoc}
Chris@5 91 */
Chris@5 92 protected function createEntity() {
Chris@5 93 if (!MediaType::load('camelids')) {
Chris@5 94 // Create a "Camelids" media type.
Chris@5 95 $media_type = MediaType::create([
Chris@5 96 'name' => 'Camelids',
Chris@5 97 'id' => 'camelids',
Chris@5 98 'description' => 'Camelids are large, strictly herbivorous animals with slender necks and long legs.',
Chris@5 99 'source' => 'file',
Chris@5 100 ]);
Chris@5 101 $media_type->save();
Chris@5 102 // Create the source field.
Chris@5 103 $source_field = $media_type->getSource()->createSourceField($media_type);
Chris@5 104 $source_field->getFieldStorageDefinition()->save();
Chris@5 105 $source_field->save();
Chris@5 106 $media_type
Chris@5 107 ->set('source_configuration', [
Chris@5 108 'source_field' => $source_field->getName(),
Chris@5 109 ])
Chris@5 110 ->save();
Chris@5 111 }
Chris@5 112
Chris@5 113 // Create a file to upload.
Chris@5 114 $file = File::create([
Chris@5 115 'uri' => 'public://llama.txt',
Chris@5 116 ]);
Chris@5 117 $file->setPermanent();
Chris@5 118 $file->save();
Chris@5 119
Chris@5 120 // @see \Drupal\Tests\jsonapi\Functional\MediaTest::testPostIndividual()
Chris@5 121 $post_file = File::create([
Chris@5 122 'uri' => 'public://llama2.txt',
Chris@5 123 ]);
Chris@5 124 $post_file->setPermanent();
Chris@5 125 $post_file->save();
Chris@5 126
Chris@5 127 // Create a "Llama" media item.
Chris@5 128 $media = Media::create([
Chris@5 129 'bundle' => 'camelids',
Chris@5 130 'field_media_file' => [
Chris@5 131 'target_id' => $file->id(),
Chris@5 132 ],
Chris@5 133 ]);
Chris@5 134 $media
Chris@5 135 ->setName('Llama')
Chris@5 136 ->setPublished()
Chris@5 137 ->setCreatedTime(123456789)
Chris@5 138 ->setOwnerId($this->account->id())
Chris@5 139 ->setRevisionUserId($this->account->id())
Chris@5 140 ->save();
Chris@5 141
Chris@5 142 return $media;
Chris@5 143 }
Chris@5 144
Chris@5 145 /**
Chris@5 146 * {@inheritdoc}
Chris@5 147 */
Chris@5 148 protected function getExpectedDocument() {
Chris@5 149 $file = File::load(1);
Chris@5 150 $thumbnail = File::load(3);
Chris@5 151 $author = User::load($this->entity->getOwnerId());
Chris@5 152 $base_url = Url::fromUri('base:/jsonapi/media/camelids/' . $this->entity->uuid())->setAbsolute();
Chris@5 153 $self_url = clone $base_url;
Chris@5 154 $version_identifier = 'id:' . $this->entity->getRevisionId();
Chris@5 155 $self_url = $self_url->setOption('query', ['resourceVersion' => $version_identifier]);
Chris@5 156 $version_query_string = '?resourceVersion=' . urlencode($version_identifier);
Chris@5 157 return [
Chris@5 158 'jsonapi' => [
Chris@5 159 'meta' => [
Chris@5 160 'links' => [
Chris@5 161 'self' => ['href' => 'http://jsonapi.org/format/1.0/'],
Chris@5 162 ],
Chris@5 163 ],
Chris@5 164 'version' => '1.0',
Chris@5 165 ],
Chris@5 166 'links' => [
Chris@5 167 'self' => ['href' => $base_url->toString()],
Chris@5 168 ],
Chris@5 169 'data' => [
Chris@5 170 'id' => $this->entity->uuid(),
Chris@5 171 'type' => 'media--camelids',
Chris@5 172 'links' => [
Chris@5 173 'self' => ['href' => $self_url->toString()],
Chris@5 174 ],
Chris@5 175 'attributes' => [
Chris@5 176 'langcode' => 'en',
Chris@5 177 'name' => 'Llama',
Chris@5 178 'status' => TRUE,
Chris@5 179 'created' => '1973-11-29T21:33:09+00:00',
Chris@5 180 'changed' => (new \DateTime())->setTimestamp($this->entity->getChangedTime())->setTimezone(new \DateTimeZone('UTC'))->format(\DateTime::RFC3339),
Chris@5 181 'revision_created' => (new \DateTime())->setTimestamp($this->entity->getRevisionCreationTime())->setTimezone(new \DateTimeZone('UTC'))->format(\DateTime::RFC3339),
Chris@5 182 'default_langcode' => TRUE,
Chris@5 183 'revision_log_message' => NULL,
Chris@5 184 // @todo Attempt to remove this in https://www.drupal.org/project/drupal/issues/2933518.
Chris@5 185 'revision_translation_affected' => TRUE,
Chris@5 186 'drupal_internal__mid' => 1,
Chris@5 187 'drupal_internal__vid' => 1,
Chris@5 188 ],
Chris@5 189 'relationships' => [
Chris@5 190 'field_media_file' => [
Chris@5 191 'data' => [
Chris@5 192 'id' => $file->uuid(),
Chris@5 193 'meta' => [
Chris@5 194 'description' => NULL,
Chris@5 195 'display' => NULL,
Chris@5 196 ],
Chris@5 197 'type' => 'file--file',
Chris@5 198 ],
Chris@5 199 'links' => [
Chris@5 200 'related' => [
Chris@5 201 'href' => $base_url->toString() . '/field_media_file' . $version_query_string,
Chris@5 202 ],
Chris@5 203 'self' => [
Chris@5 204 'href' => $base_url->toString() . '/relationships/field_media_file' . $version_query_string,
Chris@5 205 ],
Chris@5 206 ],
Chris@5 207 ],
Chris@5 208 'thumbnail' => [
Chris@5 209 'data' => [
Chris@5 210 'id' => $thumbnail->uuid(),
Chris@5 211 'meta' => [
Chris@5 212 'alt' => '',
Chris@5 213 'width' => 180,
Chris@5 214 'height' => 180,
Chris@5 215 'title' => NULL,
Chris@5 216 ],
Chris@5 217 'type' => 'file--file',
Chris@5 218 ],
Chris@5 219 'links' => [
Chris@5 220 'related' => [
Chris@5 221 'href' => $base_url->toString() . '/thumbnail' . $version_query_string,
Chris@5 222 ],
Chris@5 223 'self' => [
Chris@5 224 'href' => $base_url->toString() . '/relationships/thumbnail' . $version_query_string,
Chris@5 225 ],
Chris@5 226 ],
Chris@5 227 ],
Chris@5 228 'bundle' => [
Chris@5 229 'data' => [
Chris@5 230 'id' => MediaType::load('camelids')->uuid(),
Chris@5 231 'type' => 'media_type--media_type',
Chris@5 232 ],
Chris@5 233 'links' => [
Chris@5 234 'related' => [
Chris@5 235 'href' => $base_url->toString() . '/bundle' . $version_query_string,
Chris@5 236 ],
Chris@5 237 'self' => [
Chris@5 238 'href' => $base_url->toString() . '/relationships/bundle' . $version_query_string,
Chris@5 239 ],
Chris@5 240 ],
Chris@5 241 ],
Chris@5 242 'uid' => [
Chris@5 243 'data' => [
Chris@5 244 'id' => $author->uuid(),
Chris@5 245 'type' => 'user--user',
Chris@5 246 ],
Chris@5 247 'links' => [
Chris@5 248 'related' => [
Chris@5 249 'href' => $base_url->toString() . '/uid' . $version_query_string,
Chris@5 250 ],
Chris@5 251 'self' => [
Chris@5 252 'href' => $base_url->toString() . '/relationships/uid' . $version_query_string,
Chris@5 253 ],
Chris@5 254 ],
Chris@5 255 ],
Chris@5 256 'revision_user' => [
Chris@5 257 'data' => [
Chris@5 258 'id' => $author->uuid(),
Chris@5 259 'type' => 'user--user',
Chris@5 260 ],
Chris@5 261 'links' => [
Chris@5 262 'related' => [
Chris@5 263 'href' => $base_url->toString() . '/revision_user' . $version_query_string,
Chris@5 264 ],
Chris@5 265 'self' => [
Chris@5 266 'href' => $base_url->toString() . '/relationships/revision_user' . $version_query_string,
Chris@5 267 ],
Chris@5 268 ],
Chris@5 269 ],
Chris@5 270 ],
Chris@5 271 ],
Chris@5 272 ];
Chris@5 273 }
Chris@5 274
Chris@5 275 /**
Chris@5 276 * {@inheritdoc}
Chris@5 277 */
Chris@5 278 protected function getPostDocument() {
Chris@5 279 $file = File::load(2);
Chris@5 280 return [
Chris@5 281 'data' => [
Chris@5 282 'type' => 'media--camelids',
Chris@5 283 'attributes' => [
Chris@5 284 'name' => 'Dramallama',
Chris@5 285 ],
Chris@5 286 'relationships' => [
Chris@5 287 'field_media_file' => [
Chris@5 288 'data' => [
Chris@5 289 'id' => $file->uuid(),
Chris@5 290 'meta' => [
Chris@5 291 'description' => 'This file is better!',
Chris@5 292 'display' => NULL,
Chris@5 293 ],
Chris@5 294 'type' => 'file--file',
Chris@5 295 ],
Chris@5 296 ],
Chris@5 297 ],
Chris@5 298 ],
Chris@5 299 ];
Chris@5 300 }
Chris@5 301
Chris@5 302 /**
Chris@5 303 * {@inheritdoc}
Chris@5 304 */
Chris@5 305 protected function getExpectedUnauthorizedAccessMessage($method) {
Chris@5 306 switch ($method) {
Chris@5 307 case 'GET';
Chris@5 308 return "The 'view media' permission is required when the media item is published.";
Chris@5 309
Chris@5 310 case 'POST':
Chris@5 311 return "The following permissions are required: 'administer media' OR 'create media' OR 'create camelids media'.";
Chris@5 312
Chris@5 313 case 'PATCH':
Chris@5 314 return "The following permissions are required: 'update any media' OR 'update own media' OR 'camelids: edit any media' OR 'camelids: edit own media'.";
Chris@5 315
Chris@5 316 case 'DELETE':
Chris@5 317 return "The following permissions are required: 'delete any media' OR 'delete own media' OR 'camelids: delete any media' OR 'camelids: delete own media'.";
Chris@5 318
Chris@5 319 default:
Chris@5 320 return '';
Chris@5 321 }
Chris@5 322 }
Chris@5 323
Chris@5 324 /**
Chris@5 325 * {@inheritdoc}
Chris@5 326 */
Chris@5 327 protected function getEditorialPermissions() {
Chris@5 328 return array_merge(parent::getEditorialPermissions(), ['view any unpublished content']);
Chris@5 329 }
Chris@5 330
Chris@5 331 /**
Chris@5 332 * {@inheritdoc}
Chris@5 333 */
Chris@5 334 protected function getExpectedUnauthorizedAccessCacheability() {
Chris@5 335 // @see \Drupal\media\MediaAccessControlHandler::checkAccess()
Chris@5 336 return parent::getExpectedUnauthorizedAccessCacheability()
Chris@5 337 ->addCacheTags(['media:1']);
Chris@5 338 }
Chris@5 339
Chris@5 340 // @codingStandardsIgnoreStart
Chris@5 341 /**
Chris@5 342 * {@inheritdoc}
Chris@5 343 */
Chris@5 344 public function testPostIndividual() {
Chris@5 345 // @todo Mimic \Drupal\Tests\rest\Functional\EntityResource\Media\MediaResourceTestBase::testPost()
Chris@5 346 // @todo Later, use https://www.drupal.org/project/jsonapi/issues/2958554 to upload files rather than the REST module.
Chris@5 347 parent::testPostIndividual();
Chris@5 348 }
Chris@5 349 // @codingStandardsIgnoreEnd
Chris@5 350
Chris@5 351 /**
Chris@5 352 * {@inheritdoc}
Chris@5 353 *
Chris@5 354 * @todo Determine if this override should be removed in https://www.drupal.org/project/jsonapi/issues/2952522
Chris@5 355 */
Chris@5 356 protected function getExpectedGetRelationshipDocumentData($relationship_field_name, EntityInterface $entity = NULL) {
Chris@5 357 $data = parent::getExpectedGetRelationshipDocumentData($relationship_field_name, $entity);
Chris@5 358 switch ($relationship_field_name) {
Chris@5 359 case 'thumbnail':
Chris@5 360 $data['meta'] = [
Chris@5 361 'alt' => '',
Chris@5 362 'width' => 180,
Chris@5 363 'height' => 180,
Chris@5 364 'title' => NULL,
Chris@5 365 ];
Chris@5 366 return $data;
Chris@5 367
Chris@5 368 case 'field_media_file':
Chris@5 369 $data['meta'] = [
Chris@5 370 'description' => NULL,
Chris@5 371 'display' => NULL,
Chris@5 372 ];
Chris@5 373 return $data;
Chris@5 374
Chris@5 375 default:
Chris@5 376 return $data;
Chris@5 377 }
Chris@5 378 }
Chris@5 379
Chris@5 380 /**
Chris@5 381 * {@inheritdoc}
Chris@5 382 *
Chris@5 383 * @todo Remove this in https://www.drupal.org/node/2824851.
Chris@5 384 */
Chris@5 385 protected function doTestRelationshipMutation(array $request_options) {
Chris@5 386 $this->grantPermissionsToTestedRole(['access content']);
Chris@5 387 parent::doTestRelationshipMutation($request_options);
Chris@5 388 }
Chris@5 389
Chris@5 390 /**
Chris@5 391 * {@inheritdoc}
Chris@5 392 */
Chris@5 393 public function testCollectionFilterAccess() {
Chris@5 394 $this->doTestCollectionFilterAccessForPublishableEntities('name', 'view media', 'administer media');
Chris@5 395 }
Chris@5 396
Chris@5 397 }