2010-06-24 07:46:50 +01:00
< ? php
/*
* This file is part of the Symfony package .
*
2011-03-06 11:40:06 +00:00
* ( c ) Fabien Potencier < fabien @ symfony . com >
2010-06-24 07:46:50 +01:00
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2012-03-28 14:43:52 +01:00
namespace Symfony\Component\Routing\Tests ;
2010-06-24 07:46:50 +01:00
2010-08-20 22:09:55 +01:00
use Symfony\Component\Routing\RouteCollection ;
use Symfony\Component\Routing\Route ;
2011-02-10 15:15:51 +00:00
use Symfony\Component\Config\Resource\FileResource ;
2010-06-24 07:46:50 +01:00
class RouteCollectionTest extends \PHPUnit_Framework_TestCase
{
public function testRoute ()
{
$collection = new RouteCollection ();
$route = new Route ( '/foo' );
2010-11-23 08:42:19 +00:00
$collection -> add ( 'foo' , $route );
$this -> assertEquals ( array ( 'foo' => $route ), $collection -> all (), '->add() adds a route' );
$this -> assertEquals ( $route , $collection -> get ( 'foo' ), '->get() returns a route by name' );
$this -> assertNull ( $collection -> get ( 'bar' ), '->get() returns null if a route does not exist' );
2010-06-24 07:46:50 +01:00
}
2012-07-28 23:02:29 +01:00
public function testOverriddenRoute ()
2011-09-30 08:20:51 +01:00
{
$collection = new RouteCollection ();
$collection -> add ( 'foo' , new Route ( '/foo' ));
$collection -> add ( 'foo' , new Route ( '/foo1' ));
2013-01-14 16:36:16 +00:00
$this -> assertEquals ( '/foo1' , $collection -> get ( 'foo' ) -> getPath ());
2011-09-30 08:20:51 +01:00
}
2012-07-28 23:02:29 +01:00
public function testDeepOverriddenRoute ()
2011-09-30 08:20:51 +01:00
{
$collection = new RouteCollection ();
$collection -> add ( 'foo' , new Route ( '/foo' ));
$collection1 = new RouteCollection ();
$collection1 -> add ( 'foo' , new Route ( '/foo1' ));
$collection2 = new RouteCollection ();
$collection2 -> add ( 'foo' , new Route ( '/foo2' ));
$collection1 -> addCollection ( $collection2 );
$collection -> addCollection ( $collection1 );
2013-01-14 16:36:16 +00:00
$this -> assertEquals ( '/foo2' , $collection1 -> get ( 'foo' ) -> getPath ());
$this -> assertEquals ( '/foo2' , $collection -> get ( 'foo' ) -> getPath ());
2011-09-30 08:20:51 +01:00
}
2012-12-07 10:44:47 +00:00
public function testIterator ()
2011-09-30 08:20:51 +01:00
{
$collection = new RouteCollection ();
$collection -> add ( 'foo' , new Route ( '/foo' ));
$collection1 = new RouteCollection ();
2012-12-07 10:44:47 +00:00
$collection1 -> add ( 'bar' , $bar = new Route ( '/bar' ));
$collection1 -> add ( 'foo' , $foo = new Route ( '/foo-new' ));
2012-11-26 17:29:17 +00:00
$collection -> addCollection ( $collection1 );
2012-12-07 10:44:47 +00:00
$collection -> add ( 'last' , $last = new Route ( '/last' ));
2011-09-30 08:20:51 +01:00
2012-12-07 10:44:47 +00:00
$this -> assertInstanceOf ( '\ArrayIterator' , $collection -> getIterator ());
$this -> assertSame ( array ( 'bar' => $bar , 'foo' => $foo , 'last' => $last ), $collection -> getIterator () -> getArrayCopy ());
2011-09-30 08:20:51 +01:00
}
2012-06-11 01:37:14 +01:00
public function testCount ()
{
$collection = new RouteCollection ();
$collection -> add ( 'foo' , new Route ( '/foo' ));
$collection1 = new RouteCollection ();
2012-12-07 10:44:47 +00:00
$collection1 -> add ( 'bar' , new Route ( '/bar' ));
2012-11-26 17:29:17 +00:00
$collection -> addCollection ( $collection1 );
2012-06-11 01:37:14 +01:00
$this -> assertCount ( 2 , $collection );
}
2010-06-24 07:46:50 +01:00
public function testAddCollection ()
{
$collection = new RouteCollection ();
2012-12-07 12:21:35 +00:00
$collection -> add ( 'foo' , new Route ( '/foo' ));
2010-06-24 07:46:50 +01:00
$collection1 = new RouteCollection ();
2012-12-07 12:21:35 +00:00
$collection1 -> add ( 'bar' , $bar = new Route ( '/bar' ));
$collection1 -> add ( 'foo' , $foo = new Route ( '/foo-new' ));
$collection2 = new RouteCollection ();
$collection2 -> add ( 'grandchild' , $grandchild = new Route ( '/grandchild' ));
$collection1 -> addCollection ( $collection2 );
2010-06-24 07:46:50 +01:00
$collection -> addCollection ( $collection1 );
2012-12-07 12:21:35 +00:00
$collection -> add ( 'last' , $last = new Route ( '/last' ));
2010-06-24 07:46:50 +01:00
2013-05-10 17:49:00 +01:00
$this -> assertSame ( array ( 'bar' => $bar , 'foo' => $foo , 'grandchild' => $grandchild , 'last' => $last ), $collection -> all (),
2012-12-07 12:21:35 +00:00
'->addCollection() imports routes of another collection, overrides if necessary and adds them at the end' );
}
public function testAddCollectionWithResources ()
{
2010-06-24 07:46:50 +01:00
$collection = new RouteCollection ();
2010-06-28 08:15:15 +01:00
$collection -> addResource ( $foo = new FileResource ( __DIR__ . '/Fixtures/foo.xml' ));
2010-06-24 07:46:50 +01:00
$collection1 = new RouteCollection ();
2010-06-28 08:15:15 +01:00
$collection1 -> addResource ( $foo1 = new FileResource ( __DIR__ . '/Fixtures/foo1.xml' ));
2010-06-24 07:46:50 +01:00
$collection -> addCollection ( $collection1 );
$this -> assertEquals ( array ( $foo , $foo1 ), $collection -> getResources (), '->addCollection() merges resources' );
}
2012-12-07 12:22:39 +00:00
public function testAddDefaultsAndRequirementsAndOptions ()
{
$collection = new RouteCollection ();
$collection -> add ( 'foo' , new Route ( '/{placeholder}' ));
$collection1 = new RouteCollection ();
$collection1 -> add ( 'bar' , new Route ( '/{placeholder}' ,
array ( '_controller' => 'fixed' , 'placeholder' => 'default' ), array ( 'placeholder' => '.+' ), array ( 'option' => 'value' ))
);
$collection -> addCollection ( $collection1 );
$collection -> addDefaults ( array ( 'placeholder' => 'new-default' ));
$this -> assertEquals ( array ( 'placeholder' => 'new-default' ), $collection -> get ( 'foo' ) -> getDefaults (), '->addDefaults() adds defaults to all routes' );
$this -> assertEquals ( array ( '_controller' => 'fixed' , 'placeholder' => 'new-default' ), $collection -> get ( 'bar' ) -> getDefaults (),
'->addDefaults() adds defaults to all routes and overwrites existing ones' );
$collection -> addRequirements ( array ( 'placeholder' => '\d+' ));
$this -> assertEquals ( array ( 'placeholder' => '\d+' ), $collection -> get ( 'foo' ) -> getRequirements (), '->addRequirements() adds requirements to all routes' );
$this -> assertEquals ( array ( 'placeholder' => '\d+' ), $collection -> get ( 'bar' ) -> getRequirements (),
'->addRequirements() adds requirements to all routes and overwrites existing ones' );
$collection -> addOptions ( array ( 'option' => 'new-value' ));
$this -> assertEquals (
array ( 'option' => 'new-value' , 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler' ),
$collection -> get ( 'bar' ) -> getOptions (), '->addOptions() adds options to all routes and overwrites existing ones'
);
}
2010-06-24 07:46:50 +01:00
public function testAddPrefix ()
{
$collection = new RouteCollection ();
2010-11-23 08:42:19 +00:00
$collection -> add ( 'foo' , $foo = new Route ( '/foo' ));
2012-10-06 00:21:17 +01:00
$collection2 = new RouteCollection ();
$collection2 -> add ( 'bar' , $bar = new Route ( '/bar' ));
$collection -> addCollection ( $collection2 );
$collection -> addPrefix ( ' / ' );
2015-01-02 16:09:32 +00:00
$this -> assertSame ( '/foo' , $collection -> get ( 'foo' ) -> getPath (), '->addPrefix() trims the prefix and a single slash has no effect' );
2012-12-07 10:24:42 +00:00
$collection -> addPrefix ( '/{admin}' , array ( 'admin' => 'admin' ), array ( 'admin' => '\d+' ));
2013-01-14 16:36:16 +00:00
$this -> assertEquals ( '/{admin}/foo' , $collection -> get ( 'foo' ) -> getPath (), '->addPrefix() adds a prefix to all routes' );
$this -> assertEquals ( '/{admin}/bar' , $collection -> get ( 'bar' ) -> getPath (), '->addPrefix() adds a prefix to all routes' );
2012-10-06 00:21:17 +01:00
$this -> assertEquals ( array ( 'admin' => 'admin' ), $collection -> get ( 'foo' ) -> getDefaults (), '->addPrefix() adds defaults to all routes' );
$this -> assertEquals ( array ( 'admin' => 'admin' ), $collection -> get ( 'bar' ) -> getDefaults (), '->addPrefix() adds defaults to all routes' );
$this -> assertEquals ( array ( 'admin' => '\d+' ), $collection -> get ( 'foo' ) -> getRequirements (), '->addPrefix() adds requirements to all routes' );
$this -> assertEquals ( array ( 'admin' => '\d+' ), $collection -> get ( 'bar' ) -> getRequirements (), '->addPrefix() adds requirements to all routes' );
2012-04-01 11:32:28 +01:00
$collection -> addPrefix ( '0' );
2015-01-02 16:09:32 +00:00
$this -> assertEquals ( '/0/{admin}/foo' , $collection -> get ( 'foo' ) -> getPath (), '->addPrefix() ensures a prefix must start with a slash and must not end with a slash' );
2012-10-06 00:21:17 +01:00
$collection -> addPrefix ( '/ /' );
2012-12-07 10:09:21 +00:00
$this -> assertSame ( '/ /0/{admin}/foo' , $collection -> get ( 'foo' ) -> getPath (), '->addPrefix() can handle spaces if desired' );
$this -> assertSame ( '/ /0/{admin}/bar' , $collection -> get ( 'bar' ) -> getPath (), 'the route pattern of an added collection is in synch with the added prefix' );
2010-06-24 07:46:50 +01:00
}
2011-10-23 13:45:47 +01:00
public function testAddPrefixOverridesDefaultsAndRequirements ()
{
$collection = new RouteCollection ();
2015-01-11 06:38:48 +00:00
$collection -> add ( 'foo' , $foo = new Route ( '/foo.{_format}' ));
$collection -> add ( 'bar' , $bar = new Route ( '/bar.{_format}' , array (), array ( '_format' => 'json' )));
$collection -> addPrefix ( '/admin' , array (), array ( '_format' => 'html' ));
2011-10-23 13:45:47 +01:00
2015-01-11 06:38:48 +00:00
$this -> assertEquals ( 'html' , $collection -> get ( 'foo' ) -> getRequirement ( '_format' ), '->addPrefix() overrides existing requirements' );
$this -> assertEquals ( 'html' , $collection -> get ( 'bar' ) -> getRequirement ( '_format' ), '->addPrefix() overrides existing requirements' );
2011-10-23 13:45:47 +01:00
}
2010-06-24 07:46:50 +01:00
public function testResource ()
{
$collection = new RouteCollection ();
2010-06-28 08:15:15 +01:00
$collection -> addResource ( $foo = new FileResource ( __DIR__ . '/Fixtures/foo.xml' ));
2012-12-07 12:28:59 +00:00
$collection -> addResource ( $bar = new FileResource ( __DIR__ . '/Fixtures/bar.xml' ));
$collection -> addResource ( new FileResource ( __DIR__ . '/Fixtures/foo.xml' ));
$this -> assertEquals ( array ( $foo , $bar ), $collection -> getResources (),
'->addResource() adds a resource and getResources() only returns unique ones by comparing the string representation' );
2010-06-24 07:46:50 +01:00
}
2012-04-01 11:32:28 +01:00
public function testUniqueRouteWithGivenName ()
{
$collection1 = new RouteCollection ();
$collection1 -> add ( 'foo' , new Route ( '/old' ));
$collection2 = new RouteCollection ();
$collection3 = new RouteCollection ();
$collection3 -> add ( 'foo' , $new = new Route ( '/new' ));
$collection2 -> addCollection ( $collection3 );
2012-11-26 17:29:17 +00:00
$collection1 -> addCollection ( $collection2 );
2012-04-01 11:32:28 +01:00
$this -> assertSame ( $new , $collection1 -> get ( 'foo' ), '->get() returns new route that overrode previous one' );
2012-11-26 17:29:17 +00:00
// size of 1 because collection1 contains /new but not /old anymore
$this -> assertCount ( 1 , $collection1 -> getIterator (), '->addCollection() removes previous routes when adding new routes with the same name' );
2012-04-01 11:32:28 +01:00
}
public function testGet ()
{
$collection1 = new RouteCollection ();
$collection1 -> add ( 'a' , $a = new Route ( '/a' ));
$collection2 = new RouteCollection ();
$collection2 -> add ( 'b' , $b = new Route ( '/b' ));
$collection1 -> addCollection ( $collection2 );
2012-12-07 10:59:02 +00:00
$collection1 -> add ( '$péß^a|' , $c = new Route ( '/special' ));
2012-04-01 11:32:28 +01:00
$this -> assertSame ( $b , $collection1 -> get ( 'b' ), '->get() returns correct route in child collection' );
2012-12-07 10:59:02 +00:00
$this -> assertSame ( $c , $collection1 -> get ( '$péß^a|' ), '->get() can handle special characters' );
2012-04-01 11:32:28 +01:00
$this -> assertNull ( $collection2 -> get ( 'a' ), '->get() does not return the route defined in parent collection' );
$this -> assertNull ( $collection1 -> get ( 'non-existent' ), '->get() returns null when route does not exist' );
$this -> assertNull ( $collection1 -> get ( 0 ), '->get() does not disclose internal child RouteCollection' );
}
2012-12-07 10:59:02 +00:00
public function testRemove ()
{
$collection = new RouteCollection ();
$collection -> add ( 'foo' , $foo = new Route ( '/foo' ));
$collection1 = new RouteCollection ();
$collection1 -> add ( 'bar' , $bar = new Route ( '/bar' ));
$collection -> addCollection ( $collection1 );
$collection -> add ( 'last' , $last = new Route ( '/last' ));
$collection -> remove ( 'foo' );
$this -> assertSame ( array ( 'bar' => $bar , 'last' => $last ), $collection -> all (), '->remove() can remove a single route' );
$collection -> remove ( array ( 'bar' , 'last' ));
$this -> assertSame ( array (), $collection -> all (), '->remove() accepts an array and can remove multiple routes at once' );
}
2013-01-21 16:57:28 +00:00
public function testSetHost ()
2012-04-25 03:01:35 +01:00
{
$collection = new RouteCollection ();
$routea = new Route ( '/a' );
$routeb = new Route ( '/b' , array (), array (), array (), '{locale}.example.net' );
$collection -> add ( 'a' , $routea );
$collection -> add ( 'b' , $routeb );
2013-01-21 16:57:28 +00:00
$collection -> setHost ( '{locale}.example.com' );
2012-04-25 03:01:35 +01:00
2013-01-21 16:57:28 +00:00
$this -> assertEquals ( '{locale}.example.com' , $routea -> getHost ());
$this -> assertEquals ( '{locale}.example.com' , $routeb -> getHost ());
2012-04-25 03:01:35 +01:00
}
2013-09-04 08:25:51 +01:00
public function testSetCondition ()
{
$collection = new RouteCollection ();
$routea = new Route ( '/a' );
$routeb = new Route ( '/b' , array (), array (), array (), '{locale}.example.net' , array (), array (), 'context.getMethod() == "GET"' );
$collection -> add ( 'a' , $routea );
$collection -> add ( 'b' , $routeb );
$collection -> setCondition ( 'context.getMethod() == "POST"' );
$this -> assertEquals ( 'context.getMethod() == "POST"' , $routea -> getCondition ());
$this -> assertEquals ( 'context.getMethod() == "POST"' , $routeb -> getCondition ());
}
2014-01-05 02:10:50 +00:00
2014-01-01 13:36:01 +00:00
public function testClone ()
{
$collection = new RouteCollection ();
$collection -> add ( 'a' , new Route ( '/a' ));
$collection -> add ( 'b' , new Route ( '/b' , array ( 'placeholder' => 'default' ), array ( 'placeholder' => '.+' )));
$clonedCollection = clone $collection ;
$this -> assertCount ( 2 , $clonedCollection );
$this -> assertEquals ( $collection -> get ( 'a' ), $clonedCollection -> get ( 'a' ));
$this -> assertNotSame ( $collection -> get ( 'a' ), $clonedCollection -> get ( 'a' ));
$this -> assertEquals ( $collection -> get ( 'b' ), $clonedCollection -> get ( 'b' ));
$this -> assertNotSame ( $collection -> get ( 'b' ), $clonedCollection -> get ( 'b' ));
}
public function testSetSchemes ()
{
$collection = new RouteCollection ();
$routea = new Route ( '/a' , array (), array (), array (), '' , 'http' );
$routeb = new Route ( '/b' );
$collection -> add ( 'a' , $routea );
$collection -> add ( 'b' , $routeb );
$collection -> setSchemes ( array ( 'http' , 'https' ));
$this -> assertEquals ( array ( 'http' , 'https' ), $routea -> getSchemes ());
$this -> assertEquals ( array ( 'http' , 'https' ), $routeb -> getSchemes ());
}
public function testSetMethods ()
{
$collection = new RouteCollection ();
$routea = new Route ( '/a' , array (), array (), array (), '' , array (), array ( 'GET' , 'POST' ));
$routeb = new Route ( '/b' );
$collection -> add ( 'a' , $routea );
$collection -> add ( 'b' , $routeb );
$collection -> setMethods ( 'PUT' );
$this -> assertEquals ( array ( 'PUT' ), $routea -> getMethods ());
$this -> assertEquals ( array ( 'PUT' ), $routeb -> getMethods ());
}
2010-06-24 07:46:50 +01:00
}