diff --git a/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php b/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php index 82e98d91a8992659339c416e2746502d9ca557f3..84782f74185949818b78ff57a26e71259da67c76 100644 --- a/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php +++ b/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php @@ -5,7 +5,6 @@ use Behat\Mink\Exception\ElementNotFoundException; use Behat\Mink\Exception\ExpectationException; use Drupal\Component\Serialization\Json; -use Drupal\Component\Utility\Html; use Drupal\Core\Url; use Drupal\Tests\BrowserTestBase; use Drupal\Tests\StreamCapturer; @@ -193,81 +192,6 @@ public function testError() { $this->drupalGet('test-error'); } - /** - * Tests linkExists() with pipe character (|) in locator. - * - * @see \Drupal\Tests\WebAssert::linkExists() - */ - public function testPipeCharInLocator() { - $this->drupalGet('test-pipe-char'); - $this->assertSession()->linkExists('foo|bar|baz'); - } - - /** - * Tests linkExistsExact() functionality. - * - * @see \Drupal\Tests\WebAssert::linkExistsExact() - */ - public function testLinkExistsExact() { - $this->drupalGet('test-pipe-char'); - $this->assertSession()->linkExistsExact('foo|bar|baz'); - } - - /** - * Tests linkExistsExact() functionality fail. - * - * @see \Drupal\Tests\WebAssert::linkExistsExact() - */ - public function testInvalidLinkExistsExact() { - $this->drupalGet('test-pipe-char'); - $this->expectException(ExpectationException::class); - $this->expectExceptionMessage('Link with label foo|bar not found'); - $this->assertSession()->linkExistsExact('foo|bar'); - } - - /** - * Tests linkNotExistsExact() functionality. - * - * @see \Drupal\Tests\WebAssert::linkNotExistsExact() - */ - public function testLinkNotExistsExact() { - $this->drupalGet('test-pipe-char'); - $this->assertSession()->linkNotExistsExact('foo|bar'); - } - - /** - * Tests responseHeaderDoesNotExist() functionality. - * - * @see \Drupal\Tests\WebAssert::responseHeaderDoesNotExist() - */ - public function testResponseHeaderDoesNotExist() { - $this->drupalGet('test-pipe-char'); - $this->assertSession()->responseHeaderDoesNotExist('Foo-Bar'); - } - - /** - * Tests linkNotExistsExact() functionality fail. - * - * @see \Drupal\Tests\WebAssert::linkNotExistsExact() - */ - public function testInvalidLinkNotExistsExact() { - $this->drupalGet('test-pipe-char'); - $this->expectException(ExpectationException::class); - $this->expectExceptionMessage('Link with label foo|bar|baz found'); - $this->assertSession()->linkNotExistsExact('foo|bar|baz'); - } - - /** - * Tests legacy text asserts. - */ - public function testTextAsserts() { - $this->drupalGet('test-encoded'); - $dangerous = 'Bad html <script>alert(123);</script>'; - $sanitized = Html::escape($dangerous); - $this->assertSession()->responseNotContains($dangerous); - $this->assertSession()->responseContains($sanitized); - } - /** * Tests legacy field asserts which use xpath directly. */ @@ -410,41 +334,6 @@ public function testFieldAssertsForTextfields() { $this->assertSession()->fieldValueEquals('edit-test-textarea-with-newline', "Test text with\nnewline"); } - /** - * Tests legacy field asserts for button field type. - */ - public function testFieldAssertsForButton() { - $this->drupalGet('test-field-xpath'); - - // Verify if the test passes with button ID. - $this->assertSession()->buttonExists('edit-save'); - // Verify if the test passes with button Value. - $this->assertSession()->buttonExists('Save'); - // Verify if the test passes with button Name. - $this->assertSession()->buttonExists('op'); - - // Verify if the test passes with button ID. - $this->assertSession()->buttonNotExists('i-do-not-exist'); - // Verify if the test passes with button Value. - $this->assertSession()->buttonNotExists('I do not exist'); - // Verify if the test passes with button Name. - $this->assertSession()->buttonNotExists('no'); - - // Test that multiple fields with the same name are validated correctly. - $this->assertSession()->buttonExists('duplicate_button'); - $this->assertSession()->buttonExists('Duplicate button 1'); - $this->assertSession()->buttonExists('Duplicate button 2'); - $this->assertSession()->buttonNotExists('Rabbit'); - - try { - $this->assertSession()->buttonNotExists('Duplicate button 2'); - $this->fail('The "duplicate_button" field with the value Duplicate button 2 was not found.'); - } - catch (ExpectationException $e) { - // Expected exception; just continue testing. - } - } - /** * Tests legacy field asserts for checkbox field type. */ @@ -631,48 +520,6 @@ public function testHtkey() { $this->assertSession()->statusCodeEquals(403); } - /** - * Tests pageContainsNoDuplicateId() functionality. - * - * @see \Drupal\Tests\WebAssert::pageContainsNoDuplicateId() - */ - public function testPageContainsNoDuplicateId() { - $assert_session = $this->assertSession(); - $this->drupalGet(Url::fromRoute('test_page_test.page_without_duplicate_ids')); - $assert_session->pageContainsNoDuplicateId(); - - $this->drupalGet(Url::fromRoute('test_page_test.page_with_duplicate_ids')); - $this->expectException(ExpectationException::class); - $this->expectExceptionMessage('The page contains a duplicate HTML ID "page-element".'); - $assert_session->pageContainsNoDuplicateId(); - } - - /** - * Tests assertEscaped() and assertUnescaped(). - * - * @see \Drupal\Tests\WebAssert::assertNoEscaped() - * @see \Drupal\Tests\WebAssert::assertEscaped() - */ - public function testEscapingAssertions() { - $assert = $this->assertSession(); - - $this->drupalGet('test-escaped-characters'); - $assert->assertNoEscaped('<div class="escaped">'); - $assert->responseContains('<div class="escaped">'); - $assert->assertEscaped('Escaped: <"\'&>'); - - $this->drupalGet('test-escaped-script'); - $assert->assertNoEscaped('<div class="escaped">'); - $assert->responseContains('<div class="escaped">'); - $assert->assertEscaped("<script>alert('XSS');alert(\"XSS\");</script>"); - - $this->drupalGet('test-unescaped-script'); - $assert->assertNoEscaped('<div class="unescaped">'); - $assert->responseContains('<div class="unescaped">'); - $assert->responseContains("<script>alert('Marked safe');alert(\"Marked safe\");</script>"); - $assert->assertNoEscaped("<script>alert('Marked safe');alert(\"Marked safe\");</script>"); - } - /** * Tests that deprecation headers do not get duplicated. * diff --git a/core/tests/Drupal/FunctionalTests/WebAssertTest.php b/core/tests/Drupal/FunctionalTests/WebAssertTest.php index 6b13dc3184450abb6b6105b709acaffedcff6cd6..7de367249fd0edbed2708794c9c10fa834e1df34 100644 --- a/core/tests/Drupal/FunctionalTests/WebAssertTest.php +++ b/core/tests/Drupal/FunctionalTests/WebAssertTest.php @@ -3,6 +3,7 @@ namespace Drupal\FunctionalTests; use Behat\Mink\Exception\ExpectationException; +use Drupal\Component\Utility\Html; use Drupal\Core\Url; use Drupal\Tests\BrowserTestBase; use Behat\Mink\Exception\ResponseTextException; @@ -133,4 +134,152 @@ public function testAddressNotEqualsException(): void { $this->assertSession()->addressNotEquals('test-page?a=b&c=d'); } + /** + * Tests linkExists() with pipe character (|) in locator. + * + * @covers ::linkExists + */ + public function testPipeCharInLocator() { + $this->drupalGet('test-pipe-char'); + $this->assertSession()->linkExists('foo|bar|baz'); + } + + /** + * Tests linkExistsExact() functionality. + * + * @covers ::linkExistsExact + */ + public function testLinkExistsExact() { + $this->drupalGet('test-pipe-char'); + $this->assertSession()->linkExistsExact('foo|bar|baz'); + } + + /** + * Tests linkExistsExact() functionality fail. + * + * @covers ::linkExistsExact + */ + public function testInvalidLinkExistsExact() { + $this->drupalGet('test-pipe-char'); + $this->expectException(ExpectationException::class); + $this->expectExceptionMessage('Link with label foo|bar not found'); + $this->assertSession()->linkExistsExact('foo|bar'); + } + + /** + * Tests linkNotExistsExact() functionality. + * + * @covers ::linkNotExistsExact + */ + public function testLinkNotExistsExact() { + $this->drupalGet('test-pipe-char'); + $this->assertSession()->linkNotExistsExact('foo|bar'); + } + + /** + * Tests linkNotExistsExact() functionality fail. + * + * @covers ::linkNotExistsExact + */ + public function testInvalidLinkNotExistsExact() { + $this->drupalGet('test-pipe-char'); + $this->expectException(ExpectationException::class); + $this->expectExceptionMessage('Link with label foo|bar|baz found'); + $this->assertSession()->linkNotExistsExact('foo|bar|baz'); + } + + /** + * Tests legacy text asserts. + * + * @covers ::responseContains + * @covers ::responseNotContains + */ + public function testTextAsserts() { + $this->drupalGet('test-encoded'); + $dangerous = 'Bad html <script>alert(123);</script>'; + $sanitized = Html::escape($dangerous); + $this->assertSession()->responseNotContains($dangerous); + $this->assertSession()->responseContains($sanitized); + } + + /** + * Tests legacy field asserts for button field type. + * + * @covers ::buttonExists + * @covers ::buttonNotExists + */ + public function testFieldAssertsForButton() { + $this->drupalGet('test-field-xpath'); + + // Verify if the test passes with button ID. + $this->assertSession()->buttonExists('edit-save'); + // Verify if the test passes with button Value. + $this->assertSession()->buttonExists('Save'); + // Verify if the test passes with button Name. + $this->assertSession()->buttonExists('op'); + + // Verify if the test passes with button ID. + $this->assertSession()->buttonNotExists('i-do-not-exist'); + // Verify if the test passes with button Value. + $this->assertSession()->buttonNotExists('I do not exist'); + // Verify if the test passes with button Name. + $this->assertSession()->buttonNotExists('no'); + + // Test that multiple fields with the same name are validated correctly. + $this->assertSession()->buttonExists('duplicate_button'); + $this->assertSession()->buttonExists('Duplicate button 1'); + $this->assertSession()->buttonExists('Duplicate button 2'); + $this->assertSession()->buttonNotExists('Rabbit'); + + try { + $this->assertSession()->buttonNotExists('Duplicate button 2'); + $this->fail('The "duplicate_button" field with the value Duplicate button 2 was not found.'); + } + catch (ExpectationException $e) { + // Expected exception; just continue testing. + } + } + + /** + * Tests pageContainsNoDuplicateId() functionality. + * + * @covers ::pageContainsNoDuplicateId + */ + public function testPageContainsNoDuplicateId() { + $assert_session = $this->assertSession(); + $this->drupalGet(Url::fromRoute('test_page_test.page_without_duplicate_ids')); + $assert_session->pageContainsNoDuplicateId(); + + $this->drupalGet(Url::fromRoute('test_page_test.page_with_duplicate_ids')); + $this->expectException(ExpectationException::class); + $this->expectExceptionMessage('The page contains a duplicate HTML ID "page-element".'); + $assert_session->pageContainsNoDuplicateId(); + } + + /** + * Tests assertEscaped() and assertUnescaped(). + * + * @covers ::assertNoEscaped + * @covers ::assertEscaped + */ + public function testEscapingAssertions() { + $assert = $this->assertSession(); + + $this->drupalGet('test-escaped-characters'); + $assert->assertNoEscaped('<div class="escaped">'); + $assert->responseContains('<div class="escaped">'); + $assert->assertEscaped('Escaped: <"\'&>'); + + $this->drupalGet('test-escaped-script'); + $assert->assertNoEscaped('<div class="escaped">'); + $assert->responseContains('<div class="escaped">'); + $assert->assertEscaped("<script>alert('XSS');alert(\"XSS\");</script>"); + + $this->drupalGet('test-unescaped-script'); + $assert->assertNoEscaped('<div class="unescaped">'); + $assert->responseContains('<div class="unescaped">'); + $assert->responseContains("<script>alert('Marked safe');alert(\"Marked safe\");</script>"); + $assert->assertNoEscaped("<script>alert('Marked safe');alert(\"Marked safe\");</script>"); + } + }