HalLinkManagerTest.php
Same filename in other branches
Namespace
Drupal\Tests\hal\KernelFile
-
core/
modules/ hal/ tests/ src/ Kernel/ HalLinkManagerTest.php
View source
<?php
namespace Drupal\Tests\hal\Kernel;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Url;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\KernelTests\KernelTestBase;
use Drupal\node\Entity\NodeType;
use Drupal\serialization\Normalizer\CacheableNormalizerInterface;
/**
* @coversDefaultClass \Drupal\hal\LinkManager\LinkManager
* @group hal
* @group legacy
*/
class HalLinkManagerTest extends KernelTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = [
'hal',
'hal_test',
'serialization',
'system',
'node',
'user',
'field',
];
/**
* {@inheritdoc}
*/
protected function setUp() : void {
parent::setUp();
$this->installEntitySchema('node');
NodeType::create([
'type' => 'page',
])->save();
FieldStorageConfig::create([
'entity_type' => 'node',
'type' => 'entity_reference',
'field_name' => 'field_ref',
])->save();
FieldConfig::create([
'entity_type' => 'node',
'bundle' => 'page',
'field_name' => 'field_ref',
])->save();
}
/**
* @covers ::getTypeUri
* @dataProvider providerTestGetTypeUri
*/
public function testGetTypeUri($link_domain, $entity_type, $bundle, array $context, $expected_return, array $expected_context) {
$hal_settings = \Drupal::configFactory()->getEditable('hal.settings');
if ($link_domain === NULL) {
$hal_settings->clear('link_domain');
}
else {
$hal_settings->set('link_domain', $link_domain)
->save(TRUE);
}
/** @var \Drupal\hal\LinkManager\TypeLinkManagerInterface $type_manager */
$type_manager = \Drupal::service('hal.link_manager.type');
$link = $type_manager->getTypeUri($entity_type, $bundle, $context);
$this->assertSame($link, str_replace('BASE_URL/', Url::fromRoute('<front>', [], [
'absolute' => TRUE,
])->toString(), $expected_return));
$this->assertEquals($context, $expected_context);
}
public function providerTestGetTypeUri() {
$serialization_context_collecting_cacheability = [
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY => new CacheableMetadata(),
];
$expected_serialization_context_cacheability_url_site = [
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY => (new CacheableMetadata())->setCacheContexts([
'url.site',
]),
];
$base_test_case = [
'link_domain' => NULL,
'entity_type' => 'node',
'bundle' => 'page',
];
return [
'site URL' => $base_test_case + [
'context' => [],
'link_domain' => NULL,
'expected return' => 'BASE_URL/rest/type/node/page',
'expected context' => [],
],
'site URL, with optional context to collect cacheability metadata' => $base_test_case + [
'context' => $serialization_context_collecting_cacheability,
'expected return' => 'BASE_URL/rest/type/node/page',
'expected context' => $expected_serialization_context_cacheability_url_site,
],
// Test hook_hal_type_uri_alter().
'site URL, with optional context, to test hook_hal_type_uri_alter()' => $base_test_case + [
'context' => [
'hal_test' => TRUE,
],
'expected return' => 'hal_test_type',
'expected context' => [
'hal_test' => TRUE,
],
],
'site URL, with optional context, to test hook_hal_type_uri_alter(), and collecting cacheability metadata' => $base_test_case + [
'context' => [
'hal_test' => TRUE,
] + $serialization_context_collecting_cacheability,
'expected return' => 'hal_test_type',
// No cacheability metadata bubbled.
'expected context' => [
'hal_test' => TRUE,
] + $serialization_context_collecting_cacheability,
],
'configured URL' => [
'link_domain' => 'http://llamas-rock.com/for-real/',
'entity_type' => 'node',
'bundle' => 'page',
'context' => [],
'expected return' => 'http://llamas-rock.com/for-real/rest/type/node/page',
'expected context' => [],
],
'configured URL, with optional context to collect cacheability metadata' => [
'link_domain' => 'http://llamas-rock.com/for-real/',
'entity_type' => 'node',
'bundle' => 'page',
'context' => $serialization_context_collecting_cacheability,
'expected return' => 'http://llamas-rock.com/for-real/rest/type/node/page',
'expected context' => [
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY => (new CacheableMetadata())->setCacheTags([
'config:hal.settings',
]),
],
],
];
}
/**
* @covers ::getRelationUri
* @dataProvider providerTestGetRelationUri
*/
public function testGetRelationUri($link_domain, $entity_type, $bundle, $field_name, array $context, $expected_return, array $expected_context) {
$hal_settings = \Drupal::configFactory()->getEditable('hal.settings');
if ($link_domain === NULL) {
$hal_settings->clear('link_domain');
}
else {
$hal_settings->set('link_domain', $link_domain)
->save(TRUE);
}
/** @var \Drupal\hal\LinkManager\RelationLinkManagerInterface $relation_manager */
$relation_manager = \Drupal::service('hal.link_manager.relation');
$link = $relation_manager->getRelationUri($entity_type, $bundle, $field_name, $context);
$this->assertSame($link, str_replace('BASE_URL/', Url::fromRoute('<front>', [], [
'absolute' => TRUE,
])->toString(), $expected_return));
$this->assertEquals($context, $expected_context);
}
public function providerTestGetRelationUri() {
$serialization_context_collecting_cacheability = [
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY => new CacheableMetadata(),
];
$expected_serialization_context_cacheability_url_site = [
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY => (new CacheableMetadata())->setCacheContexts([
'url.site',
]),
];
$field_name = $this->randomMachineName();
$base_test_case = [
'link_domain' => NULL,
'entity_type' => 'node',
'bundle' => 'page',
'field_name' => $field_name,
];
return [
'site URL' => $base_test_case + [
'context' => [],
'link_domain' => NULL,
'expected return' => 'BASE_URL/rest/relation/node/page/' . $field_name,
'expected context' => [],
],
'site URL, with optional context to collect cacheability metadata' => $base_test_case + [
'context' => $serialization_context_collecting_cacheability,
'expected return' => 'BASE_URL/rest/relation/node/page/' . $field_name,
'expected context' => $expected_serialization_context_cacheability_url_site,
],
// Test hook_hal_relation_uri_alter().
'site URL, with optional context, to test hook_hal_relation_uri_alter()' => $base_test_case + [
'context' => [
'hal_test' => TRUE,
],
'expected return' => 'hal_test_relation',
'expected context' => [
'hal_test' => TRUE,
],
],
'site URL, with optional context, to test hook_hal_relation_uri_alter(), and collecting cacheability metadata' => $base_test_case + [
'context' => [
'hal_test' => TRUE,
] + $serialization_context_collecting_cacheability,
'expected return' => 'hal_test_relation',
// No cacheability metadata bubbled.
'expected context' => [
'hal_test' => TRUE,
] + $serialization_context_collecting_cacheability,
],
'configured URL' => [
'link_domain' => 'http://llamas-rock.com/for-real/',
'entity_type' => 'node',
'bundle' => 'page',
'field_name' => $field_name,
'context' => [],
'expected return' => 'http://llamas-rock.com/for-real/rest/relation/node/page/' . $field_name,
'expected context' => [],
],
'configured URL, with optional context to collect cacheability metadata' => [
'link_domain' => 'http://llamas-rock.com/for-real/',
'entity_type' => 'node',
'bundle' => 'page',
'field_name' => $field_name,
'context' => $serialization_context_collecting_cacheability,
'expected return' => 'http://llamas-rock.com/for-real/rest/relation/node/page/' . $field_name,
'expected context' => [
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY => (new CacheableMetadata())->setCacheTags([
'config:hal.settings',
]),
],
],
];
}
/**
* @covers ::getRelationInternalIds
*/
public function testGetRelationInternalIds() {
/** @var \Drupal\hal\LinkManager\RelationLinkManagerInterface $relation_manager */
$relation_manager = \Drupal::service('hal.link_manager.relation');
$link = $relation_manager->getRelationUri('node', 'page', 'field_ref');
$internal_ids = $relation_manager->getRelationInternalIds($link);
$this->assertEquals([
'entity_type_id' => 'node',
'bundle' => 'page',
'field_name' => 'field_ref',
], $internal_ids);
}
/**
* @covers ::setLinkDomain
*/
public function testHalLinkManagersSetLinkDomain() {
$serialization_context = [
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY => new CacheableMetadata(),
];
/** @var \Drupal\hal\LinkManager\LinkManager $link_manager */
$link_manager = \Drupal::service('hal.link_manager');
/** @var \Drupal\hal\LinkManager\TypeLinkManager $type_link_manager */
$type_link_manager = \Drupal::service('hal.link_manager.type');
/** @var \Drupal\hal\LinkManager\RelationLinkManager $relation_link_manager */
$relation_link_manager = \Drupal::service('hal.link_manager.relation');
// One Drupal installation can serve multiple domains, protocols or ports.
foreach ([
'http://example.com/',
'https://example.com/',
'https://example.com:443/',
'http://drupal.org/',
] as $domain) {
$link_manager->setLinkDomain($domain);
$link = $link_manager->getTypeUri('node', 'page', $serialization_context);
$this->assertEquals($domain . 'rest/type/node/page', $link);
$this->assertEquals($serialization_context[CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY], new CacheableMetadata());
$type_ids = $type_link_manager->getTypeInternalIds($link, $serialization_context);
$this->assertEquals([
'entity_type' => 'node',
'bundle' => 'page',
], $type_ids);
$link = $link_manager->getRelationUri('node', 'page', 'field_ref', $serialization_context);
$this->assertEquals($domain . 'rest/relation/node/page/field_ref', $link);
$this->assertEquals($serialization_context[CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY], new CacheableMetadata());
$relation_ids = $relation_link_manager->getRelationInternalIds($link, $serialization_context);
$this->assertEquals([
'entity_type_id' => 'node',
'bundle' => 'page',
'field_name' => 'field_ref',
], $relation_ids);
}
}
}
Classes
Title | Deprecated | Summary |
---|---|---|
HalLinkManagerTest | @coversDefaultClass \Drupal\hal\LinkManager\LinkManager @group hal @group legacy |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.