VersionNegotiatorTest.php

Same filename in other branches
  1. 8.9.x core/modules/jsonapi/tests/src/Kernel/Revisions/VersionNegotiatorTest.php
  2. 10 core/modules/jsonapi/tests/src/Kernel/Revisions/VersionNegotiatorTest.php
  3. 11.x core/modules/jsonapi/tests/src/Kernel/Revisions/VersionNegotiatorTest.php

Namespace

Drupal\Tests\jsonapi\Kernel\Revisions

File

core/modules/jsonapi/tests/src/Kernel/Revisions/VersionNegotiatorTest.php

View source
<?php

namespace Drupal\Tests\jsonapi\Kernel\Revisions;

use Drupal\Core\Http\Exception\CacheableBadRequestHttpException;
use Drupal\Core\Http\Exception\CacheableNotFoundHttpException;
use Drupal\jsonapi\Revisions\VersionById;
use Drupal\jsonapi\Revisions\VersionByRel;
use Drupal\jsonapi\Revisions\VersionNegotiator;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\Tests\jsonapi\Kernel\JsonapiKernelTestBase;
use Drupal\user\Entity\User;

/**
 * The test class for version negotiators.
 *
 * @coversDefaultClass \Drupal\jsonapi\Revisions\VersionNegotiator
 * @group jsonapi
 *
 * @internal
 */
class VersionNegotiatorTest extends JsonapiKernelTestBase {
    
    /**
     * The user.
     *
     * @var \Drupal\user\Entity\User
     */
    protected $user;
    
    /**
     * The node.
     *
     * @var \Drupal\node\Entity\Node
     */
    protected $node;
    
    /**
     * The previous revision ID of $node.
     *
     * @var string
     */
    protected $nodePreviousRevisionId;
    
    /**
     * The version negotiator service.
     *
     * @var \Drupal\jsonapi\Revisions\VersionNegotiator
     */
    protected $versionNegotiator;
    
    /**
     * The other node.
     *
     * @var \Drupal\node\Entity\Node
     */
    protected $node2;
    protected static $modules = [
        'node',
        'field',
        'jsonapi',
        'serialization',
        'system',
        'user',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        // Add the entity schemas.
        $this->installEntitySchema('node');
        $this->installEntitySchema('user');
        // Add the additional table schemas.
        $this->installSchema('system', [
            'sequences',
        ]);
        $this->installSchema('node', [
            'node_access',
        ]);
        $this->installSchema('user', [
            'users_data',
        ]);
        $type = NodeType::create([
            'type' => 'dummy',
            'new_revision' => TRUE,
        ]);
        $type->save();
        $this->user = User::create([
            'name' => 'user1',
            'mail' => 'user@localhost',
            'status' => 1,
        ]);
        $this->user
            ->save();
        $this->node = Node::create([
            'title' => 'dummy_title',
            'type' => 'dummy',
            'uid' => $this->user
                ->id(),
        ]);
        $this->node
            ->save();
        $this->nodePreviousRevisionId = $this->node
            ->getRevisionId();
        $this->node
            ->setNewRevision();
        $this->node
            ->setTitle('revised_dummy_title');
        $this->node
            ->save();
        $this->node2 = Node::create([
            'type' => 'dummy',
            'title' => 'Another test node',
            'uid' => $this->user
                ->id(),
        ]);
        $this->node2
            ->save();
        $entity_type_manager = \Drupal::entityTypeManager();
        $version_negotiator = new VersionNegotiator();
        $version_negotiator->addVersionNegotiator(new VersionById($entity_type_manager), 'id');
        $version_negotiator->addVersionNegotiator(new VersionByRel($entity_type_manager), 'rel');
        $this->versionNegotiator = $version_negotiator;
    }
    
    /**
     * @covers \Drupal\jsonapi\Revisions\VersionById::getRevision
     */
    public function testOldRevision() {
        $revision = $this->versionNegotiator
            ->getRevision($this->node, 'id:' . $this->nodePreviousRevisionId);
        $this->assertEquals($this->node
            ->id(), $revision->id());
        $this->assertEquals($this->nodePreviousRevisionId, $revision->getRevisionId());
    }
    
    /**
     * @covers \Drupal\jsonapi\Revisions\VersionById::getRevision
     */
    public function testInvalidRevisionId() {
        $this->expectException(CacheableNotFoundHttpException::class);
        $this->expectExceptionMessage(sprintf('The requested version, identified by `id:%s`, could not be found.', $this->node2
            ->getRevisionId()));
        $this->versionNegotiator
            ->getRevision($this->node, 'id:' . $this->node2
            ->getRevisionId());
    }
    
    /**
     * @covers \Drupal\jsonapi\Revisions\VersionByRel::getRevision
     */
    public function testLatestVersion() {
        $revision = $this->versionNegotiator
            ->getRevision($this->node, 'rel:' . VersionByRel::LATEST_VERSION);
        $this->assertEquals($this->node
            ->id(), $revision->id());
        $this->assertEquals($this->node
            ->getRevisionId(), $revision->getRevisionId());
    }
    
    /**
     * @covers \Drupal\jsonapi\Revisions\VersionByRel::getRevision
     */
    public function testCurrentVersion() {
        $revision = $this->versionNegotiator
            ->getRevision($this->node, 'rel:' . VersionByRel::WORKING_COPY);
        $this->assertEquals($this->node
            ->id(), $revision->id());
        $this->assertEquals($this->node
            ->id(), $revision->id());
        $this->assertEquals($this->node
            ->getRevisionId(), $revision->getRevisionId());
    }
    
    /**
     * @covers \Drupal\jsonapi\Revisions\VersionByRel::getRevision
     */
    public function testInvalidRevisionRel() {
        $this->expectException(CacheableBadRequestHttpException::class);
        $this->expectExceptionMessage('An invalid resource version identifier, `rel:erroneous-revision-name`, was provided.');
        $this->versionNegotiator
            ->getRevision($this->node, 'rel:erroneous-revision-name');
    }

}

Classes

Title Deprecated Summary
VersionNegotiatorTest The test class for version negotiators.

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