function UrlTest::testLinkAttributes in Zircon Profile 8.0
Same name and namespace in other branches
- 8 core/modules/system/src/Tests/Common/UrlTest.php \Drupal\system\Tests\Common\UrlTest::testLinkAttributes()
Tests that default and custom attributes are handled correctly on links.
File
- core/
modules/ system/ src/ Tests/ Common/ UrlTest.php, line 79 - Contains \Drupal\system\Tests\Common\UrlTest.
Class
- UrlTest
- Confirm that \Drupal\Core\Url, \Drupal\Component\Utility\UrlHelper::filterQueryParameters(), \Drupal\Component\Utility\UrlHelper::buildQuery(), and \Drupal\Core\Utility\LinkGeneratorInterface::generate() work correctly with various input.
Namespace
Drupal\system\Tests\CommonCode
function testLinkAttributes() {
/** @var \Drupal\Core\Render\RendererInterface $renderer */
$renderer = $this->container
->get('renderer');
// Test that hreflang is added when a link has a known language.
$language = new Language(array(
'id' => 'fr',
'name' => 'French',
));
$hreflang_link = array(
'#type' => 'link',
'#options' => array(
'language' => $language,
),
'#url' => Url::fromUri('https://www.drupal.org'),
'#title' => 'bar',
);
$langcode = $language
->getId();
// Test that the default hreflang handling for links does not override a
// hreflang attribute explicitly set in the render array.
$hreflang_override_link = $hreflang_link;
$hreflang_override_link['#options']['attributes']['hreflang'] = 'foo';
$rendered = $renderer
->renderRoot($hreflang_link);
$this
->assertTrue($this
->hasAttribute('hreflang', $rendered, $langcode), format_string('hreflang attribute with value @langcode is present on a rendered link when langcode is provided in the render array.', array(
'@langcode' => $langcode,
)));
$rendered = $renderer
->renderRoot($hreflang_override_link);
$this
->assertTrue($this
->hasAttribute('hreflang', $rendered, 'foo'), format_string('hreflang attribute with value @hreflang is present on a rendered link when @hreflang is provided in the render array.', array(
'@hreflang' => 'foo',
)));
// Test the active class in links produced by
// \Drupal\Core\Utility\LinkGeneratorInterface::generate() and #type 'link'.
$options_no_query = array();
$options_query = array(
'query' => array(
'foo' => 'bar',
'one' => 'two',
),
);
$options_query_reverse = array(
'query' => array(
'one' => 'two',
'foo' => 'bar',
),
);
// Test #type link.
$path = 'common-test/type-link-active-class';
$this
->drupalGet($path, $options_no_query);
$links = $this
->xpath('//a[@href = :href and contains(@class, :class)]', array(
':href' => Url::fromRoute('common_test.l_active_class', [], $options_no_query)
->toString(),
':class' => 'is-active',
));
$this
->assertTrue(isset($links[0]), 'A link generated by the link generator to the current page is marked active.');
$links = $this
->xpath('//a[@href = :href and not(contains(@class, :class))]', array(
':href' => Url::fromRoute('common_test.l_active_class', [], $options_query)
->toString(),
':class' => 'is-active',
));
$this
->assertTrue(isset($links[0]), 'A link generated by the link generator to the current page with a query string when the current page has no query string is not marked active.');
$this
->drupalGet($path, $options_query);
$links = $this
->xpath('//a[@href = :href and contains(@class, :class)]', array(
':href' => Url::fromRoute('common_test.l_active_class', [], $options_query)
->toString(),
':class' => 'is-active',
));
$this
->assertTrue(isset($links[0]), 'A link generated by the link generator to the current page with a query string that matches the current query string is marked active.');
$links = $this
->xpath('//a[@href = :href and contains(@class, :class)]', array(
':href' => Url::fromRoute('common_test.l_active_class', [], $options_query_reverse)
->toString(),
':class' => 'is-active',
));
$this
->assertTrue(isset($links[0]), 'A link generated by the link generator to the current page with a query string that has matching parameters to the current query string but in a different order is marked active.');
$links = $this
->xpath('//a[@href = :href and not(contains(@class, :class))]', array(
':href' => Url::fromRoute('common_test.l_active_class', [], $options_no_query)
->toString(),
':class' => 'is-active',
));
$this
->assertTrue(isset($links[0]), 'A link generated by the link generator to the current page without a query string when the current page has a query string is not marked active.');
// Test adding a custom class in links produced by
// \Drupal\Core\Utility\LinkGeneratorInterface::generate() and #type 'link'.
// Test the link generator.
$class_l = $this
->randomMachineName();
$link_l = \Drupal::l($this
->randomMachineName(), new Url('<current>', [], [
'attributes' => [
'class' => [
$class_l,
],
],
]));
$this
->assertTrue($this
->hasAttribute('class', $link_l, $class_l), format_string('Custom class @class is present on link when requested by l()', array(
'@class' => $class_l,
)));
// Test #type.
$class_theme = $this
->randomMachineName();
$type_link = array(
'#type' => 'link',
'#title' => $this
->randomMachineName(),
'#url' => Url::fromRoute('<current>'),
'#options' => array(
'attributes' => array(
'class' => array(
$class_theme,
),
),
),
);
$link_theme = $renderer
->renderRoot($type_link);
$this
->assertTrue($this
->hasAttribute('class', $link_theme, $class_theme), format_string('Custom class @class is present on link when requested by #type', array(
'@class' => $class_theme,
)));
}