Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Security/Acl/Tests/Domain/AclTest.php
Строк: 470
<?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 SymfonyComponentSecurityAclTestsDomain;

use 
SymfonyComponentSecurityAclDomainUserSecurityIdentity;
use 
SymfonyComponentSecurityAclDomainRoleSecurityIdentity;
use 
SymfonyComponentSecurityAclDomainPermissionGrantingStrategy;
use 
SymfonyComponentSecurityAclDomainObjectIdentity;
use 
SymfonyComponentSecurityAclDomainAcl;

class 
AclTest extends PHPUnit_Framework_TestCase
{
    public function 
testConstructor()
    {
        
$acl = new Acl(1$oid = new ObjectIdentity('foo''foo'), $permissionStrategy = new PermissionGrantingStrategy(), array(), true);

        
$this->assertSame(1$acl->getId());
        
$this->assertSame($oid$acl->getObjectIdentity());
        
$this->assertNull($acl->getParentAcl());
        
$this->assertTrue($acl->isEntriesInheriting());
    }

    
/**
     * @expectedException OutOfBoundsException
     * @dataProvider getDeleteAceTests
     */
    
public function testDeleteAceThrowsExceptionOnInvalidIndex($type)
    {
        
$acl $this->getAcl();
        
$acl->{'delete'.$type.'Ace'}(0);
    }

    
/**
     * @dataProvider getDeleteAceTests
     */
    
public function testDeleteAce($type)
    {
        
$acl $this->getAcl();
        
$acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 1);
        
$acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 21);
        
$acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 32);

        
$listener $this->getListener(array(
            
$type.'Aces''aceOrder''aceOrder'$type.'Aces',
        ));
        
$acl->addPropertyChangedListener($listener);

        
$this->assertCount(3$acl->{'get'.$type.'Aces'}());

        
$acl->{'delete'.$type.'Ace'}(0);
        
$this->assertCount(2$aces $acl->{'get'.$type.'Aces'}());
        
$this->assertEquals(2$aces[0]->getMask());
        
$this->assertEquals(3$aces[1]->getMask());

        
$acl->{'delete'.$type.'Ace'}(1);
        
$this->assertCount(1$aces $acl->{'get'.$type.'Aces'}());
        
$this->assertEquals(2$aces[0]->getMask());
    }

    public function 
getDeleteAceTests()
    {
        return array(
            array(
'class'),
            array(
'object'),
        );
    }

    
/**
     * @expectedException OutOfBoundsException
     * @dataProvider getDeleteFieldAceTests
     */
    
public function testDeleteFieldAceThrowsExceptionOnInvalidIndex($type)
    {
        
$acl $this->getAcl();
        
$acl->{'delete'.$type.'Ace'}('foo'0);
    }

    
/**
     * @dataProvider getDeleteFieldAceTests
     */
    
public function testDeleteFieldAce($type)
    {
        
$acl $this->getAcl();
        
$acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 10);
        
$acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 21);
        
$acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 32);

        
$listener $this->getListener(array(
            
$type.'Aces''aceOrder''aceOrder'$type.'Aces',
        ));
        
$acl->addPropertyChangedListener($listener);

        
$this->assertCount(3$acl->{'get'.$type.'Aces'}('foo'));

        
$acl->{'delete'.$type.'Ace'}(0'foo');
        
$this->assertCount(2$aces $acl->{'get'.$type.'Aces'}('foo'));
        
$this->assertEquals(2$aces[0]->getMask());
        
$this->assertEquals(3$aces[1]->getMask());

        
$acl->{'delete'.$type.'Ace'}(1'foo');
        
$this->assertCount(1$aces $acl->{'get'.$type.'Aces'}('foo'));
        
$this->assertEquals(2$aces[0]->getMask());
    }

    public function 
getDeleteFieldAceTests()
    {
        return array(
            array(
'classField'),
            array(
'objectField'),
        );
    }

    
/**
     * @dataProvider getInsertAceTests
     */
    
public function testInsertAce($property$method)
    {
        
$acl $this->getAcl();

        
$listener $this->getListener(array(
            
$property'aceOrder'$property'aceOrder'$property,
        ));
        
$acl->addPropertyChangedListener($listener);

        
$sid = new RoleSecurityIdentity('foo');
        
$acl->$method($sid1);
        
$acl->$method($sid2);
        
$acl->$method($sid31false);

        
$this->assertCount(3$aces $acl->{'get'.$property}());
        
$this->assertEquals(2$aces[0]->getMask());
        
$this->assertEquals(3$aces[1]->getMask());
        
$this->assertEquals(1$aces[2]->getMask());
    }

    
/**
     * @expectedException OutOfBoundsException
     * @dataProvider getInsertAceTests
     */
    
public function testInsertClassAceThrowsExceptionOnInvalidIndex($property$method)
    {
        
$acl $this->getAcl();
        
$acl->$method(new RoleSecurityIdentity('foo'), 11);
    }

    public function 
getInsertAceTests()
    {
        return array(
            array(
'classAces''insertClassAce'),
            array(
'objectAces''insertObjectAce'),
        );
    }

    
/**
     * @dataProvider getInsertFieldAceTests
     */
    
public function testInsertClassFieldAce($property$method)
    {
        
$acl $this->getAcl();

        
$listener $this->getListener(array(
            
$property$property'aceOrder'$property,
            
'aceOrder''aceOrder'$property,
        ));
        
$acl->addPropertyChangedListener($listener);

        
$sid = new RoleSecurityIdentity('foo');
        
$acl->$method('foo'$sid1);
        
$acl->$method('foo2'$sid1);
        
$acl->$method('foo'$sid3);
        
$acl->$method('foo'$sid2);

        
$this->assertCount(3$aces $acl->{'get'.$property}('foo'));
        
$this->assertCount(1$acl->{'get'.$property}('foo2'));
        
$this->assertEquals(2$aces[0]->getMask());
        
$this->assertEquals(3$aces[1]->getMask());
        
$this->assertEquals(1$aces[2]->getMask());
    }

    
/**
     * @expectedException OutOfBoundsException
     * @dataProvider getInsertFieldAceTests
     */
    
public function testInsertClassFieldAceThrowsExceptionOnInvalidIndex($property$method)
    {
        
$acl $this->getAcl();
        
$acl->$method('foo', new RoleSecurityIdentity('foo'), 11);
    }

    public function 
getInsertFieldAceTests()
    {
        return array(
            array(
'classFieldAces''insertClassFieldAce'),
            array(
'objectFieldAces''insertObjectFieldAce'),
        );
    }

    public function 
testIsFieldGranted()
    {
        
$sids = array(new RoleSecurityIdentity('ROLE_FOO'), new RoleSecurityIdentity('ROLE_IDDQD'));
        
$masks = array(124);
        
$strategy $this->getMock('SymfonyComponentSecurityAclModelPermissionGrantingStrategyInterface');
        
$acl = new Acl(1, new ObjectIdentity(1'foo'), $strategy, array(), true);

        
$strategy
            
->expects($this->once())
            ->
method('isFieldGranted')
            ->
with($this->equalTo($acl), $this->equalTo('foo'), $this->equalTo($masks), $this->equalTo($sids), $this->isTrue())
            ->
will($this->returnValue(true))
        ;

        
$this->assertTrue($acl->isFieldGranted('foo'$masks$sidstrue));
    }

    public function 
testIsGranted()
    {
        
$sids = array(new RoleSecurityIdentity('ROLE_FOO'), new RoleSecurityIdentity('ROLE_IDDQD'));
        
$masks = array(124);
        
$strategy $this->getMock('SymfonyComponentSecurityAclModelPermissionGrantingStrategyInterface');
        
$acl = new Acl(1, new ObjectIdentity(1'foo'), $strategy, array(), true);

        
$strategy
            
->expects($this->once())
            ->
method('isGranted')
            ->
with($this->equalTo($acl), $this->equalTo($masks), $this->equalTo($sids), $this->isTrue())
            ->
will($this->returnValue(true))
        ;

        
$this->assertTrue($acl->isGranted($masks$sidstrue));
    }

    public function 
testSetGetParentAcl()
    {
        
$acl $this->getAcl();
        
$parentAcl $this->getAcl();

        
$listener $this->getListener(array('parentAcl'));
        
$acl->addPropertyChangedListener($listener);

        
$this->assertNull($acl->getParentAcl());
        
$acl->setParentAcl($parentAcl);
        
$this->assertSame($parentAcl$acl->getParentAcl());

        
$acl->setParentAcl(null);
        
$this->assertNull($acl->getParentAcl());
    }

    public function 
testSetIsEntriesInheriting()
    {
        
$acl $this->getAcl();

        
$listener $this->getListener(array('entriesInheriting'));
        
$acl->addPropertyChangedListener($listener);

        
$this->assertTrue($acl->isEntriesInheriting());
        
$acl->setEntriesInheriting(false);
        
$this->assertFalse($acl->isEntriesInheriting());
    }

    public function 
testIsSidLoadedWhenAllSidsAreLoaded()
    {
        
$acl $this->getAcl();

        
$this->assertTrue($acl->isSidLoaded(new UserSecurityIdentity('foo''Foo')));
        
$this->assertTrue($acl->isSidLoaded(new RoleSecurityIdentity('ROLE_FOO''Foo')));
    }

    public function 
testIsSidLoaded()
    {
        
$acl = new Acl(1, new ObjectIdentity('1''foo'), new PermissionGrantingStrategy(), array(new UserSecurityIdentity('foo''Foo'), new UserSecurityIdentity('johannes''Bar')), true);

        
$this->assertTrue($acl->isSidLoaded(new UserSecurityIdentity('foo''Foo')));
        
$this->assertTrue($acl->isSidLoaded(new UserSecurityIdentity('johannes''Bar')));
        
$this->assertTrue($acl->isSidLoaded(array(
            new 
UserSecurityIdentity('foo''Foo'),
            new 
UserSecurityIdentity('johannes''Bar'),
        )));
        
$this->assertFalse($acl->isSidLoaded(new RoleSecurityIdentity('ROLE_FOO')));
        
$this->assertFalse($acl->isSidLoaded(new UserSecurityIdentity('schmittjoh@gmail.com''Moo')));
        
$this->assertFalse($acl->isSidLoaded(array(
            new 
UserSecurityIdentity('foo''Foo'),
            new 
UserSecurityIdentity('johannes''Bar'),
            new 
RoleSecurityIdentity('ROLE_FOO'),
        )));
    }

    
/**
     * @dataProvider getUpdateAceTests
     * @expectedException OutOfBoundsException
     */
    
public function testUpdateAceThrowsOutOfBoundsExceptionOnInvalidIndex($type)
    {
        
$acl $this->getAcl();
        
$acl->{'update'.$type}(01);
    }

    
/**
     * @dataProvider getUpdateAceTests
     */
    
public function testUpdateAce($type)
    {
        
$acl $this->getAcl();
        
$acl->{'insert'.$type}(new RoleSecurityIdentity('foo'), 1);

        
$listener $this->getListener(array(
            
'mask''mask''strategy',
        ));
        
$acl->addPropertyChangedListener($listener);

        
$aces $acl->{'get'.$type.'s'}();
        
$ace reset($aces);
        
$this->assertEquals(1$ace->getMask());
        
$this->assertEquals('all'$ace->getStrategy());

        
$acl->{'update'.$type}(03);
        
$this->assertEquals(3$ace->getMask());
        
$this->assertEquals('all'$ace->getStrategy());

        
$acl->{'update'.$type}(01'foo');
        
$this->assertEquals(1$ace->getMask());
        
$this->assertEquals('foo'$ace->getStrategy());
    }

    public function 
getUpdateAceTests()
    {
        return array(
            array(
'classAce'),
            array(
'objectAce'),
        );
    }

    
/**
     * @dataProvider getUpdateFieldAceTests
     * @expectedException OutOfBoundsException
     */
    
public function testUpdateFieldAceThrowsExceptionOnInvalidIndex($type)
    {
        
$acl $this->getAcl();
        
$acl->{'update'.$type}(0'foo'1);
    }

    
/**
     * @dataProvider getUpdateFieldAceTests
     */
    
public function testUpdateFieldAce($type)
    {
        
$acl $this->getAcl();
        
$acl->{'insert'.$type}('foo', new UserSecurityIdentity('foo''Foo'), 1);

        
$listener $this->getListener(array(
            
'mask''mask''strategy',
        ));
        
$acl->addPropertyChangedListener($listener);

        
$aces $acl->{'get'.$type.'s'}('foo');
        
$ace reset($aces);
        
$this->assertEquals(1$ace->getMask());
        
$this->assertEquals('all'$ace->getStrategy());

        
$acl->{'update'.$type}(0'foo'3);
        
$this->assertEquals(3$ace->getMask());
        
$this->assertEquals('all'$ace->getStrategy());

        
$acl->{'update'.$type}(0'foo'1'foo');
        
$this->assertEquals(1$ace->getMask());
        
$this->assertEquals('foo'$ace->getStrategy());
    }

    public function 
getUpdateFieldAceTests()
    {
        return array(
            array(
'classFieldAce'),
            array(
'objectFieldAce'),
        );
    }

    
/**
     * @dataProvider getUpdateAuditingTests
     * @expectedException OutOfBoundsException
     */
    
public function testUpdateAuditingThrowsExceptionOnInvalidIndex($type)
    {
        
$acl $this->getAcl();
        
$acl->{'update'.$type.'Auditing'}(0truefalse);
    }

    
/**
     * @dataProvider getUpdateAuditingTests
     */
    
public function testUpdateAuditing($type)
    {
        
$acl $this->getAcl();
        
$acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 1);

        
$listener $this->getListener(array(
            
'auditFailure''auditSuccess''auditFailure',
        ));
        
$acl->addPropertyChangedListener($listener);

        
$aces $acl->{'get'.$type.'Aces'}();
        
$ace reset($aces);
        
$this->assertFalse($ace->isAuditSuccess());
        
$this->assertFalse($ace->isAuditFailure());

        
$acl->{'update'.$type.'Auditing'}(0falsetrue);
        
$this->assertFalse($ace->isAuditSuccess());
        
$this->assertTrue($ace->isAuditFailure());

        
$acl->{'update'.$type.'Auditing'}(0truefalse);
        
$this->assertTrue($ace->isAuditSuccess());
        
$this->assertFalse($ace->isAuditFailure());
    }

    public function 
getUpdateAuditingTests()
    {
        return array(
            array(
'class'),
            array(
'object'),
        );
    }

    
/**
     * @expectedException InvalidArgumentException
     * @dataProvider getUpdateFieldAuditingTests
     */
    
public function testUpdateFieldAuditingThrowsExceptionOnInvalidField($type)
    {
        
$acl $this->getAcl();
        
$acl->{'update'.$type.'Auditing'}(0'foo'truetrue);
    }

    
/**
     * @expectedException OutOfBoundsException
     * @dataProvider getUpdateFieldAuditingTests
     */
    
public function testUpdateFieldAuditingThrowsExceptionOnInvalidIndex($type)
    {
        
$acl $this->getAcl();
        
$acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 1);
        
$acl->{'update'.$type.'Auditing'}(1'foo'truefalse);
    }

    
/**
     * @dataProvider getUpdateFieldAuditingTests
     */
    
public function testUpdateFieldAuditing($type)
    {
        
$acl $this->getAcl();
        
$acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 1);

        
$listener $this->getListener(array(
            
'auditSuccess''auditSuccess''auditFailure',
        ));
        
$acl->addPropertyChangedListener($listener);

        
$aces $acl->{'get'.$type.'Aces'}('foo');
        
$ace reset($aces);
        
$this->assertFalse($ace->isAuditSuccess());
        
$this->assertFalse($ace->isAuditFailure());

        
$acl->{'update'.$type.'Auditing'}(0'foo'truefalse);
        
$this->assertTrue($ace->isAuditSuccess());
        
$this->assertFalse($ace->isAuditFailure());

        
$acl->{'update'.$type.'Auditing'}(0'foo'falsetrue);
        
$this->assertFalse($ace->isAuditSuccess());
        
$this->assertTrue($ace->isAuditFailure());
    }

    public function 
getUpdateFieldAuditingTests()
    {
        return array(
            array(
'classField'),
            array(
'objectField'),
        );
    }

    protected function 
getListener($expectedChanges)
    {
        
$aceProperties = array('aceOrder''mask''strategy''auditSuccess''auditFailure');

        
$listener $this->getMock('DoctrineCommonPropertyChangedListener');
        foreach (
$expectedChanges as $index => $property) {
            if (
in_array($property$aceProperties)) {
                
$class 'SymfonyComponentSecurityAclDomainEntry';
            } else {
                
$class 'SymfonyComponentSecurityAclDomainAcl';
            }

            
$listener
                
->expects($this->at($index))
                ->
method('propertyChanged')
                ->
with($this->isInstanceOf($class), $this->equalTo($property))
            ;
        }

        return 
$listener;
    }

    protected function 
getAcl()
    {
        return new 
Acl(1, new ObjectIdentity(1'foo'), new PermissionGrantingStrategy(), array(), true);
    }
}
Онлайн: 1
Реклама