getUrlGenerator())); $response = $handler->onAuthenticationSuccess($this->getRequest('/sso/login', 'http://localhost/relayed'), $this->getSamlToken()); $this->assertInstanceOf(RedirectResponse::class, $response); $this->assertTrue($response->isRedirect('http://localhost/relayed')); } public function testWithoutRelayState(): void { $httpUtils = new HttpUtils($this->getUrlGenerator()); $handler = new SamlAuthenticationSuccessHandler($httpUtils); $defaultTargetPath = $httpUtils->generateUri($this->getRequest('/sso/login'), '/'); $response = $handler->onAuthenticationSuccess($this->getRequest(), $this->getSamlToken()); $this->assertInstanceOf(RedirectResponse::class, $response); $this->assertTrue($response->isRedirect($defaultTargetPath)); } public function testRelayStateLoop(): void { $httpUtils = new HttpUtils($this->getUrlGenerator()); $handler = new SamlAuthenticationSuccessHandler($httpUtils); $loginPath = $httpUtils->generateUri($this->getRequest('/sso/login'), '/login'); $response = $handler->onAuthenticationSuccess($this->getRequest($loginPath), $this->getSamlToken()); $this->assertInstanceOf(RedirectResponse::class, $response); $this->assertTrue(!$response->isRedirect($loginPath)); } private function getUrlGenerator(): UrlGeneratorInterface { $urlGenerator = $this->getMockBuilder(UrlGeneratorInterface::class)->getMock(); $urlGenerator ->expects($this->any()) ->method('generate') ->will($this->returnCallback(function ($name) { return (string) $name; })) ; return $urlGenerator; } private function getRequest(string $path = '/', ?string $relayState = null): Request { $params = []; if (null !== $relayState) { $params['RelayState'] = $relayState; } return Request::create($path, 'get', $params); } private function getSamlToken(): SamlToken { $user = new User(); $user->setUserIdentifier('admin'); $token = new SamlToken($user, 'secured_area', []); $token->setAttributes(['foo' => 'bar']); return $token; } }