/
githubmirror
/
symfony
Обзор
Документация
Войти
/
githubmirror
/
symfony
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
8.2
src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php
182 строки
8 KB
Christian Flothmann
Merge branch '8.0' into 8.1
21 дек 2025, 14:11
21 дек 2025, 14:11
9fd3b36
Код
Авторство
О чём код?
<?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\Security\Http\Tests\Controller; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ArgumentResolver; use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\Security\Core\Authentication\Token\NullToken; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Symfony\Component\Security\Core\User\InMemoryUser; use Symfony\Component\Security\Core\User\OAuth2User; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Http\Attribute\CurrentUser; use Symfony\Component\Security\Http\Controller\UserValueResolver; use Symfony\Component\Security\Http\Tests\Fixtures\CustomUser; class UserValueResolverTest extends TestCase { public function testSupportsFailsWithNoType() { $tokenStorage = new TokenStorage(); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', null, false, false, null); $this->assertSame([], $resolver->resolve(Request::create('/'), $metadata)); } public function testSupportsFailsWhenDefaultValAndNoUser() { $tokenStorage = new TokenStorage(); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', UserInterface::class, false, true, $default = new InMemoryUser('username', 'password')); $this->assertSame([$default], $resolver->resolve(Request::create('/'), $metadata)); } public function testResolveSucceedsWithUserInterface() { $user = new InMemoryUser('username', 'password'); $token = new UsernamePasswordToken($user, 'provider'); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', UserInterface::class, false, false, null); $this->assertSame([$user], $resolver->resolve(Request::create('/'), $metadata)); } public function testResolveSucceedsWithSubclassType() { $user = new InMemoryUser('username', 'password'); $token = new UsernamePasswordToken($user, 'provider'); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', InMemoryUser::class, false, false, null, false, [new CurrentUser()]); $this->assertSame([$user], $resolver->resolve(Request::create('/'), $metadata)); } public function testResolveSucceedsWithNullableParamAndNoUser() { $token = new NullToken(); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', InMemoryUser::class, false, false, null, true, [new CurrentUser()]); $this->assertSame([null], $resolver->resolve(Request::create('/'), $metadata)); } public function testResolveSucceedsWithNullableAttribute() { $user = new InMemoryUser('username', 'password'); $token = new UsernamePasswordToken($user, 'provider'); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', null, false, false, null, false, [new CurrentUser()]); $this->assertSame([$user], $resolver->resolve(Request::create('/'), $metadata)); } public function testResolveSucceedsWithTypedAttribute() { $user = new InMemoryUser('username', 'password'); $token = new UsernamePasswordToken($user, 'provider'); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', InMemoryUser::class, false, false, null, false, [new CurrentUser()]); $this->assertSame([$user], $resolver->resolve(Request::create('/'), $metadata)); } public function testResolveSucceedsWithUnionTypedAttribute() { $user = new InMemoryUser('username', 'password'); $token = new UsernamePasswordToken($user, 'provider'); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', InMemoryUser::class.'|'.OAuth2User::class, false, false, null, false, [new CurrentUser()]); $this->assertSame([$user], $resolver->resolve(Request::create('/'), $metadata)); } public function testResolveThrowsAccessDeniedWithWrongUserClass() { $user = new CustomUser('John', ['ROLE_USER'], 'password', 'hash'); $token = new UsernamePasswordToken($user, 'provider'); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', InMemoryUser::class, false, false, null, false, [new CurrentUser()]); $this->expectException(AccessDeniedException::class); $this->expectExceptionMessage(\sprintf('The logged-in user is an instance of "%s" but a user of type "Symfony\Component\Security\Core\User\InMemoryUser" is expected.', $user::class)); $resolver->resolve(Request::create('/'), $metadata); } public function testResolveThrowsAccessDeniedWithAttributeAndNoUser() { $tokenStorage = new TokenStorage(); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', UserInterface::class, false, false, null, false, [new CurrentUser()]); $this->expectException(AccessDeniedException::class); $this->expectExceptionMessage('There is no logged-in user to pass to $foo, make the argument nullable if you want to allow anonymous access to the action.'); $resolver->resolve(Request::create('/'), $metadata); } public function testResolveThrowsAcessDeniedWithNoToken() { $tokenStorage = new TokenStorage(); $resolver = new UserValueResolver($tokenStorage); $metadata = new ArgumentMetadata('foo', UserInterface::class, false, false, null); $this->expectException(AccessDeniedException::class); $resolver->resolve(Request::create('/'), $metadata); } public function testIntegration() { $user = new InMemoryUser('username', 'password'); $token = new UsernamePasswordToken($user, 'provider'); $tokenStorage = new TokenStorage(); $tokenStorage->setToken($token); $argumentResolver = new ArgumentResolver(null, [new UserValueResolver($tokenStorage)]); $this->assertSame([$user], $argumentResolver->getArguments(Request::create('/'), static function (UserInterface $user) {})); } public function testIntegrationNoUser() { $tokenStorage = new TokenStorage(); $argumentResolver = new ArgumentResolver(null, [new UserValueResolver($tokenStorage), new DefaultValueResolver()]); $this->assertSame([null], $argumentResolver->getArguments(Request::create('/'), static function (?UserInterface $user = null) {})); } }