function LinkFieldTest::doTestURLValidation

Same name and namespace in other branches
  1. 9 core/modules/link/tests/src/Functional/LinkFieldTest.php \Drupal\Tests\link\Functional\LinkFieldTest::doTestURLValidation()
  2. 11.x core/modules/link/tests/src/Functional/LinkFieldTest.php \Drupal\Tests\link\Functional\LinkFieldTest::doTestURLValidation()

Tests link field URL validation.

1 call to LinkFieldTest::doTestURLValidation()
LinkFieldTest::testLinkField in core/modules/link/tests/src/Functional/LinkFieldTest.php
Tests the functionality and rendering of the link field.

File

core/modules/link/tests/src/Functional/LinkFieldTest.php, line 88

Class

LinkFieldTest
Tests link field widgets and formatters.

Namespace

Drupal\Tests\link\Functional

Code

protected function doTestURLValidation() {
  $field_name = $this->randomMachineName();
  // Create a field with settings to validate.
  $this->fieldStorage = FieldStorageConfig::create([
    'field_name' => $field_name,
    'entity_type' => 'entity_test',
    'type' => 'link',
  ]);
  $this->fieldStorage
    ->save();
  $this->field = FieldConfig::create([
    'field_storage' => $this->fieldStorage,
    'bundle' => 'entity_test',
    'settings' => [
      'title' => DRUPAL_DISABLED,
      'link_type' => LinkItemInterface::LINK_GENERIC,
    ],
  ]);
  $this->field
    ->save();
  /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository */
  $display_repository = \Drupal::service('entity_display.repository');
  $display_repository->getFormDisplay('entity_test', 'entity_test')
    ->setComponent($field_name, [
    'type' => 'link_default',
    'settings' => [
      'placeholder_url' => 'http://example.com',
    ],
  ])
    ->save();
  $display_repository->getViewDisplay('entity_test', 'entity_test', 'full')
    ->setComponent($field_name, [
    'type' => 'link',
  ])
    ->save();
  // Display creation form.
  $this->drupalGet('entity_test/add');
  $this->assertSession()
    ->fieldValueEquals("{$field_name}[0][uri]", '');
  $this->assertSession()
    ->responseContains('placeholder="http://example.com"');
  // Create a path alias.
  $this->createPathAlias('/admin', '/a/path/alias');
  // Create a node to test the link widget.
  $node = $this->drupalCreateNode();
  $restricted_node = $this->drupalCreateNode([
    'status' => NodeInterface::NOT_PUBLISHED,
  ]);
  // Define some valid URLs (keys are the entered values, values are the
  // strings displayed to the user).
  $valid_external_entries = [
    'http://www.example.com/' => 'http://www.example.com/',
    // Strings within parenthesis without leading space char.
'http://www.example.com/strings_(string_within_parenthesis)' => 'http://www.example.com/strings_(string_within_parenthesis)',
    // Numbers within parenthesis without leading space char.
'http://www.example.com/numbers_(9999)' => 'http://www.example.com/numbers_(9999)',
  ];
  $valid_internal_entries = [
    '/entity_test/add' => '/entity_test/add',
    '/a/path/alias' => '/a/path/alias',
    // Front page, with query string and fragment.
'/' => '<front>',
    '/?example=llama' => '<front>?example=llama',
    '/#example' => '<front>#example',
    // Trailing spaces should be ignored.
'/ ' => '<front>',
    '/path with spaces ' => '/path with spaces',
    // @todo '<front>' is valid input for BC reasons, may be removed by
    //   https://www.drupal.org/node/2421941
'<front>' => '&lt;front&gt;',
    '<front>#example' => '&lt;front&gt;#example',
    '<front>?example=llama' => '&lt;front&gt;?example=llama',
    // Text-only links.
'<nolink>' => '&lt;nolink&gt;',
    'route:<nolink>' => '&lt;nolink&gt;',
    '<none>' => '&lt;none&gt;',
    // Query string and fragment.
'?example=llama' => '?example=llama',
    '#example' => '#example',
    // Entity reference autocomplete value.
$node->label() . ' (1)' => $node->label() . ' (1)',
    // Entity URI displayed as ER autocomplete value when displayed in a form.
'entity:node/1' => $node->label() . ' (1)',
    // URI for an entity that exists, but is not accessible by the user.
'entity:node/' . $restricted_node->id() => '- Restricted access - (' . $restricted_node->id() . ')',
    // URI for an entity that doesn't exist, but with a valid ID.
'entity:user/999999' => 'entity:user/999999',
  ];
  // Add to array url with complex query parameters.
  $valid_internal_entries += $this->getUrlWithComplexQueryInputList();
  // Define some invalid URLs.
  $validation_error_1 = "The path '@link_path' is invalid.";
  $validation_error_2 = 'Manually entered paths should start with one of the following characters: / ? #';
  $validation_error_3 = "The path '@link_path' is inaccessible.";
  $invalid_external_entries = [
    // Invalid protocol
'invalid://not-a-valid-protocol' => $validation_error_1,
    // Missing host name
'http://' => $validation_error_1,
  ];
  $invalid_internal_entries = [
    'no-leading-slash' => $validation_error_2,
    'entity:non_existing_entity_type/yar' => $validation_error_1,
    // URI for an entity that doesn't exist, with an invalid ID.
'entity:user/invalid-parameter' => $validation_error_1,
  ];
  // Test external and internal URLs for 'link_type' = LinkItemInterface::LINK_GENERIC.
  $this->assertValidEntries($field_name, $valid_external_entries + $valid_internal_entries);
  $this->assertInvalidEntries($field_name, $invalid_external_entries + $invalid_internal_entries);
  // Test external URLs for 'link_type' = LinkItemInterface::LINK_EXTERNAL.
  $this->field
    ->setSetting('link_type', LinkItemInterface::LINK_EXTERNAL);
  $this->field
    ->save();
  $this->assertValidEntries($field_name, $valid_external_entries);
  $this->assertInvalidEntries($field_name, $valid_internal_entries + $invalid_external_entries);
  // Test external URLs for 'link_type' = LinkItemInterface::LINK_INTERNAL.
  $this->field
    ->setSetting('link_type', LinkItemInterface::LINK_INTERNAL);
  $this->field
    ->save();
  $this->assertValidEntries($field_name, $valid_internal_entries);
  $this->assertInvalidEntries($field_name, $valid_external_entries + $invalid_internal_entries);
  // Ensure that users with 'link to any page', don't apply access checking.
  $this->drupalLogin($this->drupalCreateUser([
    'view test entity',
    'administer entity_test content',
  ]));
  $this->assertValidEntries($field_name, [
    '/entity_test/add' => '/entity_test/add',
  ]);
  $this->assertInValidEntries($field_name, [
    '/admin' => $validation_error_3,
  ]);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.