|
19 | 19 | use Symfony\Component\DependencyInjection\ServiceLocator;
|
20 | 20 | use Symfony\Component\HttpFoundation\Request;
|
21 | 21 | use Symfony\Component\HttpFoundation\RequestStack;
|
| 22 | +use Symfony\Component\HttpFoundation\Response; |
22 | 23 | use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
23 | 24 | use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
24 | 25 | use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
|
25 | 26 | use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
|
| 27 | +use Symfony\Component\Security\Core\Exception\LogicException; |
26 | 28 | use Symfony\Component\Security\Core\User\InMemoryUser;
|
27 | 29 | use Symfony\Component\Security\Core\User\UserCheckerInterface;
|
28 | 30 | use Symfony\Component\Security\Core\User\UserInterface;
|
29 | 31 | use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
|
30 | 32 | use Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface;
|
| 33 | +use Symfony\Component\Security\Http\Event\LogoutEvent; |
| 34 | +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; |
31 | 35 | use Symfony\Contracts\Service\ServiceProviderInterface;
|
32 | 36 |
|
33 | 37 | class SecurityTest extends TestCase
|
@@ -117,7 +121,7 @@ public function getFirewallConfigTests()
|
117 | 121 | yield [$request, new FirewallConfig('main', 'acme_user_checker')];
|
118 | 122 | }
|
119 | 123 |
|
120 |
| - public function testAutoLogin() |
| 124 | + public function testLogin() |
121 | 125 | {
|
122 | 126 | $request = new Request();
|
123 | 127 | $authenticator = $this->createMock(AuthenticatorInterface::class);
|
@@ -163,6 +167,180 @@ public function testAutoLogin()
|
163 | 167 | $security->login($user);
|
164 | 168 | }
|
165 | 169 |
|
| 170 | + public function testLogout() |
| 171 | + { |
| 172 | + $request = new Request(); |
| 173 | + $requestStack = $this->createMock(RequestStack::class); |
| 174 | + $requestStack |
| 175 | + ->expects($this->once()) |
| 176 | + ->method('getMainRequest') |
| 177 | + ->willReturn($request) |
| 178 | + ; |
| 179 | + |
| 180 | + $token = $this->createMock(TokenInterface::class); |
| 181 | + $tokenStorage = $this->createMock(TokenStorageInterface::class); |
| 182 | + $tokenStorage |
| 183 | + ->expects($this->once()) |
| 184 | + ->method('getToken') |
| 185 | + ->willReturn($token) |
| 186 | + ; |
| 187 | + $tokenStorage |
| 188 | + ->expects($this->once()) |
| 189 | + ->method('setToken') |
| 190 | + ; |
| 191 | + |
| 192 | + $eventDispatcher = $this->createMock(EventDispatcherInterface::class); |
| 193 | + $eventDispatcher |
| 194 | + ->expects($this->once()) |
| 195 | + ->method('dispatch') |
| 196 | + ->with(new LogoutEvent($request, $token)) |
| 197 | + ; |
| 198 | + |
| 199 | + $firewallMap = $this->createMock(FirewallMap::class); |
| 200 | + $firewallConfig = new FirewallConfig('my_firewall', 'user_checker'); |
| 201 | + $firewallMap |
| 202 | + ->expects($this->once()) |
| 203 | + ->method('getFirewallConfig') |
| 204 | + ->willReturn($firewallConfig) |
| 205 | + ; |
| 206 | + |
| 207 | + $eventDispatcherLocator = $this->createMock(ContainerInterface::class); |
| 208 | + $eventDispatcherLocator |
| 209 | + ->expects($this->atLeastOnce()) |
| 210 | + ->method('get') |
| 211 | + ->willReturnMap([ |
| 212 | + ['my_firewall', $eventDispatcher], |
| 213 | + ]) |
| 214 | + ; |
| 215 | + |
| 216 | + $container = $this->createMock(ContainerInterface::class); |
| 217 | + $container |
| 218 | + ->expects($this->atLeastOnce()) |
| 219 | + ->method('get') |
| 220 | + ->willReturnMap([ |
| 221 | + ['request_stack', $requestStack], |
| 222 | + ['security.token_storage', $tokenStorage], |
| 223 | + ['security.firewall.map', $firewallMap], |
| 224 | + ['security.firewall.event_dispatcher_locator', $eventDispatcherLocator], |
| 225 | + ]) |
| 226 | + ; |
| 227 | + $security = new Security($container); |
| 228 | + $security->logout(); |
| 229 | + } |
| 230 | + |
| 231 | + public function testLogoutWithoutFirewall() |
| 232 | + { |
| 233 | + $request = new Request(); |
| 234 | + $requestStack = $this->createMock(RequestStack::class); |
| 235 | + $requestStack |
| 236 | + ->expects($this->once()) |
| 237 | + ->method('getMainRequest') |
| 238 | + ->willReturn($request) |
| 239 | + ; |
| 240 | + |
| 241 | + $token = $this->createMock(TokenInterface::class); |
| 242 | + $tokenStorage = $this->createMock(TokenStorageInterface::class); |
| 243 | + $tokenStorage |
| 244 | + ->expects($this->once()) |
| 245 | + ->method('getToken') |
| 246 | + ->willReturn($token) |
| 247 | + ; |
| 248 | + |
| 249 | + $firewallMap = $this->createMock(FirewallMap::class); |
| 250 | + $firewallMap |
| 251 | + ->expects($this->once()) |
| 252 | + ->method('getFirewallConfig') |
| 253 | + ->willReturn(null) |
| 254 | + ; |
| 255 | + |
| 256 | + $container = $this->createMock(ContainerInterface::class); |
| 257 | + $container |
| 258 | + ->expects($this->atLeastOnce()) |
| 259 | + ->method('get') |
| 260 | + ->willReturnMap([ |
| 261 | + ['request_stack', $requestStack], |
| 262 | + ['security.token_storage', $tokenStorage], |
| 263 | + ['security.firewall.map', $firewallMap], |
| 264 | + ]) |
| 265 | + ; |
| 266 | + |
| 267 | + $this->expectException(LogicException::class); |
| 268 | + $security = new Security($container); |
| 269 | + $security->logout(); |
| 270 | + } |
| 271 | + |
| 272 | + public function testLogoutWithResponse() |
| 273 | + { |
| 274 | + $request = new Request(); |
| 275 | + $requestStack = $this->createMock(RequestStack::class); |
| 276 | + $requestStack |
| 277 | + ->expects($this->once()) |
| 278 | + ->method('getMainRequest') |
| 279 | + ->willReturn($request) |
| 280 | + ; |
| 281 | + |
| 282 | + $token = $this->createMock(TokenInterface::class); |
| 283 | + $tokenStorage = $this->createMock(TokenStorageInterface::class); |
| 284 | + $tokenStorage |
| 285 | + ->expects($this->once()) |
| 286 | + ->method('getToken') |
| 287 | + ->willReturn($token) |
| 288 | + ; |
| 289 | + $tokenStorage |
| 290 | + ->expects($this->once()) |
| 291 | + ->method('setToken') |
| 292 | + ; |
| 293 | + |
| 294 | + $eventDispatcher = $this->createMock(EventDispatcherInterface::class); |
| 295 | + $eventDispatcher |
| 296 | + ->expects($this->once()) |
| 297 | + ->method('dispatch') |
| 298 | + ->willReturnCallback(function ($event) use ($request, $token) { |
| 299 | + $this->assertInstanceOf(LogoutEvent::class, $event); |
| 300 | + $this->assertEquals($request, $event->getRequest()); |
| 301 | + $this->assertEquals($token, $event->getToken()); |
| 302 | + |
| 303 | + $event->setResponse(new Response('a custom response')); |
| 304 | + |
| 305 | + return $event; |
| 306 | + }) |
| 307 | + ; |
| 308 | + |
| 309 | + $firewallMap = $this->createMock(FirewallMap::class); |
| 310 | + $firewallConfig = new FirewallConfig('my_firewall', 'user_checker'); |
| 311 | + $firewallMap |
| 312 | + ->expects($this->once()) |
| 313 | + ->method('getFirewallConfig') |
| 314 | + ->willReturn($firewallConfig) |
| 315 | + ; |
| 316 | + |
| 317 | + $eventDispatcherLocator = $this->createMock(ContainerInterface::class); |
| 318 | + $eventDispatcherLocator |
| 319 | + ->expects($this->atLeastOnce()) |
| 320 | + ->method('get') |
| 321 | + ->willReturnMap([ |
| 322 | + ['my_firewall', $eventDispatcher], |
| 323 | + ]) |
| 324 | + ; |
| 325 | + |
| 326 | + $container = $this->createMock(ContainerInterface::class); |
| 327 | + $container |
| 328 | + ->expects($this->atLeastOnce()) |
| 329 | + ->method('get') |
| 330 | + ->willReturnMap([ |
| 331 | + ['request_stack', $requestStack], |
| 332 | + ['security.token_storage', $tokenStorage], |
| 333 | + ['security.firewall.map', $firewallMap], |
| 334 | + ['security.firewall.event_dispatcher_locator', $eventDispatcherLocator], |
| 335 | + ]) |
| 336 | + ; |
| 337 | + $security = new Security($container); |
| 338 | + $response = $security->logout(); |
| 339 | + |
| 340 | + $this->assertInstanceOf(Response::class, $response); |
| 341 | + $this->assertEquals('a custom response', $response->getContent()); |
| 342 | + } |
| 343 | + |
166 | 344 | private function createContainer(string $serviceId, object $serviceObject): ContainerInterface
|
167 | 345 | {
|
168 | 346 | return new ServiceLocator([$serviceId => fn () => $serviceObject]);
|
|
0 commit comments