You are here

public function EmbeddedContentTest::testHtmlLink in Entity Usage 8.3

Same name and namespace in other branches
  1. 8.4 tests/src/FunctionalJavascript/EmbeddedContentTest.php \Drupal\Tests\entity_usage\FunctionalJavascript\EmbeddedContentTest::testHtmlLink()
  2. 8.2 tests/src/FunctionalJavascript/EmbeddedContentTest.php \Drupal\Tests\entity_usage\FunctionalJavascript\EmbeddedContentTest::testHtmlLink()

Tests the HtmlLink parsing.

File

tests/src/FunctionalJavascript/EmbeddedContentTest.php, line 194

Class

EmbeddedContentTest
Basic functional tests for the usage tracking of embedded content.

Namespace

Drupal\Tests\entity_usage\FunctionalJavascript

Code

public function testHtmlLink() {
  $session = $this
    ->getSession();
  $page = $session
    ->getPage();
  $assert_session = $this
    ->assertSession();

  /** @var \Drupal\entity_usage\EntityUsage $usage_service */
  $usage_service = \Drupal::service('entity_usage.usage');

  // Create node 1.
  $this
    ->drupalGet('/node/add/eu_test_ct');
  $page
    ->fillField('title[0][value]', 'Node 1');
  $page
    ->pressButton('Save');
  $session
    ->wait(500);
  $this
    ->saveHtmlOutput();
  $assert_session
    ->pageTextContains('eu_test_ct Node 1 has been created.');
  $node1 = $this
    ->getLastEntityOfType('node', TRUE);

  // Nobody is using this guy for now.
  $usage = $usage_service
    ->listSources($node1);
  $this
    ->assertEquals([], $usage);

  // Create node 2 referencing node 1 using a normal link markup.
  $embedded_text = '<p>foo <a href="/node/' . $node1
    ->id() . '">linked text</a> bar</p>';
  $node2 = Node::create([
    'type' => 'eu_test_ct',
    'title' => 'Node 2',
    'field_eu_test_rich_text' => [
      'value' => $embedded_text,
      'format' => 'eu_test_text_format',
    ],
  ]);
  $node2
    ->save();
  $this
    ->triggerPostRequestTracking();

  // Check that we correctly registered the relation between N2 and N1.
  $usage = $usage_service
    ->listSources($node1);
  $expected = [
    'node' => [
      $node2
        ->id() => [
        [
          'source_langcode' => $node2
            ->language()
            ->getId(),
          'source_vid' => $node2
            ->getRevisionId(),
        ],
      ],
    ],
  ];
  $this
    ->assertEquals($expected, $usage);

  // Create node 3 referencing N2 and N1 on the same field.
  $embedded_text .= '<p>Foo bar</p>' . '<p>foo2 <a href="/node/' . $node2
    ->id() . '">linked text 2</a> bar 2</p>';
  $node3 = Node::create([
    'type' => 'eu_test_ct',
    'title' => 'Node 3',
    'field_eu_test_rich_text' => [
      'value' => $embedded_text,
      'format' => 'eu_test_text_format',
    ],
  ]);
  $node3
    ->save();
  $this
    ->triggerPostRequestTracking();

  // Check that both targets are tracked.
  $usage = $usage_service
    ->listTargets($node3);
  $expected = [
    'node' => [
      $node2
        ->id(),
      $node1
        ->id(),
    ],
  ];
  $this
    ->assertEquals($expected, $usage);

  // Create node 4 referencing a non existing path to test removed entities.
  $embedded_text = '<p>foo <a href="/node/4324">linked text foo 2</a> bar</p>';
  $node4 = Node::create([
    'type' => 'eu_test_ct',
    'title' => 'Node 4',
    'field_eu_test_rich_text' => [
      'value' => $embedded_text,
      'format' => 'eu_test_text_format',
    ],
  ]);
  $node4
    ->save();
  $this
    ->triggerPostRequestTracking();

  // Check that the usage for this source is empty.
  $usage = $usage_service
    ->listTargets($node4);
  $this
    ->assertEquals([], $usage);

  // Create node 5 referencing node 4 using an absolute URL.
  $embedded_text = '<p>foo <a href="' . $node4
    ->toUrl()
    ->setAbsolute(TRUE)
    ->toString() . '">linked text</a> bar</p>';

  // Whitelist the local hostname so we can test absolute URLs.
  $current_request = \Drupal::request();
  $config = \Drupal::configFactory()
    ->getEditable('entity_usage.settings');
  $config
    ->set('site_domains', [
    $current_request
      ->getHttpHost() . $current_request
      ->getBasePath(),
  ]);
  $config
    ->save();
  $node5 = Node::create([
    'type' => 'eu_test_ct',
    'title' => 'Node 5',
    'field_eu_test_rich_text' => [
      'value' => $embedded_text,
      'format' => 'eu_test_text_format',
    ],
  ]);
  $node5
    ->save();
  $this
    ->triggerPostRequestTracking();

  // Check that we correctly registered the relation between N5 and N4.
  $usage = $usage_service
    ->listSources($node4);
  $expected = [
    'node' => [
      $node5
        ->id() => [
        [
          'source_langcode' => $node5
            ->language()
            ->getId(),
          'source_vid' => $node5
            ->getRevisionId(),
        ],
      ],
    ],
  ];
  $this
    ->assertEquals($expected, $usage);

  // Create a different field and make sure that a plugin tracking two
  // different field types works as expected.
  $storage = FieldStorageConfig::create([
    'field_name' => 'field_eu_test_normal_text',
    'entity_type' => 'node',
    'type' => 'text',
  ]);
  $storage
    ->save();
  FieldConfig::create([
    'bundle' => 'eu_test_ct',
    'entity_type' => 'node',
    'field_name' => 'field_eu_test_normal_text',
    'label' => 'Normal text',
  ])
    ->save();

  // Create node 6 referencing node 5 using an aliased URL.
  $alias_url = '/i-am-an-alias';
  \Drupal::service('path.alias_storage')
    ->save('/node/' . $node5
    ->id(), $alias_url, $node5
    ->language()
    ->getId());
  $embedded_text = '<p>foo <a href="' . $alias_url . '">linked text</a> bar</p>';
  $node6 = Node::create([
    'type' => 'eu_test_ct',
    'title' => 'Node 6',
    'field_eu_test_rich_text' => [
      'value' => $embedded_text,
      'format' => 'eu_test_text_format',
    ],
  ]);
  $node6
    ->save();
  $this
    ->triggerPostRequestTracking();

  // Check that we correctly registered the relation between N6 and N5.
  $usage = $usage_service
    ->listSources($node5);
  $expected = [
    'node' => [
      $node6
        ->id() => [
        [
          'source_langcode' => $node6
            ->language()
            ->getId(),
          'source_vid' => $node6
            ->getRevisionId(),
        ],
      ],
    ],
  ];
  $this
    ->assertEquals($expected, $usage);
}