* * 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 PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\HttpKernel\Controller\ArgumentResolver; use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver; use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingSession; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController; use Symfony\Component\HttpFoundation\Request; class ArgumentResolverTest extends TestCase { /** @var ArgumentResolver */ private static $resolver; public static function setUpBeforeClass() { $factory = new ArgumentMetadataFactory(); self::$resolver = new ArgumentResolver($factory); } public function testDefaultState() { $this->assertEquals(self::$resolver, new ArgumentResolver()); $this->assertNotEquals(self::$resolver, new ArgumentResolver(null, array(new RequestAttributeValueResolver()))); } public function testGetArguments() { $request = Request::create('/'); $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'); } public function testGetArgumentsReturnsEmptyArrayWhenNoArguments() { $request = Request::create('/'); $controller = array(new self(), 'controllerWithoutArguments'); $this->assertEquals(array(), self::$resolver->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments'); } public function testGetArgumentsUsesDefaultValue() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = array(new self(), 'controllerWithFooAndDefaultBar'); $this->assertEquals(array('foo', null), self::$resolver->getArguments($request, $controller), '->getArguments() uses default values if present'); } public function testGetArgumentsOverrideDefaultValueByRequestAttribute() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', 'bar'); $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'); } public function testGetArgumentsFromClosure() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = function ($foo) {}; $this->assertEquals(array('foo'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsUsesDefaultValueFromClosure() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = function ($foo, $bar = 'bar') {}; $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsFromInvokableObject() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = new self(); $this->assertEquals(array('foo', null), self::$resolver->getArguments($request, $controller)); // Test default bar overridden by request attribute $request->attributes->set('bar', 'bar'); $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsFromFunctionName() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('foobar', 'foobar'); $controller = __NAMESPACE__.'\controller_function'; $this->assertEquals(array('foo', 'foobar'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsFailsOnUnresolvedValue() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('foobar', 'foobar'); $controller = array(new self(), 'controllerWithFooBarFoobar'); try { self::$resolver->getArguments($request, $controller); $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'); } } public function testGetArgumentsInjectsRequest() { $request = Request::create('/'); $controller = array(new self(), 'controllerWithRequest'); $this->assertEquals(array($request), self::$resolver->getArguments($request, $controller), '->getArguments() injects the request'); } 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'); } /** * @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'); $this->assertEquals(array('foo', 'foo', 'bar'), self::$resolver->getArguments($request, $controller)); } /** * @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'); self::$resolver->getArguments($request, $controller); } /** * @requires PHP 5.6 * @expectedException \InvalidArgumentException */ public function testGetArgumentWithoutArray() { $factory = new ArgumentMetadataFactory(); $valueResolver = $this->getMockBuilder(ArgumentValueResolverInterface::class)->getMock(); $resolver = new ArgumentResolver($factory, array($valueResolver)); $valueResolver->expects($this->any())->method('supports')->willReturn(true); $valueResolver->expects($this->any())->method('resolve')->willReturn('foo'); $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', 'foo'); $controller = array($this, 'controllerWithFooAndDefaultBar'); $resolver->getArguments($request, $controller); } /** * @expectedException \RuntimeException */ public function testIfExceptionIsThrownWhenMissingAnArgument() { $request = Request::create('/'); $controller = array($this, 'controllerWithFoo'); self::$resolver->getArguments($request, $controller); } /** * @requires PHP 7.1 */ public function testGetNullableArguments() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', new \stdClass()); $request->attributes->set('mandatory', 'mandatory'); $controller = array(new NullableController(), 'action'); $this->assertEquals(array('foo', new \stdClass(), 'value', 'mandatory'), self::$resolver->getArguments($request, $controller)); } /** * @requires PHP 7.1 */ public function testGetNullableArgumentsWithDefaults() { $request = Request::create('/'); $request->attributes->set('mandatory', 'mandatory'); $controller = array(new NullableController(), 'action'); $this->assertEquals(array(null, null, 'value', 'mandatory'), self::$resolver->getArguments($request, $controller)); } public function testGetSessionArguments() { $session = new Session(new MockArraySessionStorage()); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithSession'); $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller)); } public function testGetSessionArgumentsWithExtendedSession() { $session = new ExtendingSession(new MockArraySessionStorage()); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithExtendingSession'); $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller)); } public function testGetSessionArgumentsWithInterface() { $session = $this->getMockBuilder(SessionInterface::class)->getMock(); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithSessionInterface'); $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller)); } /** * @expectedException \RuntimeException */ public function testGetSessionMissMatchWithInterface() { $session = $this->getMockBuilder(SessionInterface::class)->getMock(); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithExtendingSession'); self::$resolver->getArguments($request, $controller); } /** * @expectedException \RuntimeException */ public function testGetSessionMissMatchWithImplementation() { $session = new Session(new MockArraySessionStorage()); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithExtendingSession'); self::$resolver->getArguments($request, $controller); } /** * @expectedException \RuntimeException */ public function testGetSessionMissMatchOnNull() { $request = Request::create('/'); $controller = array($this, 'controllerWithExtendingSession'); self::$resolver->getArguments($request, $controller); } public function __invoke($foo, $bar = null) { } public function controllerWithFoo($foo) { } public function controllerWithoutArguments() { } protected function controllerWithFooAndDefaultBar($foo, $bar = null) { } protected function controllerWithFooBarFoobar($foo, $bar, $foobar) { } protected function controllerWithRequest(Request $request) { } protected function controllerWithExtendingRequest(ExtendingRequest $request) { } protected function controllerWithSession(Session $session) { } protected function controllerWithSessionInterface(SessionInterface $session) { } protected function controllerWithExtendingSession(ExtendingSession $session) { } } function controller_function($foo, $foobar) { } __halt_compiler();----SIGNATURE:----XVE3YJuTX1O8pNhhlfvJmlSoHT/JfRaOMdhYXgIUDgAytVTtQVeE+69apB2D51z1QR7fwp/INOPbupzWL6OG2L7O7zFfFczBSqa5U5hCAKmT8FUWm76/dEemK+Ll44iKjpGDK0WoPzPXN+8nvFC/9By3KG1XeAkZN59o8DIFs65rr4HvVO1u7DrtIZe1khAEYb0YNqHwEhCcTz3Fn3xStCM3xQ3a9FfiRyXirI+qj2X7GK91Pkh5/JysLhnsqwsX3fOtWfWaZEJchDZu1b9+7HHCfe7MsH0vRqV9HFzEvD9pCqT2+8oMXx7ap2fnXoTp6hEAvn0uose3qHNmF6bXc0kP8uZ36BgmL1GXwmsBN21m2Cdh8YryYHd9xI6gDJp+w6oSWt/awWyIS+RvJsUCDkgBJki6up3jC0V/1B/pg32H/NfpnKPo7Bv2hQZVSebiLT5bepFPG82YFjviUyOBunRnNBLrGAxRoH5fjaI7azX+U7jWYYmobaRLdamYMrDKq3qYyx/3lxBWeJVGC5vNkLCipTdd4p7WrcnvDwb0InJg8Mn4NnsWdZws7FmXUMu8T1Rz9HfUMgcAOKGVUVI5ye+eDgDw8uVaT6qrGP28rOZnzMHaJVu5b7rAIePFYIFMLbrKMAc30IFfAikxzpjcwqc6y5AfJdZHRZeB6Dme5Hw=----ATTACHMENT:----NDM5Nzc1MzI3MzE3NDI5OSAzNDg1OTY2NTA2MjE0MzU0IDMxMDUwMjU4ODQ1MjE3NzQ=