From 121857cdbe8abbcbce79b05396a2ced99b5f9160 Mon Sep 17 00:00:00 2001
From: xjm <xjm@65776.no-reply.drupal.org>
Date: Tue, 26 Jul 2016 15:10:01 -0500
Subject: [PATCH] Issue #2759879 by klausi, claudiu.cristea, dawehner, xjm,
 Lendude, jibran: Additional assertions for WebAssert and AssertLegacyTrait,
 part 2

(cherry picked from commit df1fe18178c456eb98f8072690d36e7a9600dc14)
---
 .../FunctionalTests/AssertLegacyTrait.php     | 133 ++++++++++++++
 .../Core/Assert/AssertLegacyTraitTest.php     | 173 ++++++++++++++++++
 2 files changed, 306 insertions(+)
 create mode 100644 core/tests/Drupal/Tests/Core/Assert/AssertLegacyTraitTest.php

diff --git a/core/tests/Drupal/FunctionalTests/AssertLegacyTrait.php b/core/tests/Drupal/FunctionalTests/AssertLegacyTrait.php
index 6ca9f850a235..5785a7d8c894 100644
--- a/core/tests/Drupal/FunctionalTests/AssertLegacyTrait.php
+++ b/core/tests/Drupal/FunctionalTests/AssertLegacyTrait.php
@@ -93,6 +93,58 @@ protected function assertNoText($text) {
     }
   }
 
+  /**
+   * Passes if the text is found ONLY ONCE on the text version of the page.
+   *
+   * The text version is the equivalent of what a user would see when viewing
+   * through a web browser. In other words the HTML has been filtered out of
+   * the contents.
+   *
+   * @param string|\Drupal\Component\Render\MarkupInterface $text
+   *   Plain text to look for.
+   * @param string $message
+   *   (optional) A message to display with the assertion. Do not translate
+   *   messages with t(). If left blank, a default message will be displayed.
+   *
+   * @deprecated Scheduled for removal in Drupal 9.0.0.
+   *   Use $this->getSession()->getPage()->getText() and substr_count() instead.
+   */
+  protected function assertUniqueText($text, $message = NULL) {
+    // Cast MarkupInterface objects to string.
+    $text = (string) $text;
+
+    $message = $message ?: "'$text' found only once on the page";
+    $page_text = $this->getSession()->getPage()->getText();
+    $nr_found = substr_count($page_text, $text);
+    $this->assertSame(1, $nr_found, $message);
+  }
+
+  /**
+   * Passes if the text is found MORE THAN ONCE on the text version of the page.
+   *
+   * The text version is the equivalent of what a user would see when viewing
+   * through a web browser. In other words the HTML has been filtered out of
+   * the contents.
+   *
+   * @param string|\Drupal\Component\Render\MarkupInterface $text
+   *   Plain text to look for.
+   * @param string $message
+   *   (optional) A message to display with the assertion. Do not translate
+   *   messages with t(). If left blank, a default message will be displayed.
+   *
+   * @deprecated Scheduled for removal in Drupal 9.0.0.
+   *   Use $this->getSession()->getPage()->getText() and substr_count() instead.
+   */
+  protected function assertNoUniqueText($text, $message = '') {
+    // Cast MarkupInterface objects to string.
+    $text = (string) $text;
+
+    $message = $message ?: "'$text' found more than once on the page";
+    $page_text = $this->getSession()->getPage()->getText();
+    $nr_found = substr_count($page_text, $text);
+    $this->assertGreaterThan(1, $nr_found, $message);
+  }
+
   /**
    * Asserts the page responds with the specified response code.
    *
@@ -128,6 +180,27 @@ protected function assertFieldByName($name, $value = NULL) {
     }
   }
 
+  /**
+   * Asserts that a field exists with the given name and value.
+   *
+   * @param string $name
+   *   Name of field to assert.
+   * @param string $value
+   *   (optional) Value of the field to assert. You may pass in NULL (default)
+   *   to skip checking the actual value, while still checking that the field
+   *   exists.
+   *
+   * @deprecated Scheduled for removal in Drupal 9.0.0.
+   *   Use $this->assertSession()->fieldNotExists() or
+   *   $this->assertSession()->fieldValueNotEquals() instead.
+   */
+  protected function assertNoFieldByName($name, $value = NULL) {
+    $this->assertSession()->fieldNotExists($name);
+    if ($value !== NULL) {
+      $this->assertSession()->fieldValueNotEquals($name, (string) $value);
+    }
+  }
+
   /**
    * Asserts that a field exists with the given ID and value.
    *
@@ -343,6 +416,53 @@ protected function assertNoOption($id, $option) {
     return $this->assertSession()->optionNotExists($id, $option);
   }
 
+  /**
+   * Asserts that a select option in the current page is checked.
+   *
+   * @param string $id
+   *   ID of select field to assert.
+   * @param string $option
+   *   Option to assert.
+   * @param string $message
+   *   (optional) A message to display with the assertion. Do not translate
+   *   messages with t(). If left blank, a default message will be displayed.
+   *
+   * @deprecated Scheduled for removal in Drupal 9.0.0.
+   *   Use $this->assertSession()->optionExists() instead and check the
+   *   "selected" attribute yourself.
+   */
+  protected function assertOptionSelected($id, $option, $message = NULL) {
+    $option_field = $this->assertSession()->optionExists($id, $option);
+    $message = $message ?: "Option $option for field $id is selected.";
+    $this->assertTrue($option_field->hasAttribute('selected'), $message);
+  }
+
+  /**
+   * Asserts that a checkbox field in the current page is checked.
+   *
+   * @param string $id
+   *   ID of field to assert.
+   *
+   * @deprecated Scheduled for removal in Drupal 9.0.0.
+   *   Use $this->assertSession()->checkboxChecked() instead.
+   */
+  protected function assertFieldChecked($id) {
+    $this->assertSession()->checkboxChecked($id);
+  }
+
+  /**
+   * Asserts that a checkbox field in the current page is not checked.
+   *
+   * @param string $id
+   *   ID of field to assert.
+   *
+   * @deprecated Scheduled for removal in Drupal 9.0.0.
+   *   Use $this->assertSession()->checkboxNotChecked() instead.
+   */
+  protected function assertNoFieldChecked($id) {
+    $this->assertSession()->checkboxNotChecked($id);
+  }
+
   /**
    * Passes if the raw text IS found escaped on the loaded page, fail otherwise.
    *
@@ -373,6 +493,19 @@ protected function assertNoEscaped($raw) {
     $this->assertSession()->assertNoEscaped($raw);
   }
 
+  /**
+   * Triggers a pass if the Perl regex pattern is found in the raw content.
+   *
+   * @param string $pattern
+   *   Perl regex to look for including the regex delimiters.
+   *
+   * @deprecated Scheduled for removal in Drupal 9.0.0.
+   *   Use $this->assertSession()->responseMatches() instead.
+   */
+  protected function assertPattern($pattern) {
+    $this->assertSession()->responseMatches($pattern);
+  }
+
   /**
    * Asserts whether an expected cache tag was present in the last response.
    *
diff --git a/core/tests/Drupal/Tests/Core/Assert/AssertLegacyTraitTest.php b/core/tests/Drupal/Tests/Core/Assert/AssertLegacyTraitTest.php
new file mode 100644
index 000000000000..00dbdf50836e
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Assert/AssertLegacyTraitTest.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace Drupal\Tests\Core\Assert;
+
+use Behat\Mink\Element\DocumentElement;
+use Behat\Mink\Element\NodeElement;
+use Behat\Mink\Session;
+use Drupal\Component\Render\MarkupInterface;
+use Drupal\FunctionalTests\AssertLegacyTrait;
+use Drupal\Tests\UnitTestCase;
+use Drupal\Tests\WebAssert;
+use PHPUnit_Framework_ExpectationFailedException;
+
+/**
+ * @coversDefaultClass \Drupal\FunctionalTests\AssertLegacyTrait
+ * @group Assert
+ */
+class AssertLegacyTraitTest extends UnitTestCase {
+
+  use AssertLegacyTrait;
+
+  /**
+   * The mocked Mink session object used for testing.
+   *
+   * @var \Behat\Mink\Session|\Prophecy\Prophecy\ObjectProphecy
+   */
+  protected $session;
+
+  /**
+   * The mocked page element used for testing.
+   *
+   * @var Behat\Mink\Element\DocumentElement|\Prophecy\Prophecy\ObjectProphecy
+   */
+  protected $page;
+
+  /**
+   * The mocked web assert class.
+   *
+   * @var \Drupal\Tests\WebAssert|\Prophecy\Prophecy\ObjectProphecy
+   */
+  protected $webAssert;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $this->page = $this->prophesize(DocumentElement::class);
+    $this->session = $this->prophesize(Session::class);
+    $this->session->getPage()->willReturn($this->page->reveal());
+    $this->webAssert = $this->prophesize(WebAssert::class);
+  }
+
+  /**
+   * @covers ::assertUniqueText
+   */
+  public function testAssertUniqueText() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $this->assertUniqueText('foo');
+  }
+
+  /**
+   * @covers ::assertUniqueText
+   */
+  public function testAssertUniqueTextFail() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $this->setExpectedException(PHPUnit_Framework_ExpectationFailedException::class);
+    $this->assertUniqueText('bar');
+  }
+
+  /**
+   * @covers ::assertUniqueText
+   */
+  public function testAssertUniqueTextUnknown() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $this->setExpectedException(PHPUnit_Framework_ExpectationFailedException::class);
+    $this->assertUniqueText('alice');
+  }
+
+  /**
+   * @covers ::assertUniqueText
+   */
+  public function testAssertUniqueTextMarkup() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $markupObject = $this->prophesize(MarkupInterface::class);
+    $markupObject->__toString()->willReturn('foo');
+    $this->assertUniqueText($markupObject->reveal());
+  }
+
+  /**
+   * @covers ::assertNoUniqueText
+   */
+  public function testAssertNoUniqueText() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $this->assertNoUniqueText('bar');
+  }
+
+  /**
+   * @covers ::assertNoUniqueText
+   */
+  public function testAssertNoUniqueTextFail() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $this->setExpectedException(PHPUnit_Framework_ExpectationFailedException::class);
+    $this->assertNoUniqueText('foo');
+  }
+
+  /**
+   * @covers ::assertNoUniqueText
+   */
+  public function testAssertNoUniqueTextUnknown() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $this->setExpectedException(PHPUnit_Framework_ExpectationFailedException::class);
+    $this->assertNoUniqueText('alice');
+  }
+
+  /**
+   * @covers ::assertNoUniqueText
+   */
+  public function testAssertNoUniqueTextMarkup() {
+    $this->page->getText()->willReturn('foo bar bar');
+    $markupObject = $this->prophesize(MarkupInterface::class);
+    $markupObject->__toString()->willReturn('bar');
+    $this->assertNoUniqueText($markupObject->reveal());
+  }
+
+  /**
+   * @covers ::assertOptionSelected
+   */
+  public function testAssertOptionSelected() {
+    $option_field = $this->prophesize(NodeElement::class);
+    $option_field->hasAttribute('selected')->willReturn(TRUE);
+
+    $this->webAssert
+      ->optionExists('myselect', 'two')
+      ->willReturn($option_field->reveal());
+
+    $this->assertOptionSelected('myselect', 'two');
+  }
+
+  /**
+   * @covers ::assertOptionSelected
+   */
+  public function testAssertOptionSelectedFail() {
+    $option_field = $this->prophesize(NodeElement::class);
+    $option_field->hasAttribute('selected')->willReturn(FALSE);
+
+    $this->webAssert
+      ->optionExists('myselect', 'two')
+      ->willReturn($option_field->reveal());
+
+    $this->setExpectedException(PHPUnit_Framework_ExpectationFailedException::class);
+    $this->assertOptionSelected('myselect', 'two');
+  }
+
+  /**
+   * Returns a mocked behat session object.
+   *
+   * @return \Behat\Mink\Session
+   *   The mocked session.
+   */
+  protected function getSession() {
+    return $this->session->reveal();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function assertSession($name = NULL) {
+    return $this->webAssert->reveal();
+  }
+
+}
-- 
GitLab