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 ()
{
2012-03-28 14:43:52 +01:00
if ( ! class_exists ( 'Symfony\Component\Config\Resource\FileResource' )) {
$this -> markTestSkipped ( 'The "Config" component is not available' );
}
2010-06-24 07:46:50 +01:00
$collection = new RouteCollection ();
2010-11-23 08:42:19 +00:00
$collection -> add ( 'foo' , $foo = new Route ( '/foo' ));
2010-06-24 07:46:50 +01:00
$collection1 = new RouteCollection ();
2010-11-23 08:42:19 +00:00
$collection1 -> add ( 'foo' , $foo1 = new Route ( '/foo1' ));
$collection1 -> add ( 'bar' , $bar1 = new Route ( '/bar1' ));
2010-06-24 07:46:50 +01:00
$collection -> addCollection ( $collection1 );
2010-11-23 08:42:19 +00:00
$this -> assertEquals ( array ( 'foo' => $foo1 , 'bar' => $bar1 ), $collection -> all (), '->addCollection() adds routes from another collection' );
2010-06-24 07:46:50 +01:00
$collection = new RouteCollection ();
2010-11-23 08:42:19 +00:00
$collection -> add ( 'foo' , $foo = new Route ( '/foo' ));
2010-06-24 07:46:50 +01:00
$collection1 = new RouteCollection ();
2010-11-23 08:42:19 +00:00
$collection1 -> add ( 'foo' , $foo1 = new Route ( '/foo1' ));
2012-04-04 02:35:48 +01:00
$collection -> addCollection ( $collection1 , '/{foo}' , array ( 'foo' => 'foo' ), array ( 'foo' => '\d+' ), array ( 'foo' => 'bar' ));
2013-01-14 16:36:16 +00:00
$this -> assertEquals ( '/{foo}/foo1' , $collection -> get ( 'foo' ) -> getPath (), '->addCollection() can add a prefix to all merged routes' );
2011-10-23 10:56:23 +01:00
$this -> assertEquals ( array ( 'foo' => 'foo' ), $collection -> get ( 'foo' ) -> getDefaults (), '->addCollection() can add a prefix to all merged routes' );
$this -> assertEquals ( array ( 'foo' => '\d+' ), $collection -> get ( 'foo' ) -> getRequirements (), '->addCollection() can add a prefix to all merged routes' );
2012-04-04 02:35:48 +01:00
$this -> assertEquals (
array ( 'foo' => 'bar' , 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler' ),
$collection -> get ( 'foo' ) -> getOptions (), '->addCollection() can add an option to all merged routes'
);
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' );
}
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 ( ' / ' );
2012-12-07 10:09:21 +00:00
$this -> assertSame ( '/foo' , $collection -> get ( 'foo' ) -> getPattern (), '->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' );
2012-12-07 10:09:21 +00:00
$this -> assertEquals ( '/0/{admin}/foo' , $collection -> get ( 'foo' ) -> getPattern (), '->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 ();
$collection -> add ( 'foo' , $foo = new Route ( '/foo' ));
$collection -> add ( 'bar' , $bar = new Route ( '/bar' , array (), array ( '_scheme' => 'http' )));
$collection -> addPrefix ( '/admin' , array (), array ( '_scheme' => 'https' ));
$this -> assertEquals ( 'https' , $collection -> get ( 'foo' ) -> getRequirement ( '_scheme' ), '->addPrefix() overrides existing requirements' );
$this -> assertEquals ( 'https' , $collection -> get ( 'bar' ) -> getRequirement ( '_scheme' ), '->addPrefix() overrides existing requirements' );
}
2012-02-02 04:53:43 +00:00
public function testAddCollectionOverridesDefaultsAndRequirements ()
{
$imported = new RouteCollection ();
$imported -> add ( 'foo' , $foo = new Route ( '/foo' ));
$imported -> add ( 'bar' , $bar = new Route ( '/bar' , array (), array ( '_scheme' => 'http' )));
$collection = new RouteCollection ();
$collection -> addCollection ( $imported , null , array (), array ( '_scheme' => 'https' ));
$this -> assertEquals ( 'https' , $collection -> get ( 'foo' ) -> getRequirement ( '_scheme' ), '->addCollection() overrides existing requirements' );
$this -> assertEquals ( 'https' , $collection -> get ( 'bar' ) -> getRequirement ( '_scheme' ), '->addCollection() overrides existing requirements' );
}
2010-06-24 07:46:50 +01:00
public function testResource ()
{
2012-03-28 14:43:52 +01:00
if ( ! class_exists ( 'Symfony\Component\Config\Resource\FileResource' )) {
$this -> markTestSkipped ( 'The "Config" component is not available' );
}
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
$this -> assertEquals ( array ( $foo ), $collection -> getResources (), '->addResources() adds a resource' );
}
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 );
$this -> assertSame ( $b , $collection1 -> get ( 'b' ), '->get() returns correct route in child collection' );
$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' );
}
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
}
2010-06-24 07:46:50 +01:00
}