jsonapi-8.x-2.x-dev/tests/src/Kernel/ResourceType/RelatedResourceTypesTest.php
tests/src/Kernel/ResourceType/RelatedResourceTypesTest.php
<?php
namespace Drupal\Tests\jsonapi\Kernel\ResourceType;
use Drupal\Tests\jsonapi\Kernel\JsonapiKernelTestBase;
use Drupal\node\Entity\NodeType;
/**
* @coversDefaultClass \Drupal\jsonapi\ResourceType\ResourceType
* @coversClass \Drupal\jsonapi\ResourceType\ResourceTypeRepository
* @group jsonapi
*
* @internal
*/
class RelatedResourceTypesTest extends JsonapiKernelTestBase {
/**
* {@inheritdoc}
*/
public static $modules = [
'node',
'jsonapi',
'serialization',
'system',
'user',
'field',
];
/**
* The JSON:API resource type repository under test.
*
* @var \Drupal\jsonapi\ResourceType\ResourceTypeRepository
*/
protected $resourceTypeRepository;
/**
* The JSON:API resource type for `node--foo`.
*
* @var \Drupal\jsonapi\ResourceType\ResourceType
*/
protected $fooType;
/**
* The JSON:API resource type for `node--bar`.
*
* @var \Drupal\jsonapi\ResourceType\ResourceType
*/
protected $barType;
/**
* {@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']);
NodeType::create([
'type' => 'foo',
])->save();
NodeType::create([
'type' => 'bar',
])->save();
$this->createEntityReferenceField(
'node',
'foo',
'field_ref_bar',
'Bar Reference',
'node',
'default',
['target_bundles' => ['bar']]
);
$this->createEntityReferenceField(
'node',
'foo',
'field_ref_foo',
'Foo Reference',
'node',
'default',
// Important to test self-referencing resource types.
['target_bundles' => ['foo']]
);
$this->createEntityReferenceField(
'node',
'foo',
'field_ref_any',
'Any Bundle Reference',
'node',
'default',
// This should result in a reference to any bundle.
['target_bundles' => NULL]
);
$this->resourceTypeRepository = $this->container->get('jsonapi.resource_type.repository');
}
/**
* @covers ::getRelatableResourceTypes
* @dataProvider getRelatableResourceTypesProvider
*/
public function testGetRelatableResourceTypes($resource_type_name, $relatable_type_names) {
// We're only testing the fields that we set up.
$test_fields = [
'field_ref_foo',
'field_ref_bar',
'field_ref_any',
];
$resource_type = $this->resourceTypeRepository->getByTypeName($resource_type_name);
// This extracts just the relationship fields under test.
$subjects = array_intersect_key(
$resource_type->getRelatableResourceTypes(),
array_flip($test_fields)
);
// Map the related resource type to their type name so we can just compare
// the type names rather that the whole object.
foreach ($test_fields as $field_name) {
if (isset($subjects[$field_name])) {
$subjects[$field_name] = array_map(function ($resource_type) {
return $resource_type->getTypeName();
}, $subjects[$field_name]);
}
}
$this->assertArraySubset($relatable_type_names, $subjects);
}
/**
* @covers ::getRelatableResourceTypes
* @dataProvider getRelatableResourceTypesProvider
*/
public function getRelatableResourceTypesProvider() {
return [
[
'node--foo',
[
'field_ref_foo' => ['node--foo'],
'field_ref_bar' => ['node--bar'],
'field_ref_any' => ['node--foo', 'node--bar'],
],
],
['node--bar', []],
];
}
/**
* @covers ::getRelatableResourceTypesByField
* @dataProvider getRelatableResourceTypesByFieldProvider
*/
public function testGetRelatableResourceTypesByField($entity_type_id, $bundle, $field) {
$resource_type = $this->resourceTypeRepository->get($entity_type_id, $bundle);
$relatable_types = $resource_type->getRelatableResourceTypes();
$this->assertSame(
$relatable_types[$field],
$resource_type->getRelatableResourceTypesByField($field)
);
}
/**
* Provides cases to test getRelatableTypesByField.
*/
public function getRelatableResourceTypesByFieldProvider() {
return [
['node', 'foo', 'field_ref_foo'],
['node', 'foo', 'field_ref_bar'],
['node', 'foo', 'field_ref_any'],
];
}
}
