PHP Classes
elePHPant
Icontem

File: URLNormalizerTest.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Glen Scott  >  URL Normalizer  >  URLNormalizerTest.php  >  Download  
File: URLNormalizerTest.php
Role: Unit test script
Content type: text/plain
Description: Test class
Class: URL Normalizer
Normalize URLs according to RFC 3986
Author: By
Last change: Added test cases for URL's with query strings and fragment identifiers.
Date: 3 years ago
Size: 4,638 bytes
 

Contents

Class file image Download
<?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() );
    }
}