2016-03-16 07:56:41 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpKernel\Tests\Controller ;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver ;
2016-04-01 07:34:22 +01:00
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver ;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver ;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver ;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver ;
2016-03-25 09:46:04 +00:00
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface ;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory ;
2016-04-01 07:34:22 +01:00
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest ;
2016-03-16 07:56:41 +00:00
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController ;
use Symfony\Component\HttpFoundation\Request ;
class ArgumentResolverTest extends \PHPUnit_Framework_TestCase
{
2016-04-01 06:14:26 +01:00
/** @var ArgumentResolver */
private static $resolver ;
public static function setUpBeforeClass ()
2016-03-16 07:56:41 +00:00
{
2016-03-25 09:46:04 +00:00
$factory = new ArgumentMetadataFactory ();
$argumentValueResolvers = array (
2016-04-01 07:34:22 +01:00
new RequestAttributeValueResolver (),
new RequestValueResolver (),
new DefaultValueResolver (),
new VariadicValueResolver (),
2016-03-25 09:46:04 +00:00
);
2016-04-01 06:14:26 +01:00
self :: $resolver = new ArgumentResolver ( $factory , $argumentValueResolvers );
}
2016-03-16 07:56:41 +00:00
2016-04-01 07:34:22 +01:00
public function testDefaultState ()
{
$this -> assertEquals ( self :: $resolver , new ArgumentResolver ());
$this -> assertNotEquals ( self :: $resolver , new ArgumentResolver ( null , array ( new RequestAttributeValueResolver ())));
}
2016-04-01 06:14:26 +01:00
public function testGetArguments ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
2016-04-01 06:14:26 +01:00
$request -> attributes -> set ( 'foo' , 'foo' );
$controller = array ( new self (), 'controllerWithFoo' );
$this -> assertEquals ( array ( 'foo' ), self :: $resolver -> getArguments ( $request , $controller ), '->getArguments() returns an array of arguments for the controller method' );
}
2016-03-16 07:56:41 +00:00
2016-04-01 06:14:26 +01:00
public function testGetArgumentsReturnsEmptyArrayWhenNoArguments ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
2016-04-01 06:14:26 +01:00
$controller = array ( new self (), 'controllerWithoutArguments' );
$this -> assertEquals ( array (), self :: $resolver -> getArguments ( $request , $controller ), '->getArguments() returns an empty array if the method takes no arguments' );
}
2016-03-16 07:56:41 +00:00
2016-04-01 06:14:26 +01:00
public function testGetArgumentsUsesDefaultValue ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
2016-04-01 06:14:26 +01:00
$controller = array ( new self (), 'controllerWithFooAndDefaultBar' );
$this -> assertEquals ( array ( 'foo' , null ), self :: $resolver -> getArguments ( $request , $controller ), '->getArguments() uses default values if present' );
}
2016-03-16 07:56:41 +00:00
2016-04-01 06:14:26 +01:00
public function testGetArgumentsOverrideDefaultValueByRequestAttribute ()
{
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
2016-03-16 07:56:41 +00:00
$request -> attributes -> set ( 'bar' , 'bar' );
2016-04-01 06:14:26 +01:00
$controller = array ( new self (), 'controllerWithFooAndDefaultBar' );
$this -> assertEquals ( array ( 'foo' , 'bar' ), self :: $resolver -> getArguments ( $request , $controller ), '->getArguments() overrides default values if provided in the request attributes' );
}
2016-03-16 07:56:41 +00:00
2016-04-01 06:14:26 +01:00
public function testGetArgumentsFromClosure ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
$controller = function ( $foo ) {};
2016-04-01 06:14:26 +01:00
$this -> assertEquals ( array ( 'foo' ), self :: $resolver -> getArguments ( $request , $controller ));
}
public function testGetArgumentsUsesDefaultValueFromClosure ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
$controller = function ( $foo , $bar = 'bar' ) {};
2016-04-01 06:14:26 +01:00
$this -> assertEquals ( array ( 'foo' , 'bar' ), self :: $resolver -> getArguments ( $request , $controller ));
}
public function testGetArgumentsFromInvokableObject ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
$controller = new self ();
2016-04-01 06:14:26 +01:00
$this -> assertEquals ( array ( 'foo' , null ), self :: $resolver -> getArguments ( $request , $controller ));
// Test default bar overridden by request attribute
2016-03-16 07:56:41 +00:00
$request -> attributes -> set ( 'bar' , 'bar' );
2016-04-01 06:14:26 +01:00
$this -> assertEquals ( array ( 'foo' , 'bar' ), self :: $resolver -> getArguments ( $request , $controller ));
}
public function testGetArgumentsFromFunctionName ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
$request -> attributes -> set ( 'foobar' , 'foobar' );
2016-04-01 06:14:26 +01:00
$controller = __NAMESPACE__ . '\controller_function' ;
$this -> assertEquals ( array ( 'foo' , 'foobar' ), self :: $resolver -> getArguments ( $request , $controller ));
}
2016-03-16 07:56:41 +00:00
2016-04-01 06:14:26 +01:00
public function testGetArgumentsFailsOnUnresolvedValue ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
$request -> attributes -> set ( 'foobar' , 'foobar' );
2016-04-01 06:14:26 +01:00
$controller = array ( new self (), 'controllerWithFooBarFoobar' );
2016-03-16 07:56:41 +00:00
try {
2016-04-01 06:14:26 +01:00
self :: $resolver -> getArguments ( $request , $controller );
2016-03-16 07:56:41 +00:00
$this -> fail ( '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value' );
} catch ( \Exception $e ) {
$this -> assertInstanceOf ( '\RuntimeException' , $e , '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value' );
}
2016-04-01 06:14:26 +01:00
}
2016-03-16 07:56:41 +00:00
2016-04-01 06:14:26 +01:00
public function testGetArgumentsInjectsRequest ()
{
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
2016-04-01 06:14:26 +01:00
$controller = array ( new self (), 'controllerWithRequest' );
$this -> assertEquals ( array ( $request ), self :: $resolver -> getArguments ( $request , $controller ), '->getArguments() injects the request' );
2016-03-16 07:56:41 +00:00
}
2016-04-01 07:34:22 +01:00
public function testGetArgumentsInjectsExtendingRequest ()
{
$request = ExtendingRequest :: create ( '/' );
$controller = array ( new self (), 'controllerWithExtendingRequest' );
$this -> assertEquals ( array ( $request ), self :: $resolver -> getArguments ( $request , $controller ), '->getArguments() injects the request when extended' );
}
2016-03-16 07:56:41 +00:00
/**
* @ requires PHP 5.6
*/
public function testGetVariadicArguments ()
{
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
$request -> attributes -> set ( 'bar' , array ( 'foo' , 'bar' ));
$controller = array ( new VariadicController (), 'action' );
2016-04-01 06:14:26 +01:00
$this -> assertEquals ( array ( 'foo' , 'foo' , 'bar' ), self :: $resolver -> getArguments ( $request , $controller ));
2016-03-16 07:56:41 +00:00
}
2016-03-25 09:46:04 +00:00
/**
* @ requires PHP 5.6
* @ expectedException \InvalidArgumentException
*/
public function testGetVariadicArgumentsWithoutArrayInRequest ()
{
$request = Request :: create ( '/' );
$request -> attributes -> set ( 'foo' , 'foo' );
$request -> attributes -> set ( 'bar' , 'foo' );
$controller = array ( new VariadicController (), 'action' );
2016-04-01 06:14:26 +01:00
self :: $resolver -> getArguments ( $request , $controller );
2016-03-25 09:46:04 +00:00
}
/**
* @ requires PHP 5.6
* @ expectedException \InvalidArgumentException
*/
public function testGetArgumentWithoutArray ()
2016-03-16 07:56:41 +00:00
{
2016-03-25 09:46:04 +00:00
$factory = new ArgumentMetadataFactory ();
$valueResolver = $this -> getMock ( ArgumentValueResolverInterface :: class );
$resolver = new ArgumentResolver ( $factory , array ( $valueResolver ));
$valueResolver -> expects ( $this -> any ()) -> method ( 'supports' ) -> willReturn ( true );
$valueResolver -> expects ( $this -> any ()) -> method ( 'resolve' ) -> willReturn ( 'foo' );
2016-03-16 07:56:41 +00:00
$request = Request :: create ( '/' );
2016-03-25 09:46:04 +00:00
$request -> attributes -> set ( 'foo' , 'foo' );
$request -> attributes -> set ( 'bar' , 'foo' );
2016-04-01 06:14:26 +01:00
$controller = array ( $this , 'controllerWithFooAndDefaultBar' );
2016-03-25 09:46:04 +00:00
$resolver -> getArguments ( $request , $controller );
2016-03-16 07:56:41 +00:00
}
public function __invoke ( $foo , $bar = null )
{
}
2016-04-01 06:14:26 +01:00
public function controllerWithFoo ( $foo )
2016-03-16 07:56:41 +00:00
{
}
2016-04-01 06:14:26 +01:00
public function controllerWithoutArguments ()
2016-03-16 07:56:41 +00:00
{
}
2016-04-01 06:14:26 +01:00
protected function controllerWithFooAndDefaultBar ( $foo , $bar = null )
2016-03-16 07:56:41 +00:00
{
}
2016-04-01 06:14:26 +01:00
protected function controllerWithFooBarFoobar ( $foo , $bar , $foobar )
2016-03-16 07:56:41 +00:00
{
}
2016-04-01 06:14:26 +01:00
protected function controllerWithRequest ( Request $request )
2016-03-16 07:56:41 +00:00
{
}
2016-04-01 07:34:22 +01:00
protected function controllerWithExtendingRequest ( ExtendingRequest $request )
{
}
2016-03-16 07:56:41 +00:00
}
2016-04-01 06:14:26 +01:00
function controller_function ( $foo , $foobar )
2016-03-16 07:56:41 +00:00
{
}