WorkspaceTest.php

Same filename in this branch
  1. 10 core/modules/workspaces/tests/src/Functional/WorkspaceTest.php
Same filename and directory in other branches
  1. 9 core/modules/workspaces/tests/src/Functional/WorkspaceTest.php
  2. 8.9.x core/modules/workspaces/tests/src/Functional/WorkspaceTest.php
  3. 11.x core/modules/workspaces/tests/src/Functional/WorkspaceTest.php
  4. 11.x core/modules/jsonapi/tests/src/Functional/WorkspaceTest.php

Namespace

Drupal\Tests\jsonapi\Functional

File

core/modules/jsonapi/tests/src/Functional/WorkspaceTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\jsonapi\Functional;

use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Url;
use Drupal\user\Entity\User;
use Drupal\workspaces\Entity\Workspace;

/**
 * JSON:API integration test for the "Workspace" content entity type.
 *
 * @group jsonapi
 * @group #slow
 */
class WorkspaceTest extends ResourceTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'workspaces',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * {@inheritdoc}
   */
  protected static $entityTypeId = 'workspace';
  
  /**
   * {@inheritdoc}
   */
  protected static $resourceTypeName = 'workspace--workspace';
  
  /**
   * {@inheritdoc}
   */
  protected static $resourceTypeIsVersionable = TRUE;
  
  /**
   * {@inheritdoc}
   */
  protected static $patchProtectedFieldNames = [
    'changed' => NULL,
  ];
  
  /**
   * {@inheritdoc}
   */
  protected static $uniqueFieldNames = [
    'id',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected static $firstCreatedEntityId = 'autumn_campaign';
  
  /**
   * {@inheritdoc}
   */
  protected static $secondCreatedEntityId = 'autumn_campaign';
  
  /**
   * {@inheritdoc}
   *
   * @var \Drupal\workspaces\WorkspaceInterface
   */
  protected $entity;
  
  /**
   * {@inheritdoc}
   */
  protected function setUpAuthorization($method) : void {
    switch ($method) {
      case 'GET':
        $this->grantPermissionsToTestedRole([
          'view any workspace',
        ]);
        break;

      case 'POST':
        $this->grantPermissionsToTestedRole([
          'create workspace',
        ]);
        break;

      case 'PATCH':
        $this->grantPermissionsToTestedRole([
          'edit any workspace',
        ]);
        break;

      case 'DELETE':
        $this->grantPermissionsToTestedRole([
          'delete any workspace',
        ]);
        break;

    }
  }
  
  /**
   * {@inheritdoc}
   */
  protected function createEntity() : EntityInterface {
    $entity = Workspace::create([
      'id' => 'campaign',
      'label' => 'Campaign',
      'uid' => $this->account
        ->id(),
      'created' => 123456789,
    ]);
    $entity->save();
    return $entity;
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getExpectedDocument() : array {
    $author = User::load($this->entity
      ->getOwnerId());
    $base_url = Url::fromUri('base:/jsonapi/workspace/workspace/' . $this->entity
      ->uuid())
      ->setAbsolute();
    $self_url = clone $base_url;
    $version_identifier = 'id:' . $this->entity
      ->getRevisionId();
    $self_url = $self_url->setOption('query', [
      'resourceVersion' => $version_identifier,
    ]);
    $version_query_string = '?resourceVersion=' . urlencode($version_identifier);
    return [
      'jsonapi' => [
        'meta' => [
          'links' => [
            'self' => [
              'href' => 'http://jsonapi.org/format/1.0/',
            ],
          ],
        ],
        'version' => '1.0',
      ],
      'links' => [
        'self' => [
          'href' => $base_url->toString(),
        ],
      ],
      'data' => [
        'id' => $this->entity
          ->uuid(),
        'type' => static::$resourceTypeName,
        'links' => [
          'self' => [
            'href' => $self_url->toString(),
          ],
        ],
        'attributes' => [
          'created' => '1973-11-29T21:33:09+00:00',
          'changed' => (new \DateTime())->setTimestamp($this->entity
            ->getChangedTime())
            ->setTimezone(new \DateTimeZone('UTC'))
            ->format(\DateTime::RFC3339),
          'label' => 'Campaign',
          'drupal_internal__id' => 'campaign',
          'drupal_internal__revision_id' => 2,
        ],
        'relationships' => [
          'parent' => [
            'data' => NULL,
            'links' => [
              'related' => [
                'href' => $base_url->toString() . '/parent' . $version_query_string,
              ],
              'self' => [
                'href' => $base_url->toString() . '/relationships/parent' . $version_query_string,
              ],
            ],
          ],
          'uid' => [
            'data' => [
              'id' => $author->uuid(),
              'meta' => [
                'drupal_internal__target_id' => (int) $author->id(),
              ],
              'type' => 'user--user',
            ],
            'links' => [
              'related' => [
                'href' => $base_url->toString() . '/uid' . $version_query_string,
              ],
              'self' => [
                'href' => $base_url->toString() . '/relationships/uid' . $version_query_string,
              ],
            ],
          ],
        ],
      ],
    ];
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getPostDocument() : array {
    return [
      'data' => [
        'type' => static::$resourceTypeName,
        'attributes' => [
          'drupal_internal__id' => 'autumn_campaign',
          'label' => 'Autumn campaign',
        ],
      ],
    ];
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getModifiedEntityForPostTesting() {
    $modified = parent::getModifiedEntityForPostTesting();
    // Even though the field type of the workspace ID is 'string', it acts as a
    // machine name through a custom constraint, so we need to ensure that we
    // generate a proper random value for it.
    // @see \Drupal\workspaces\Entity\Workspace::baseFieldDefinitions()
    $modified['data']['attributes']['id'] = $this->randomMachineName();
    return $modified;
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getPatchDocument() : array {
    $patch_document = parent::getPatchDocument();
    unset($patch_document['data']['attributes']['drupal_internal__id']);
    return $patch_document;
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getExpectedUnauthorizedAccessCacheability() : CacheableMetadata {
    // @see \Drupal\workspaces\WorkspaceAccessControlHandler::checkAccess()
    return parent::getExpectedUnauthorizedAccessCacheability()->addCacheTags([
      'workspace:campaign',
    ])
      ->addCacheContexts([
      'user',
    ]);
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getExpectedUnauthorizedAccessMessage($method) : string {
    switch ($method) {
      case 'GET':
        return "The 'view own workspace' permission is required.";
      case 'POST':
        return "The following permissions are required: 'administer workspaces' OR 'create workspace'.";
      case 'PATCH':
        return "The 'edit own workspace' permission is required.";
      case 'DELETE':
        return "The 'delete own workspace' permission is required.";
      default:
        return parent::getExpectedUnauthorizedAccessMessage($method);
    }
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getSparseFieldSets() : array {
    // Workspace's resource type name ('workspace') comes after the 'uid' field,
    // which breaks nested sparse fieldset tests.
    return array_diff_key(parent::getSparseFieldSets(), array_flip([
      'nested_empty_fieldset',
      'nested_fieldset_with_owner_fieldset',
    ]));
  }

}

Classes

Title Deprecated Summary
WorkspaceTest JSON:API integration test for the "Workspace" content entity type.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.