View source
<?php
namespace Drupal\field\Tests\EntityReference;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\filter\Entity\FilterFormat;
use Drupal\system\Tests\Entity\EntityUnitTestBase;
use Drupal\user\Entity\Role;
use Drupal\user\RoleInterface;
class EntityReferenceFormatterTest extends EntityUnitTestBase {
use EntityReferenceTestTrait;
protected $entityType = 'entity_test';
protected $bundle = 'entity_test';
protected $fieldName = 'field_test';
protected $referencedEntity;
protected $unsavedReferencedEntity;
protected function setUp() {
parent::setUp();
\Drupal::service('theme_handler')
->install([
'classy',
]);
$this
->config('system.theme')
->set('default', 'classy')
->save();
$this
->installConfig(array(
'user',
));
Role::load(RoleInterface::ANONYMOUS_ID)
->grantPermission('view test entity')
->save();
$this
->installSchema('system', 'router');
$this->container
->get('router.builder')
->rebuild();
$this
->createEntityReferenceField($this->entityType, $this->bundle, $this->fieldName, 'Field test', $this->entityType, 'default', array(), FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
entity_create('field_storage_config', array(
'field_name' => 'body',
'entity_type' => $this->entityType,
'type' => 'text',
'settings' => array(),
))
->save();
entity_create('field_config', array(
'entity_type' => $this->entityType,
'bundle' => $this->bundle,
'field_name' => 'body',
'label' => 'Body',
))
->save();
entity_get_display($this->entityType, $this->bundle, 'default')
->setComponent('body', array(
'type' => 'text_default',
'settings' => array(),
))
->save();
entity_create('filter_format', array(
'format' => 'full_html',
'name' => 'Full HTML',
))
->save();
$this->referencedEntity = entity_create($this->entityType, array(
'name' => $this
->randomMachineName(),
));
$this->referencedEntity->body = array(
'value' => '<p>Hello, world!</p>',
'format' => 'full_html',
);
$this->referencedEntity
->save();
$this->unsavedReferencedEntity = entity_create($this->entityType, array(
'name' => $this
->randomMachineName(),
));
$this->unsavedReferencedEntity->body = array(
'value' => '<p>Hello, unsaved world!</p>',
'format' => 'full_html',
);
}
public function testAccess() {
Role::load(RoleInterface::ANONYMOUS_ID)
->revokePermission('view test entity')
->save();
$field_name = $this->fieldName;
$referencing_entity = entity_create($this->entityType, array(
'name' => $this
->randomMachineName(),
));
$referencing_entity
->save();
$referencing_entity->{$field_name}->entity = $this->referencedEntity;
$this
->assertFalse($this->referencedEntity
->access('view'), 'Current user does not have access to view the referenced entity.');
$formatter_manager = $this->container
->get('plugin.manager.field.formatter');
foreach ($formatter_manager
->getOptions('entity_reference') as $formatter => $name) {
entity_get_display($this->entityType, $this->bundle, 'default')
->setComponent($field_name, array(
'type' => $formatter,
))
->save();
entity_view($referencing_entity, 'default');
$this
->assertEqual($referencing_entity->{$field_name}->target_id, $this->referencedEntity
->id(), format_string('The un-accessible item still exists after @name formatter was executed.', array(
'@name' => $name,
)));
}
}
public function testIdFormatter() {
$formatter = 'entity_reference_entity_id';
$build = $this
->buildRenderArray([
$this->referencedEntity,
$this->unsavedReferencedEntity,
], $formatter);
$this
->assertEqual($build[0]['#plain_text'], $this->referencedEntity
->id(), sprintf('The markup returned by the %s formatter is correct for an item with a saved entity.', $formatter));
$this
->assertEqual($build[0]['#cache']['tags'], $this->referencedEntity
->getCacheTags(), sprintf('The %s formatter has the expected cache tags.', $formatter));
$this
->assertTrue(!isset($build[1]), sprintf('The markup returned by the %s formatter is correct for an item with a unsaved entity.', $formatter));
}
public function testEntityFormatter() {
$renderer = $this->container
->get('renderer');
$formatter = 'entity_reference_entity_view';
$build = $this
->buildRenderArray([
$this->referencedEntity,
$this->unsavedReferencedEntity,
], $formatter);
$expected_rendered_name_field_1 = '
<div class="field field--name-name field--type-string field--label-hidden field__item">' . $this->referencedEntity
->label() . '</div>
';
$expected_rendered_body_field_1 = '
<div class="clearfix text-formatted field field--name-body field--type-text field--label-above">
<div class="field__label">Body</div>
<div class="field__item"><p>Hello, world!</p></div>
</div>
';
$renderer
->renderRoot($build[0]);
$this
->assertEqual($build[0]['#markup'], 'default | ' . $this->referencedEntity
->label() . $expected_rendered_name_field_1 . $expected_rendered_body_field_1, sprintf('The markup returned by the %s formatter is correct for an item with a saved entity.', $formatter));
$expected_cache_tags = Cache::mergeTags(\Drupal::entityManager()
->getViewBuilder($this->entityType)
->getCacheTags(), $this->referencedEntity
->getCacheTags());
$expected_cache_tags = Cache::mergeTags($expected_cache_tags, FilterFormat::load('full_html')
->getCacheTags());
$this
->assertEqual($build[0]['#cache']['tags'], $expected_cache_tags, format_string('The @formatter formatter has the expected cache tags.', array(
'@formatter' => $formatter,
)));
$renderer
->renderRoot($build[1]);
$this
->assertEqual($build[1]['#markup'], $this->unsavedReferencedEntity
->label(), sprintf('The markup returned by the %s formatter is correct for an item with a unsaved entity.', $formatter));
}
public function testLabelFormatter() {
$renderer = $this->container
->get('renderer');
$formatter = 'entity_reference_label';
$build = $this
->buildRenderArray([
$this->referencedEntity,
$this->unsavedReferencedEntity,
], $formatter);
$expected_field_cacheability = [
'contexts' => [],
'tags' => [],
'max-age' => Cache::PERMANENT,
];
$this
->assertEqual($build['#cache'], $expected_field_cacheability, 'The field render array contains the entity access cacheability metadata');
$expected_item_1 = array(
'#type' => 'link',
'#title' => $this->referencedEntity
->label(),
'#url' => $this->referencedEntity
->urlInfo(),
'#options' => $this->referencedEntity
->urlInfo()
->getOptions(),
'#cache' => array(
'contexts' => [
'user.permissions',
],
'tags' => $this->referencedEntity
->getCacheTags(),
),
);
$this
->assertEqual($renderer
->renderRoot($build[0]), $renderer
->renderRoot($expected_item_1), sprintf('The markup returned by the %s formatter is correct for an item with a saved entity.', $formatter));
$this
->assertEqual(CacheableMetadata::createFromRenderArray($build[0]), CacheableMetadata::createFromRenderArray($expected_item_1));
$expected_item_2 = array(
'#plain_text' => $this->unsavedReferencedEntity
->label(),
'#cache' => array(
'contexts' => [
'user.permissions',
],
'tags' => $this->unsavedReferencedEntity
->getCacheTags(),
'max-age' => Cache::PERMANENT,
),
);
$this
->assertEqual($build[1], $expected_item_2, sprintf('The render array returned by the %s formatter is correct for an item with a unsaved entity.', $formatter));
$build = $this
->buildRenderArray([
$this->referencedEntity,
$this->unsavedReferencedEntity,
], $formatter, array(
'link' => FALSE,
));
$this
->assertEqual($build[0]['#plain_text'], $this->referencedEntity
->label(), sprintf('The markup returned by the %s formatter is correct for an item with a saved entity.', $formatter));
$this
->assertEqual($build[1]['#plain_text'], $this->unsavedReferencedEntity
->label(), sprintf('The markup returned by the %s formatter is correct for an item with a unsaved entity.', $formatter));
$field_storage_config = FieldStorageConfig::loadByName($this->entityType, $this->fieldName);
$field_storage_config
->setSetting('target_type', 'entity_test_label');
$field_storage_config
->save();
$referenced_entity_with_no_link_template = entity_create('entity_test_label', array(
'name' => $this
->randomMachineName(),
));
$referenced_entity_with_no_link_template
->save();
$build = $this
->buildRenderArray([
$referenced_entity_with_no_link_template,
], $formatter, array(
'link' => TRUE,
));
$this
->assertEqual($build[0]['#plain_text'], $referenced_entity_with_no_link_template
->label(), sprintf('The markup returned by the %s formatter is correct for an entity type with no valid link template.', $formatter));
}
protected function buildRenderArray(array $referenced_entities, $formatter, $formatter_options = array()) {
$referencing_entity = entity_create($this->entityType, array(
'name' => $this
->randomMachineName(),
));
$items = $referencing_entity
->get($this->fieldName);
foreach ($referenced_entities as $referenced_entity) {
$items[] = [
'entity' => $referenced_entity,
];
}
return $items
->view(array(
'type' => $formatter,
'settings' => $formatter_options,
));
}
}