jsonapi-8.x-2.x-dev/tests/src/Kernel/Revisions/VersionNegotiatorTest.php
tests/src/Kernel/Revisions/VersionNegotiatorTest.php
<?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;
public static $modules = [
'node',
'field',
'jsonapi',
'serialization',
'system',
'user',
];
/**
* Initialization tasks for the test.
*
* @inheritdoc
*/
protected function setUp() {
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->setExpectedException(CacheableNotFoundHttpException::class, 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->setExpectedException(CacheableBadRequestHttpException::class, 'An invalid resource version identifier, `rel:erroneous-revision-name`, was provided.');
$this->versionNegotiator->getRevision($this->node, 'rel:erroneous-revision-name');
}
}
