depcalc-8.x-1.x-dev/tests/src/Kernel/EventSubscriber/DependencyCollector/EntityEmbedCollectorTest.php
tests/src/Kernel/EventSubscriber/DependencyCollector/EntityEmbedCollectorTest.php
<?php namespace Drupal\Tests\depcalc\Kernel\EventSubscriber\DependencyCollector; use Drupal\Component\Utility\Html; use Drupal\depcalc\DependencyStack; use Drupal\depcalc\DependentEntityWrapper; use Drupal\KernelTests\KernelTestBase; use Drupal\Tests\node\Traits\ContentTypeCreationTrait; use Drupal\Tests\node\Traits\NodeCreationTrait; use Drupal\Tests\user\Traits\UserCreationTrait; /** * The EntityEmbedCollectorTest class. * * @requires module entity_embed * * @group depcalc * * @package Drupal\Tests\depcalc\Kernel\EventSubscriber\DependencyCollector */ class EntityEmbedCollectorTest extends KernelTestBase { use NodeCreationTrait; use UserCreationTrait; use ContentTypeCreationTrait; /** * The UUID to use for the embedded entity. * * @var string */ const EMBEDDED_ENTITY_UUID = 'e7a3e1fe-b69b-417e-8ee4-c80cb7640e63'; /** * The UUID to use for the embedded entity. * * @var string */ const EMBEDDED_ENTITY_UUID_2 = 'f3548e06-eb82-4c04-8499-3eb886da8f34'; /** * Calculates all the dependencies of a given entity. * * @var \Drupal\depcalc\DependencyCalculator */ private $calculator; /** * {@inheritdoc} */ protected static $modules = [ 'node', 'system', 'field', 'filter', 'text', 'user', 'depcalc', 'embed', 'entity_embed', 'path_alias', ]; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->installEntitySchema('path_alias'); $this->installEntitySchema('node'); $this->installEntitySchema('user'); $this->installConfig('filter'); $this->installConfig('node'); // Create a user with required permissions. Ensure that we don't use user 1 // because that user is treated in special ways by access control handlers. $user = $this->createUser( [ 'access content', ] ); $this->container->set('current_user', $user); // Create a sample node to be embedded. $this->createContentType(['type' => 'page', 'name' => 'Basic page']); $this->createNode( [ 'title' => 'Embed Test Node', 'uuid' => static::EMBEDDED_ENTITY_UUID, ] ); $this->createNode( [ 'title' => 'Embed Test Node 2', 'uuid' => static::EMBEDDED_ENTITY_UUID_2, ] ); $this->calculator = \Drupal::service('entity.dependency.calculator'); } /** * Test dependency calculation. * * Checks the node's dependencies contains embedded entities. * * @param array $embed_attributes * Attributes to add for the embedded entity. * * @dataProvider providerTestExtractEmbeddedEntities */ public function testExtractEmbeddedEntities(array $embed_attributes) { $embed_code = ''; foreach ($embed_attributes as $embed_attribute) { $embed_code .= $this->createEmbedCode($embed_attribute); } $node = $this->createNode( [ 'body' => [ [ 'value' => $embed_code, 'format' => filter_default_format(), ], ], ] ); try { $wrapper = new DependentEntityWrapper($node); } catch (\Exception $exception) { $this->markTestIncomplete($exception->getMessage()); } $dependencies = $this->calculator->calculateDependencies($wrapper, new DependencyStack()); foreach ($embed_attributes as $embed_attribute) { $this->assertArrayHasKey($embed_attribute['data-entity-uuid'], $dependencies); } } /** * Gets an embed code with given attributes. * * @param array $attributes * The attributes to add. * * @return string * A string containing a drupal-entity dom element. * * @see EntityEmbedFilterTestBase::createEmbedCode() */ protected function createEmbedCode(array $attributes): string { $dom = Html::load('<drupal-entity>This placeholder should not be rendered.</drupal-entity>'); $xpath = new \DOMXPath($dom); $drupal_entity = $xpath->query('//drupal-entity')[0]; foreach ($attributes as $attribute => $value) { $drupal_entity->setAttribute($attribute, $value); } return Html::serialize($dom); } /** * Data provider for testExtractEmbeddedEntities(). */ public static function providerTestExtractEmbeddedEntities() { return [ 'embed_node' => [ [ [ 'data-entity-type' => 'node', 'data-entity-uuid' => static::EMBEDDED_ENTITY_UUID, 'data-view-mode' => 'teaser', ], ], ], 'embed_multiple_node' => [ [ [ 'data-entity-type' => 'node', 'data-entity-uuid' => static::EMBEDDED_ENTITY_UUID, 'data-view-mode' => 'teaser', ], [ 'data-entity-type' => 'node', 'data-entity-uuid' => static::EMBEDDED_ENTITY_UUID_2, 'data-view-mode' => 'teaser', ], ], ], ]; } }