depcalc-8.x-1.x-dev/tests/src/Kernel/EventSubscriber/DependencyCollector/LinkFieldCollectorTest.php

tests/src/Kernel/EventSubscriber/DependencyCollector/LinkFieldCollectorTest.php
<?php

namespace Drupal\Tests\depcalc\Kernel\EventSubscriber\DependencyCollector;

use Drupal\depcalc\DependencyStack;
use Drupal\depcalc\DependentEntityWrapper;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\KernelTests\KernelTestBase;
use Drupal\link\LinkItemInterface;
use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
use Drupal\Tests\node\Traits\NodeCreationTrait;
use Drupal\Tests\user\Traits\UserCreationTrait;

/**
 * Class LinkFieldCollectorTest to check Link field dependencies.
 *
 * @group depcalc
 *
 * @package Drupal\Tests\depcalc\Kernel\EventSubscriber\DependencyCollector
 */
class LinkFieldCollectorTest extends KernelTestBase {

  use NodeCreationTrait {
    createNode as drupalCreateNode;
  }

  use ContentTypeCreationTrait {
    createContentType as drupalCreateContentType;
  }

  use UserCreationTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'depcalc',
    'field',
    'filter',
    'link',
    'node',
    'path_alias',
    'system',
    'user',
    'book',
    'text',
  ];

  /**
   * Calculates all the dependencies of a given entity.
   *
   * @var \Drupal\depcalc\DependencyCalculator
   */
  protected $calculator;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->installSchema('node', 'node_access');
    $this->installSchema('system', 'sequences');
    $this->installEntitySchema('node');
    $this->installEntitySchema('user');
    $this->installEntitySchema('path_alias');
    $this->installConfig('filter');
    $this->installConfig('node');
    $this->installConfig(['field', 'system']);
    $this->installSchema('book', 'book');
    $this->installConfig('book');

    $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);

    $field_storage = FieldStorageConfig::create(
          [
            'field_name' => 'link',
            'entity_type' => 'node',
            'type' => 'link',
            'cardinality' => -1,
          ]
      );
    $field_storage->save();

    $field = FieldConfig::create(
          [
            'field_storage' => $field_storage,
            'bundle' => 'page',
            'label' => 'link',
            'settings' => ['link_type' => LinkItemInterface::LINK_GENERIC],
          ]
      );
    $field->save();

    $this->calculator = \Drupal::service('entity.dependency.calculator');
  }

  /**
   * Test dependency calculation.
   *
   * Checks the node's dependencies contains entities referenced in link field.
   */
  public function testLinkFieldCollector() {
    $node = $this->drupalCreateNode([]);

    $linked_nodes = [];
    for ($i = 0; $i < 2; $i++) {
      // Nodes to be linked as "entity:".
      $linked_nodes['entity'][] = $this->drupalCreateNode([]);
      // Nodes to be linked as "internal:".
      $linked_nodes['internal'][] = $this->drupalCreateNode([]);
    }

    foreach ($linked_nodes as $key => $linked_node_array) {
      foreach ($linked_node_array as $linked_node) {
        /**
* @var \Drupal\node\NodeInterface $linked_node
*/
        $uri_key = $key === 'entity' ? "$key:" : "$key:/";
        $node->get('link')->appendItem(
              [
                'uri' => "{$uri_key}node/{$linked_node->id()}",
                'title' => $linked_node->label(),
              ]
          );
      }
    }

    // Add internal route to check module dependency for the given route.
    $node->get('link')->appendItem(
          [
            'uri' => 'internal:/book',
            'title' => 'Books',
          ]
      );

    // Add internal route with route name outside of the standard
    // $MODULE_NAME.ROUTE_DESCRIPTION to assert it won't fail.
    $node->get('link')->appendItem(
          [
            'uri' => 'internal:/',
            'title' => 'No route',
          ]
      );

    // Adding an empty link to make sure empty links
    // won't break dependency calculation.
    // See issue 3199592.
    $node->get('link')->appendItem(
          [
            'uri' => NULL,
          ]
      );

    $node->save();

    try {
      $wrapper = new DependentEntityWrapper($node);
    }
    catch (\Exception $exception) {
      $this->markTestIncomplete($exception->getMessage());
    }

    $dependencies = $this->calculator->calculateDependencies($wrapper, new DependencyStack());

    foreach ($linked_nodes as $linked_node_array) {
      foreach ($linked_node_array as $linked_node) {
        $this->assertArrayHasKey($linked_node->uuid(), $dependencies);
      }
    }

    // Check whether the module has been added to the module dependencies.
    $this->assertContains('book', $dependencies['module']);
  }

  /**
   * Test dependency calculation.
   *
   * Checks the node's dependencies contains entities which have been deleted.
   */
  public function testLinkFieldCollectorDeletedReference() {
    $node = $this->drupalCreateNode([]);

    $linked_node = $this->drupalCreateNode([]);
    $id = $linked_node->id();

    $node->get('link')->appendItem(
          [
            'uri' => "entity:node/$id",
            'title' => $linked_node->label(),
          ]
      );

    $node->save();

    try {
      $wrapper = new DependentEntityWrapper($node);
    }
    catch (\Exception $exception) {
      $this->markTestIncomplete($exception->getMessage());
    }

    $dependencies = $this->calculator->calculateDependencies(
          $wrapper,
          new DependencyStack()
      );
    $this->assertArrayHasKey($linked_node->uuid(), $dependencies);

    $linked_node->delete();

    try {
      $wrapper = new DependentEntityWrapper($node);
    }
    catch (\Exception $exception) {
      $this->markTestIncomplete($exception->getMessage());
    }

    $dependencies = $this->calculator->calculateDependencies(
          $wrapper,
          new DependencyStack()
      );
    $this->assertArrayNotHasKey($linked_node->uuid(), $dependencies);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc