Issue #3151047 by quietone, jibran, larowlan, xjm, pameeela: Expand LinkWidget test coverage

merge-requests/2/head
Lee Rowlands 2020-06-26 15:01:25 +10:00
parent 240dcf72d4
commit e2fc217b7c
No known key found for this signature in database
GPG Key ID: 2B829A3DF9204DC4
1 changed files with 122 additions and 0 deletions

View File

@ -0,0 +1,122 @@
<?php
namespace Drupal\Tests\link\Kernel;
use Drupal\Tests\field\Kernel\FieldKernelTestBase;
/**
* Tests link field validation.
*
* @group link
*/
class LinkItemUrlValidationTest extends FieldKernelTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = ['link'];
/**
* Tests link validation.
*/
public function testExternalLinkValidation() {
$definition = \Drupal::typedDataManager()
->createDataDefinition('field_item:link');
$link_item = \Drupal::typedDataManager()->create($definition);
$test_links = $this->getTestLinks();
foreach ($test_links as $data) {
[$value, $expected_violations] = $data;
$link_item->setValue($value);
$violations = $link_item->validate();
$expected_count = count($expected_violations);
$this->assertCount($expected_count, $violations, sprintf('Violation message count error for %s', $value));
if ($expected_count) {
$i = 0;
foreach ($expected_violations as $error_msg) {
// If the expected message contains a '%' add the current link value.
if (strpos($error_msg, '%')) {
$error_msg = sprintf($error_msg, $value);
}
$this->assertEquals($error_msg, $violations[$i++]->getMessage());
}
}
}
}
/**
* Builds an array of links to test.
*
* @return array
* The first element of the array is the link value to test. The second
* value is an array of expected violation messages.
*/
protected function getTestLinks() {
$violation_0 = "The path '%s' is invalid.";
$violation_1 = 'This value should be of the correct primitive type.';
return [
['invalid://not-a-valid-protocol', [$violation_0]],
['http://www.example.com/', []],
// Strings within parenthesis without leading space char.
['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/?name=ferret&color=purple', []],
['http://www.example.com/page?name=ferret&color=purple', []],
['http://www.example.com?a=&b[]=c&d[]=e&d[]=f&h==', []],
['http://www.example.com#colors', []],
// Use list of valid URLS from],
// https://cran.r-project.org/web/packages/rex/vignettes/url_parsing.html.
["http://foo.com/blah_blah", []],
["http://foo.com/blah_blah/", []],
["http://foo.com/blah_blah_(wikipedia)", []],
["http://foo.com/blah_blah_(wikipedia)_(again)", []],
["http://www.example.com/wpstyle/?p=364", []],
["https://www.example.com/foo/?bar=baz&inga=42&quux", []],
["http://✪df.ws/123", []],
["http://userid:password@example.com:8080", []],
["http://userid:password@example.com:8080/", []],
["http://userid@example.com", []],
["http://userid@example.com/", []],
["http://userid@example.com:8080", []],
["http://userid@example.com:8080/", []],
["http://userid:password@example.com", []],
["http://userid:password@example.com/", []],
["http://➡.ws/䨹", []],
["http://⌘.ws", []],
["http://⌘.ws/", []],
["http://foo.com/blah_(wikipedia)#cite-1", []],
["http://foo.com/blah_(wikipedia)_blah#cite-1", []],
// The following invalid URLs produce false positives.
["http://foo.com/unicode_(✪)_in_parens", []],
["http://foo.com/(something)?after=parens", []],
["http://☺.damowmow.com/", []],
["http://code.google.com/events/#&product=browser", []],
["http://j.mp", []],
["ftp://foo.bar/baz", []],
["http://foo.bar/?q=Test%20URL-encoded%20stuff", []],
["http://مثال.إختبار", []],
["http://例子.测试", []],
["http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", []],
["http://1337.net", []],
["http://a.b-c.de", []],
["radar://1234", [$violation_0]],
["h://test", [$violation_0]],
["ftps://foo.bar/", [$violation_0]],
// Use invalid URLS from
// https://cran.r-project.org/web/packages/rex/vignettes/url_parsing.html.
['http://', [$violation_0, $violation_1]],
["http://?", [$violation_0, $violation_1]],
["http://??", [$violation_0, $violation_1]],
["http://??/", [$violation_0, $violation_1]],
["http://#", [$violation_0, $violation_1]],
["http://##", [$violation_0, $violation_1]],
["http://##/", [$violation_0, $violation_1]],
["//", [$violation_0, $violation_1]],
["///a", [$violation_0, $violation_1]],
["///", [$violation_0, $violation_1]],
["http:///a", [$violation_0, $violation_1]],
];
}
}