<?php
require_once 'URLNormalizer.php';
class URLNormalizerTest extends PHPUnit_Framework_TestCase { protected $fixture; private $test_url = 'http://www.yahoo.com/'; protected function setUp() { $this->fixture = new URLNormalizer(); $this->fixture->setUrl( $this->test_url ); } public function testClassCanBeInstantiated() { $this->assertTrue( is_object( $this->fixture ) ); } public function testObjectIsOfCorrectType() { $this->assertTrue( get_class( $this->fixture ) == 'URLNormalizer' ); } public function testObjectHasGetUrlMethod() { $this->assertTrue( method_exists( $this->fixture, 'getUrl' ) ); } public function testSetUrl() { $this->assertTrue( $this->fixture->getUrl() == $this->test_url ); } public function testObjectHasGetSchemeMethod() { $this->assertTrue( method_exists( $this->fixture, 'getScheme' ) ); } public function testSchemeExtractedFromUrl() { $this->assertTrue( $this->fixture->getScheme() == 'http' ); } /** * @dataProvider provider */ public function testUrlsAreNormalised( $url, $normalised_url ) { $this->fixture->setUrl( $url ); $this->assertEquals( $normalised_url, $this->fixture->normalize() ); } public function provider() { // tests from http://en.wikipedia.org/wiki/URL_normalization return array( array( 'HTTP://www.Example.com/', 'http://www.example.com/' ), # converting the scheme and host to lowercase array( 'http://www.example.com', 'http://www.example.com/' ), # add trailing / array( 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d', 'example://a/b/c/%7Bfoo%7D' ), ); } public function testCaseIsNormalization() { $this->fixture->setUrl( 'http://www.yahoo.com/%a1' ); $this->assertEquals( 'http://www.yahoo.com/%A1', $this->fixture->normalize() ); }
/** * @dataProvider dotSegmentProvider * * http://www.apps.ietf.org/rfc/rfc3986.html#sec-5.2.4 */ public function testRemoveDotSegments( $path, $normalised_path ) { $this->assertEquals( $normalised_path, $this->fixture->removeDotSegments( $path ) ); } public function dotSegmentProvider() { return array( array( '../', '' ), array( './', '' ), array( '/./', '/' ), array( '/.', '/' ), array( '/a/b/c/./../../g', '/a/g' ), array( 'mid/content=5/../6', 'mid/6' ), array( '/foo/bar/.', '/foo/bar/' ), array( '/foo/bar/./', '/foo/bar/' ), array( '/foo/bar/..', '/foo/' ), array( '/foo/bar/../', '/foo/' ), array( '/foo/bar/../baz', '/foo/baz' ), array('/foo/bar/../..', '/'), array('/foo/bar/../../' , '/'), array('/foo/bar/../../baz' , '/baz'), #array('/foo/bar/../../../baz' , '/../baz'), array( 'a/./b/../b/', 'a/b/' ),
); } public function testDecodingUnreservedUrlChars() { $this->assertEquals( 'c', $this->fixture->urlDecodeUnreservedChars( '%63' ) ); $this->assertEquals( 'c/%7b', $this->fixture->urlDecodeUnreservedChars( '%63/%7b' ) ); $this->assertEquals( 'eXAMPLE://a/./b/../b/c/%7bfoo%7d', $this->fixture->urlDecodeUnreservedChars( 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d' ) ); }
/** * @dataProvider schemeData * * http://www.apps.ietf.org/rfc/rfc3986.html#sec-6.2.3 */ public function testSchemeBasedNormalization( $url ) { $expected_uri = 'http://example.com/'; $this->fixture->setUrl( $url ); $this->assertEquals( $expected_uri, $this->fixture->normalize() );
} public function schemeData() { return array( array( 'http://example.com' ), array( 'http://example.com/' ), array( 'http://example.com:/' ), array( 'http://example.com:80/' ), ); } public function testQueryParametersArePreserved() { $url = 'http://fancysite.nl/links/doit.pl?id=2029'; $this->fixture->setUrl( $url ); $this->assertEquals( $url, $this->fixture->normalize() ); } public function testFragmentIdentifiersArePreserved() { $url = 'http://example.com/index.html#fragment'; $this->fixture->setUrl( $url ); $this->assertEquals( $url, $this->fixture->normalize() ); } }
|