WebTestBaseTest.php

Namespace

Drupal\Tests\simpletest\Unit

File

core/modules/simpletest/tests/src/Unit/WebTestBaseTest.php

View source
<?php

namespace Drupal\Tests\simpletest\Unit;

use Drupal\Tests\UnitTestCase;

/**
 * @requires extension curl
 * @coversDefaultClass \Drupal\simpletest\WebTestBase
 * @group simpletest
 * @group WebTestBase
 */
class WebTestBaseTest extends UnitTestCase {
    
    /**
     * Provides data for testing the assertFieldByName() helper.
     *
     * @return array
     *   An array of values passed to the test method.
     */
    public function providerAssertFieldByName() {
        $data = [];
        $data[] = [
            'select_2nd_selected',
            'test',
            '1',
            FALSE,
        ];
        $data[] = [
            'select_2nd_selected',
            'test',
            '2',
            TRUE,
        ];
        $data[] = [
            'select_none_selected',
            'test',
            '',
            FALSE,
        ];
        $data[] = [
            'select_none_selected',
            'test',
            '1',
            TRUE,
        ];
        $data[] = [
            'select_none_selected',
            'test',
            NULL,
            TRUE,
        ];
        return $data;
    }
    
    /**
     * Tests the assertFieldByName() helper.
     *
     * @param string $filename
     *   Name of file containing the output to test.
     * @param string $name
     *   Name of field to assert.
     * @param string $value
     *   Value of the field to assert.
     * @param bool $expected
     *   The expected result of the assert.
     *
     * @see \Drupal\simpletest\WebTestBase::assertFieldByName()
     *
     * @dataProvider providerAssertFieldByName
     * @covers ::assertFieldByName
     */
    public function testAssertFieldByName($filename, $name, $value, $expected) {
        $content = file_get_contents(__DIR__ . '/../../fixtures/' . $filename . '.html');
        $web_test = $this->getMockBuilder('Drupal\\simpletest\\WebTestBase')
            ->disableOriginalConstructor()
            ->setMethods([
            'getRawContent',
            'assertTrue',
            'pass',
        ])
            ->getMock();
        $web_test->expects($this->any())
            ->method('getRawContent')
            ->will($this->returnValue($content));
        $web_test->expects($this->once())
            ->method('assertTrue')
            ->with($this->identicalTo($expected), $this->identicalTo('message'), $this->identicalTo('Browser'));
        $test_method = new \ReflectionMethod('Drupal\\simpletest\\WebTestBase', 'assertFieldByName');
        $test_method->setAccessible(TRUE);
        $test_method->invokeArgs($web_test, [
            $name,
            $value,
            'message',
        ]);
    }
    
    /**
     * Data provider for testClickLink().
     *
     * In the test method, we mock drupalGet() to return a known string:
     * 'This Text Returned By drupalGet()'. Since clickLink() can only return
     * either the value of drupalGet() or FALSE, our expected return value is the
     * same as this mocked return value when we expect a link to be found.
     *
     * @see https://www.drupal.org/node/1452896
     *
     * @return array
     *   Array of arrays of test data. Test data is structured as follows:
     *   - Expected return value of clickLink().
     *   - Parameter $label to clickLink().
     *   - Parameter $index to clickLink().
     *   - Test data to be returned by mocked xpath(). Return an empty array here
     *     to mock no link found on the page.
     */
    public function providerTestClickLink() {
        return [
            // Test for a non-existent label.
[
                FALSE,
                'does_not_exist',
                0,
                [],
            ],
            // Test for an existing label.
[
                'This Text Returned By drupalGet()',
                'exists',
                0,
                [
                    0 => [
                        'href' => 'this_is_a_url',
                    ],
                ],
            ],
            // Test for an existing label that isn't the first one.
[
                'This Text Returned By drupalGet()',
                'exists',
                1,
                [
                    0 => [
                        'href' => 'this_is_a_url',
                    ],
                    1 => [
                        'href' => 'this_is_another_url',
                    ],
                ],
            ],
        ];
    }
    
    /**
     * Test WebTestBase::clickLink().
     *
     * @param mixed $expected
     *   Expected return value of clickLink().
     * @param string $label
     *   Parameter $label to clickLink().
     * @param int $index
     *   Parameter $index to clickLink().
     * @param array $xpath_data
     *   Test data to be returned by mocked xpath().
     *
     * @dataProvider providerTestClickLink
     * @covers ::clickLink
     */
    public function testClickLink($expected, $label, $index, $xpath_data) {
        // Mock a WebTestBase object and some of its methods.
        $web_test = $this->getMockBuilder('Drupal\\simpletest\\WebTestBase')
            ->disableOriginalConstructor()
            ->setMethods([
            'pass',
            'fail',
            'getUrl',
            'xpath',
            'drupalGet',
            'getAbsoluteUrl',
        ])
            ->getMock();
        // Mocked getUrl() is only used for reporting so we just return a string.
        $web_test->expects($this->any())
            ->method('getUrl')
            ->will($this->returnValue('url_before'));
        // Mocked xpath() should return our test data.
        $web_test->expects($this->any())
            ->method('xpath')
            ->will($this->returnValue($xpath_data));
        if ($expected === FALSE) {
            // If link does not exist clickLink() will not try to do a drupalGet() or
            // a getAbsoluteUrl()
            $web_test->expects($this->never())
                ->method('drupalGet');
            $web_test->expects($this->never())
                ->method('getAbsoluteUrl');
            // The test should fail and not pass.
            $web_test->expects($this->never())
                ->method('pass');
            $web_test->expects($this->once())
                ->method('fail')
                ->will($this->returnValue(NULL));
        }
        else {
            // Mocked getAbsoluteUrl() should return whatever comes in.
            $web_test->expects($this->once())
                ->method('getAbsoluteUrl')
                ->with($xpath_data[$index]['href'])
                ->will($this->returnArgument(0));
            // We're only testing clickLink(), so drupalGet() always returns a string.
            $web_test->expects($this->once())
                ->method('drupalGet')
                ->with($xpath_data[$index]['href'])
                ->will($this->returnValue('This Text Returned By drupalGet()'));
            // The test should pass and not fail.
            $web_test->expects($this->never())
                ->method('fail');
            $web_test->expects($this->once())
                ->method('pass')
                ->will($this->returnValue(NULL));
        }
        // Set the clickLink() method to public so we can test it.
        $clicklink_method = new \ReflectionMethod($web_test, 'clickLink');
        $clicklink_method->setAccessible(TRUE);
        $this->assertSame($expected, $clicklink_method->invoke($web_test, $label, $index));
    }
    
    /**
     * @dataProvider providerTestGetAbsoluteUrl
     */
    public function testGetAbsoluteUrl($href, $expected_absolute_path) {
        $web_test = $this->getMockBuilder('Drupal\\simpletest\\WebTestBase')
            ->disableOriginalConstructor()
            ->setMethods([
            'getUrl',
        ])
            ->getMock();
        $web_test->expects($this->any())
            ->method('getUrl')
            ->willReturn('http://example.com/drupal/current-path?foo=baz');
        $GLOBALS['base_url'] = 'http://example.com';
        $GLOBALS['base_path'] = 'drupal';
        $get_absolute_url_method = new \ReflectionMethod($web_test, 'getAbsoluteUrl');
        $get_absolute_url_method->setAccessible(TRUE);
        $this->assertSame($expected_absolute_path, $get_absolute_url_method->invoke($web_test, $href));
        unset($GLOBALS['base_url'], $GLOBALS['base_path']);
    }
    
    /**
     * Provides test data for testGetAbsoluteUrl.
     *
     * @return array
     */
    public function providerTestGetAbsoluteUrl() {
        $data = [];
        $data['host'] = [
            'http://example.com/drupal/test-example',
            'http://example.com/drupal/test-example',
        ];
        $data['path'] = [
            '/drupal/test-example',
            'http://example.com/drupal/test-example',
        ];
        $data['path-with-query'] = [
            '/drupal/test-example?foo=bar',
            'http://example.com/drupal/test-example?foo=bar',
        ];
        $data['just-query'] = [
            '?foo=bar',
            'http://example.com/drupal/current-path?foo=bar',
        ];
        return $data;
    }

}

Classes

Title Deprecated Summary
WebTestBaseTest @requires extension curl @coversDefaultClass \Drupal\simpletest\WebTestBase @group simpletest @group WebTestBase

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