199 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
namespace Hamcrest\Xml;
 | 
						|
 | 
						|
class HasXPathTest extends \Hamcrest\AbstractMatcherTest
 | 
						|
{
 | 
						|
    protected static $xml;
 | 
						|
    protected static $doc;
 | 
						|
    protected static $html;
 | 
						|
 | 
						|
    public static function setUpBeforeClass()
 | 
						|
    {
 | 
						|
        self::$xml = <<<XML
 | 
						|
<?xml version="1.0"?>
 | 
						|
<users>
 | 
						|
    <user>
 | 
						|
        <id>alice</id>
 | 
						|
        <name>Alice Frankel</name>
 | 
						|
        <role>admin</role>
 | 
						|
    </user>
 | 
						|
    <user>
 | 
						|
        <id>bob</id>
 | 
						|
        <name>Bob Frankel</name>
 | 
						|
        <role>user</role>
 | 
						|
    </user>
 | 
						|
    <user>
 | 
						|
        <id>charlie</id>
 | 
						|
        <name>Charlie Chan</name>
 | 
						|
        <role>user</role>
 | 
						|
    </user>
 | 
						|
</users>
 | 
						|
XML;
 | 
						|
        self::$doc = new \DOMDocument();
 | 
						|
        self::$doc->loadXML(self::$xml);
 | 
						|
 | 
						|
        self::$html = <<<HTML
 | 
						|
<html>
 | 
						|
    <head>
 | 
						|
        <title>Home Page</title>
 | 
						|
    </head>
 | 
						|
    <body>
 | 
						|
        <h1>Heading</h1>
 | 
						|
        <p>Some text</p>
 | 
						|
    </body>
 | 
						|
</html>
 | 
						|
HTML;
 | 
						|
    }
 | 
						|
 | 
						|
    protected function createMatcher()
 | 
						|
    {
 | 
						|
        return \Hamcrest\Xml\HasXPath::hasXPath('/users/user');
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMatchesWhenXPathIsFound()
 | 
						|
    {
 | 
						|
        assertThat('one match', self::$doc, hasXPath('user[id = "bob"]'));
 | 
						|
        assertThat('two matches', self::$doc, hasXPath('user[role = "user"]'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testDoesNotMatchWhenXPathIsNotFound()
 | 
						|
    {
 | 
						|
        assertThat(
 | 
						|
            'no match',
 | 
						|
            self::$doc,
 | 
						|
            not(hasXPath('user[contains(id, "frank")]'))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMatchesWhenExpressionWithoutMatcherEvaluatesToTrue()
 | 
						|
    {
 | 
						|
        assertThat(
 | 
						|
            'one match',
 | 
						|
            self::$doc,
 | 
						|
            hasXPath('count(user[id = "bob"])')
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testDoesNotMatchWhenExpressionWithoutMatcherEvaluatesToFalse()
 | 
						|
    {
 | 
						|
        assertThat(
 | 
						|
            'no matches',
 | 
						|
            self::$doc,
 | 
						|
            not(hasXPath('count(user[id = "frank"])'))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMatchesWhenExpressionIsEqual()
 | 
						|
    {
 | 
						|
        assertThat(
 | 
						|
            'one match',
 | 
						|
            self::$doc,
 | 
						|
            hasXPath('count(user[id = "bob"])', 1)
 | 
						|
        );
 | 
						|
        assertThat(
 | 
						|
            'two matches',
 | 
						|
            self::$doc,
 | 
						|
            hasXPath('count(user[role = "user"])', 2)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testDoesNotMatchWhenExpressionIsNotEqual()
 | 
						|
    {
 | 
						|
        assertThat(
 | 
						|
            'no match',
 | 
						|
            self::$doc,
 | 
						|
            not(hasXPath('count(user[id = "frank"])', 2))
 | 
						|
        );
 | 
						|
        assertThat(
 | 
						|
            'one match',
 | 
						|
            self::$doc,
 | 
						|
            not(hasXPath('count(user[role = "admin"])', 2))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMatchesWhenContentMatches()
 | 
						|
    {
 | 
						|
        assertThat(
 | 
						|
            'one match',
 | 
						|
            self::$doc,
 | 
						|
            hasXPath('user/name', containsString('ice'))
 | 
						|
        );
 | 
						|
        assertThat(
 | 
						|
            'two matches',
 | 
						|
            self::$doc,
 | 
						|
            hasXPath('user/role', equalTo('user'))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testDoesNotMatchWhenContentDoesNotMatch()
 | 
						|
    {
 | 
						|
        assertThat(
 | 
						|
            'no match',
 | 
						|
            self::$doc,
 | 
						|
            not(hasXPath('user/name', containsString('Bobby')))
 | 
						|
        );
 | 
						|
        assertThat(
 | 
						|
            'no matches',
 | 
						|
            self::$doc,
 | 
						|
            not(hasXPath('user/role', equalTo('owner')))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testProvidesConvenientShortcutForHasXPathEqualTo()
 | 
						|
    {
 | 
						|
        assertThat('matches', self::$doc, hasXPath('count(user)', 3));
 | 
						|
        assertThat('matches', self::$doc, hasXPath('user[2]/id', 'bob'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testProvidesConvenientShortcutForHasXPathCountEqualTo()
 | 
						|
    {
 | 
						|
        assertThat('matches', self::$doc, hasXPath('user[id = "charlie"]', 1));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMatchesAcceptsXmlString()
 | 
						|
    {
 | 
						|
        assertThat('accepts XML string', self::$xml, hasXPath('user'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMatchesAcceptsHtmlString()
 | 
						|
    {
 | 
						|
        assertThat('accepts HTML string', self::$html, hasXPath('body/h1', 'Heading'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testHasAReadableDescription()
 | 
						|
    {
 | 
						|
        $this->assertDescription(
 | 
						|
            'XML or HTML document with XPath "/users/user"',
 | 
						|
            hasXPath('/users/user')
 | 
						|
        );
 | 
						|
        $this->assertDescription(
 | 
						|
            'XML or HTML document with XPath "count(/users/user)" <2>',
 | 
						|
            hasXPath('/users/user', 2)
 | 
						|
        );
 | 
						|
        $this->assertDescription(
 | 
						|
            'XML or HTML document with XPath "/users/user/name"'
 | 
						|
            . ' a string starting with "Alice"',
 | 
						|
            hasXPath('/users/user/name', startsWith('Alice'))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testHasAReadableMismatchDescription()
 | 
						|
    {
 | 
						|
        $this->assertMismatchDescription(
 | 
						|
            'XPath returned no results',
 | 
						|
            hasXPath('/users/name'),
 | 
						|
            self::$doc
 | 
						|
        );
 | 
						|
        $this->assertMismatchDescription(
 | 
						|
            'XPath expression result was <3F>',
 | 
						|
            hasXPath('/users/user', 2),
 | 
						|
            self::$doc
 | 
						|
        );
 | 
						|
        $this->assertMismatchDescription(
 | 
						|
            'XPath returned ["alice", "bob", "charlie"]',
 | 
						|
            hasXPath('/users/user/id', 'Frank'),
 | 
						|
            self::$doc
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |