[Security] added some unit tests (WIP)

This commit is contained in:
Fabien Potencier 2010-10-21 18:14:32 +02:00
parent 836c512585
commit 82f8ab839f
6 changed files with 281 additions and 12 deletions

View File

@ -53,24 +53,15 @@ class AuthenticatedVoter implements VoterInterface
$result = VoterInterface::ACCESS_DENIED;
if (self::IS_AUTHENTICATED_FULLY === $attribute) {
if ($this->isFullyAuthenticated($token)) {
return VoterInterface::ACCESS_GRANTED;
}
if (self::IS_AUTHENTICATED_FULLY === $attribute && !$token instanceof AnonymousToken) {
return VoterInterface::ACCESS_GRANTED;
}
if (self::IS_AUTHENTICATED_ANONYMOUSLY === $attribute) {
if (null === $token || $token instanceof AnonymousToken || $this->isFullyAuthenticated($token)) {
return VoterInterface::ACCESS_GRANTED;
}
return VoterInterface::ACCESS_GRANTED;
}
}
return $result;
}
protected function isFullyAuthenticated(TokenInterface $token)
{
return null !== $token && !$token instanceof AnonymousToken;
}
}

View File

@ -0,0 +1,96 @@
<?php
/*
* This file is part of the Symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Component\Security\Authorization;
use Symfony\Component\Security\Authorization\AccessDecisionManager;
use Symfony\Component\Security\Authorization\Voter\VoterInterface;
class AccessDecisionManagerTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider getStrategyTests
*/
public function testStrategies($strategy, $voters, $allowIfAllAbstainDecisions, $allowIfEqualGrantedDeniedDecisions, $expected)
{
$token = $this->getMock('Symfony\Component\Security\Authentication\Token\TokenInterface');
$manager = new AccessDecisionManager($voters, $strategy, $allowIfAllAbstainDecisions, $allowIfEqualGrantedDeniedDecisions);
$this->assertSame($expected, $manager->decide($token, array('ROLE_FOO')));
}
public function getStrategyTests()
{
return array(
// affirmative
array('affirmative', $this->getVoters(1, 0, 0), false, true, true),
array('affirmative', $this->getVoters(1, 2, 0), false, true, true),
array('affirmative', $this->getVoters(0, 1, 0), false, true, false),
array('affirmative', $this->getVoters(0, 0, 0), false, true, false),
array('affirmative', $this->getVoters(0, 0, 1), false, true, false),
array('affirmative', $this->getVoters(0, 0, 1), true, true, true),
// consensus
array('consensus', $this->getVoters(1, 0, 0), false, true, true),
array('consensus', $this->getVoters(1, 2, 0), false, true, false),
array('consensus', $this->getVoters(2, 1, 0), false, true, true),
array('consensus', $this->getVoters(0, 0, 0), false, true, false),
array('consensus', $this->getVoters(0, 0, 1), false, true, false),
array('consensus', $this->getVoters(0, 0, 0), true, true, true),
array('consensus', $this->getVoters(0, 0, 1), true, true, true),
array('consensus', $this->getVoters(2, 2, 0), false, true, true),
array('consensus', $this->getVoters(2, 2, 1), false, true, true),
array('consensus', $this->getVoters(2, 2, 0), false, false, false),
array('consensus', $this->getVoters(2, 2, 1), false, false, false),
// unanimous
array('unanimous', $this->getVoters(1, 0, 0), false, true, true),
array('unanimous', $this->getVoters(1, 0, 1), false, true, true),
array('unanimous', $this->getVoters(1, 1, 0), false, true, false),
array('unanimous', $this->getVoters(0, 0, 0), false, true, false),
array('unanimous', $this->getVoters(0, 0, 0), true, true, true),
array('unanimous', $this->getVoters(0, 0, 2), false, true, false),
array('unanimous', $this->getVoters(0, 0, 2), true, true, true),
);
}
protected function getVoters($grants, $denies, $abstains)
{
$voters = array();
for ($i = 0; $i < $grants; $i++) {
$voters[] = $this->getVoter(VoterInterface::ACCESS_GRANTED);
}
for ($i = 0; $i < $denies; $i++) {
$voters[] = $this->getVoter(VoterInterface::ACCESS_DENIED);
}
for ($i = 0; $i < $abstains; $i++) {
$voters[] = $this->getVoter(VoterInterface::ACCESS_ABSTAIN);
}
return $voters;
}
protected function getVoter($vote)
{
$voter = $this->getMock('Symfony\Component\Security\Authorization\Voter\VoterInterface');
$voter->expects($this->any())
->method('vote')
->will($this->returnValue($vote));
;
return $voter;
}
}

View File

@ -0,0 +1,53 @@
<?php
/*
* This file is part of the Symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Component\Security\Authorization\Voter;
use Symfony\Component\Security\Authorization\Voter\AuthenticatedVoter;
use Symfony\Component\Security\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Role\Role;
class AuthenticatedVoterTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider getVoteTests
*/
public function testVote($authenticated, $attributes, $expected)
{
$voter = new AuthenticatedVoter();
$this->assertSame($expected, $voter->vote($this->getToken($authenticated), null, $attributes));
}
public function getVoteTests()
{
return array(
array(true, array(), VoterInterface::ACCESS_ABSTAIN),
array(true, array('FOO'), VoterInterface::ACCESS_ABSTAIN),
array(false, array(), VoterInterface::ACCESS_ABSTAIN),
array(false, array('FOO'), VoterInterface::ACCESS_ABSTAIN),
array(true, array('IS_AUTHENTICATED_ANONYMOUSLY'), VoterInterface::ACCESS_GRANTED),
array(false, array('IS_AUTHENTICATED_ANONYMOUSLY'), VoterInterface::ACCESS_GRANTED),
array(true, array('IS_AUTHENTICATED_FULLY'), VoterInterface::ACCESS_GRANTED),
array(false, array('IS_AUTHENTICATED_FULLY'), VoterInterface::ACCESS_DENIED),
);
}
protected function getToken($authenticated)
{
if ($authenticated) {
return $this->getMock('Symfony\Component\Security\Authentication\Token\TokenInterface');
} else {
return $this->getMock('Symfony\Component\Security\Authentication\Token\AnonymousToken', null, array('', ''));
}
}
}

View File

@ -0,0 +1,37 @@
<?php
/*
* This file is part of the Symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Component\Security\Authorization\Voter;
use Symfony\Component\Security\Authorization\Voter\RoleHierarchyVoter;
use Symfony\Component\Security\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Role\RoleHierarchy;
require_once __DIR__.'/RoleVoterTest.php';
class RoleHierarchyVoterTest extends RoleVoterTest
{
/**
* @dataProvider getVoteTests
*/
public function testVote($roles, $attributes, $expected)
{
$voter = new RoleHierarchyVoter(new RoleHierarchy(array('ROLE_FOO' => array('ROLE_FOOBAR'))));
$this->assertSame($expected, $voter->vote($this->getToken($roles), null, $attributes));
}
public function getVoteTests()
{
return array_merge(parent::getVoteTests(), array(
array(array('ROLE_FOO'), array('ROLE_FOOBAR'), VoterInterface::ACCESS_GRANTED),
));
}
}

View File

@ -0,0 +1,54 @@
<?php
/*
* This file is part of the Symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Component\Security\Authorization\Voter;
use Symfony\Component\Security\Authorization\Voter\RoleVoter;
use Symfony\Component\Security\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Role\Role;
class RoleVoterTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider getVoteTests
*/
public function testVote($roles, $attributes, $expected)
{
$voter = new RoleVoter();
$this->assertSame($expected, $voter->vote($this->getToken($roles), null, $attributes));
}
public function getVoteTests()
{
return array(
array(array(), array(), VoterInterface::ACCESS_ABSTAIN),
array(array(), array('FOO'), VoterInterface::ACCESS_ABSTAIN),
array(array(), array('ROLE_FOO'), VoterInterface::ACCESS_DENIED),
array(array('ROLE_FOO'), array('ROLE_FOO'), VoterInterface::ACCESS_GRANTED),
array(array('ROLE_FOO'), array('FOO', 'ROLE_FOO'), VoterInterface::ACCESS_GRANTED),
array(array('ROLE_BAR', 'ROLE_FOO'), array('ROLE_FOO'), VoterInterface::ACCESS_GRANTED),
);
}
protected function getToken(array $roles)
{
foreach ($roles as $i => $role) {
$roles[$i] = new Role($role);
}
$token = $this->getMock('Symfony\Component\Security\Authentication\Token\TokenInterface');
$token->expects($this->once())
->method('getRoles')
->will($this->returnValue($roles));
;
return $token;
}
}

View File

@ -0,0 +1,38 @@
<?php
/*
* This file is part of the Symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Component\Security\Encoder;
use Symfony\Component\Security\Encoder\PlaintextPasswordEncoder;
class PlaintextPasswordEncoderTest extends \PHPUnit_Framework_TestCase
{
public function testIsPasswordValid()
{
$encoder = new PlaintextPasswordEncoder();
$this->assertSame(true, $encoder->isPasswordValid('foo', 'foo', ''));
$this->assertSame(false, $encoder->isPasswordValid('bar', 'foo', ''));
$this->assertSame(false, $encoder->isPasswordValid('FOO', 'foo', ''));
$encoder = new PlaintextPasswordEncoder(true);
$this->assertSame(true, $encoder->isPasswordValid('foo', 'foo', ''));
$this->assertSame(false, $encoder->isPasswordValid('bar', 'foo', ''));
$this->assertSame(true, $encoder->isPasswordValid('FOO', 'foo', ''));
}
public function testEncodePassword()
{
$encoder = new PlaintextPasswordEncoder();
$this->assertSame('foo', $encoder->encodePassword('foo', ''));
}
}