Issue #2843752 by arshadcn, Wim Leers: EntityResource: Provide comprehensive test coverage for Item entity
parent
e1524ff3e1
commit
8419d5e2eb
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\hal\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\Tests\rest\Functional\AnonResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group hal
|
||||||
|
*/
|
||||||
|
class ItemHalJsonAnonTest extends ItemHalJsonTestBase {
|
||||||
|
|
||||||
|
use AnonResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = ['hal'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $format = 'hal_json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $mimeType = 'application/hal+json';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\hal\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\Tests\rest\Functional\BasicAuthResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group hal
|
||||||
|
*/
|
||||||
|
class ItemHalJsonBasicAuthTest extends ItemHalJsonTestBase {
|
||||||
|
|
||||||
|
use BasicAuthResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = ['hal', 'basic_auth'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $format = 'hal_json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $mimeType = 'application/hal+json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $auth = 'basic_auth';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\hal\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\Tests\rest\Functional\CookieResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group hal
|
||||||
|
*/
|
||||||
|
class ItemHalJsonCookieTest extends ItemHalJsonTestBase {
|
||||||
|
|
||||||
|
use CookieResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = ['hal'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $format = 'hal_json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $mimeType = 'application/hal+json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $auth = 'cookie';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\hal\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\aggregator\Entity\Feed;
|
||||||
|
use Drupal\Tests\hal\Functional\EntityResource\HalEntityNormalizationTrait;
|
||||||
|
use Drupal\Tests\rest\Functional\AnonResourceTestTrait;
|
||||||
|
use Drupal\Tests\rest\Functional\EntityResource\Item\ItemResourceTestBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ResourceTestBase for Item entity.
|
||||||
|
*/
|
||||||
|
abstract class ItemHalJsonTestBase extends ItemResourceTestBase {
|
||||||
|
|
||||||
|
use HalEntityNormalizationTrait;
|
||||||
|
use AnonResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = ['hal'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $format = 'hal_json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $mimeType = 'application/hal+json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getExpectedNormalizedEntity() {
|
||||||
|
$default_normalization = parent::getExpectedNormalizedEntity();
|
||||||
|
$normalization = $this->applyHalFieldNormalization($default_normalization);
|
||||||
|
$feed = Feed::load($this->entity->getFeedId());
|
||||||
|
|
||||||
|
return $normalization + [
|
||||||
|
'_embedded' => [
|
||||||
|
$this->baseUrl . '/rest/relation/aggregator_item/aggregator_item/fid' => [
|
||||||
|
[
|
||||||
|
'_links' => [
|
||||||
|
'self' => [
|
||||||
|
'href' => $this->baseUrl . '/aggregator/sources/1?_format=hal_json',
|
||||||
|
],
|
||||||
|
'type' => [
|
||||||
|
'href' => $this->baseUrl . '/rest/type/aggregator_feed/aggregator_feed',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'uuid' => [
|
||||||
|
[
|
||||||
|
'value' => $feed->uuid(),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'_links' => [
|
||||||
|
'self' => [
|
||||||
|
'href' => '',
|
||||||
|
],
|
||||||
|
'type' => [
|
||||||
|
'href' => $this->baseUrl . '/rest/type/aggregator_item/aggregator_item',
|
||||||
|
],
|
||||||
|
$this->baseUrl . '/rest/relation/aggregator_item/aggregator_item/fid' => [
|
||||||
|
[
|
||||||
|
'href' => $this->baseUrl . '/aggregator/sources/' . $feed->id() . '?_format=hal_json',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getNormalizedPostEntity() {
|
||||||
|
return parent::getNormalizedPostEntity() + [
|
||||||
|
'_links' => [
|
||||||
|
'type' => [
|
||||||
|
'href' => $this->baseUrl . '/rest/type/aggregator_item/aggregator_item',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getExpectedCacheContexts() {
|
||||||
|
return [
|
||||||
|
'url.site',
|
||||||
|
'user.permissions',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -695,8 +695,11 @@ abstract class EntityResourceTestBase extends ResourceTestBase {
|
||||||
|
|
||||||
|
|
||||||
// DX: 422 when invalid entity: UUID field too long.
|
// DX: 422 when invalid entity: UUID field too long.
|
||||||
$response = $this->request('POST', $url, $request_options);
|
// @todo Fix this in https://www.drupal.org/node/2149851.
|
||||||
$this->assertResourceErrorResponse(422, "Unprocessable Entity: validation failed.\nuuid.0.value: UUID: may not be longer than 128 characters.\n", $response);
|
if ($this->entity->getEntityType()->hasKey('uuid')) {
|
||||||
|
$response = $this->request('POST', $url, $request_options);
|
||||||
|
$this->assertResourceErrorResponse(422, "Unprocessable Entity: validation failed.\nuuid.0.value: UUID: may not be longer than 128 characters.\n", $response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$request_options[RequestOptions::BODY] = $parseable_invalid_request_body_3;
|
$request_options[RequestOptions::BODY] = $parseable_invalid_request_body_3;
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\rest\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\Tests\rest\Functional\AnonResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group rest
|
||||||
|
*/
|
||||||
|
class ItemJsonAnonTest extends ItemResourceTestBase {
|
||||||
|
|
||||||
|
use AnonResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $format = 'json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $mimeType = 'application/json';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\rest\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\Tests\rest\Functional\BasicAuthResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group rest
|
||||||
|
*/
|
||||||
|
class ItemJsonBasicAuthTest extends ItemResourceTestBase {
|
||||||
|
|
||||||
|
use BasicAuthResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = ['basic_auth'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $format = 'json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $mimeType = 'application/json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $auth = 'basic_auth';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\rest\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\Tests\rest\Functional\CookieResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group rest
|
||||||
|
*/
|
||||||
|
class ItemJsonCookieTest extends ItemResourceTestBase {
|
||||||
|
|
||||||
|
use CookieResourceTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $format = 'json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $mimeType = 'application/json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $auth = 'cookie';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,177 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\rest\Functional\EntityResource\Item;
|
||||||
|
|
||||||
|
use Drupal\aggregator\Entity\Feed;
|
||||||
|
use Drupal\aggregator\Entity\Item;
|
||||||
|
use Drupal\Tests\rest\Functional\EntityResource\EntityResourceTestBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ResourceTestBase for Item entity.
|
||||||
|
*/
|
||||||
|
abstract class ItemResourceTestBase extends EntityResourceTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = ['aggregator'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $entityTypeId = 'aggregator_item';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $patchProtectedFieldNames = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Item entity.
|
||||||
|
*
|
||||||
|
* @var \Drupal\aggregator\ItemInterface
|
||||||
|
*/
|
||||||
|
protected $entity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setUpAuthorization($method) {
|
||||||
|
switch ($method) {
|
||||||
|
case 'GET':
|
||||||
|
$this->grantPermissionsToTestedRole(['access news feeds']);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'POST':
|
||||||
|
case 'PATCH':
|
||||||
|
case 'DELETE':
|
||||||
|
$this->grantPermissionsToTestedRole(['administer news feeds']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function createEntity() {
|
||||||
|
// Create a "Camelids" feed.
|
||||||
|
$feed = Feed::create([
|
||||||
|
'title' => 'Camelids',
|
||||||
|
'url' => 'https://groups.drupal.org/not_used/167169',
|
||||||
|
'refresh' => 900,
|
||||||
|
'checked' => 1389919932,
|
||||||
|
'description' => 'Drupal Core Group feed',
|
||||||
|
]);
|
||||||
|
$feed->save();
|
||||||
|
|
||||||
|
// Create a "Llama" item.
|
||||||
|
$item = Item::create();
|
||||||
|
$item->setTitle('Llama')
|
||||||
|
->setFeedId($feed->id())
|
||||||
|
->setLink('https://www.drupal.org/')
|
||||||
|
->setPostedTime(123456789)
|
||||||
|
->save();
|
||||||
|
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getExpectedNormalizedEntity() {
|
||||||
|
$feed = Feed::load($this->entity->getFeedId());
|
||||||
|
|
||||||
|
return [
|
||||||
|
'iid' => [
|
||||||
|
[
|
||||||
|
'value' => 1,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'langcode' => [
|
||||||
|
[
|
||||||
|
'value' => 'en',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'fid' => [
|
||||||
|
[
|
||||||
|
'target_id' => 1,
|
||||||
|
'target_type' => 'aggregator_feed',
|
||||||
|
'target_uuid' => $feed->uuid(),
|
||||||
|
'url' => base_path() . 'aggregator/sources/1',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'title' => [
|
||||||
|
[
|
||||||
|
'value' => 'Llama',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'link' => [
|
||||||
|
[
|
||||||
|
'value' => 'https://www.drupal.org/',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'author' => [],
|
||||||
|
'description' => [],
|
||||||
|
'timestamp' => [
|
||||||
|
[
|
||||||
|
'value' => 123456789,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'guid' => [],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getNormalizedPostEntity() {
|
||||||
|
return [
|
||||||
|
'fid' => [
|
||||||
|
[
|
||||||
|
'target_id' => 1,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'title' => [
|
||||||
|
[
|
||||||
|
'value' => 'Llama',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'link' => [
|
||||||
|
[
|
||||||
|
'value' => 'https://www.drupal.org/',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getExpectedCacheContexts() {
|
||||||
|
// @see ::createEntity()
|
||||||
|
return ['user.permissions'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getExpectedUnauthorizedAccessMessage($method) {
|
||||||
|
if ($this->config('rest.settings')->get('bc_entity_resource_permissions')) {
|
||||||
|
return parent::getExpectedUnauthorizedAccessMessage($method);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($method) {
|
||||||
|
case 'GET':
|
||||||
|
return "The 'access news feeds' permission is required.";
|
||||||
|
|
||||||
|
case 'POST':
|
||||||
|
case 'PATCH':
|
||||||
|
case 'DELETE':
|
||||||
|
return "The 'administer news feeds' permission is required.";
|
||||||
|
|
||||||
|
default:
|
||||||
|
return parent::getExpectedUnauthorizedAccessMessage($method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue