public function authenticateAuthenticatesOnlyTokensWithStatusAuthenticationNeeded()
{
$mockProvider = $this->createMock(AuthenticationProviderInterface::class);
$mockToken1 = $this->createMock(TokenInterface::class);
$mockToken2 = $this->createMock(TokenInterface::class);
$mockToken3 = $this->createMock(TokenInterface::class);
$mockToken1->expects($this->any())->method('isAuthenticated')->will($this->returnValue(false));
$mockToken2->expects($this->any())->method('isAuthenticated')->will($this->returnValue(false));
$mockToken3->expects($this->any())->method('isAuthenticated')->will($this->returnValue(true));
$mockToken1->expects($this->any())->method('getAuthenticationStatus')->will($this->returnValue(TokenInterface::WRONG_CREDENTIALS));
$mockToken2->expects($this->any())->method('getAuthenticationStatus')->will($this->returnValue(TokenInterface::NO_CREDENTIALS_GIVEN));
$mockToken3->expects($this->any())->method('getAuthenticationStatus')->will($this->returnValue(TokenInterface::AUTHENTICATION_NEEDED));
$mockProvider->expects($this->any())->method('canAuthenticate')->will($this->returnValue(true));
$mockProvider->expects($this->once())->method('authenticate')->with($mockToken3);
$this->mockSecurityContext->expects($this->atLeastOnce())->method('getAuthenticationStrategy')->will($this->returnValue(Context::AUTHENTICATE_ONE_TOKEN));
$this->mockSecurityContext->expects($this->atLeastOnce())->method('getAuthenticationTokens')->will($this->returnValue([$mockToken1, $mockToken2, $mockToken3]));
$this->inject($this->authenticationProviderManager, 'providers', [$mockProvider]);
$this->authenticationProviderManager->authenticate();
}