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

use 
SymfonyComponentSecurityAclDbalAclProvider;
use 
SymfonyComponentSecurityAclDomainPermissionGrantingStrategy;
use 
SymfonyComponentSecurityAclDomainObjectIdentity;
use 
SymfonyComponentSecurityAclDbalSchema;
use 
DoctrineDBALDriverManager;

class 
AclProviderTest extends PHPUnit_Framework_TestCase
{
    protected 
$con;
    protected 
$insertClassStmt;
    protected 
$insertEntryStmt;
    protected 
$insertOidStmt;
    protected 
$insertOidAncestorStmt;
    protected 
$insertSidStmt;

    
/**
     * @expectedException SymfonyComponentSecurityAclExceptionAclNotFoundException
     * @expectedMessage There is no ACL for the given object identity.
     */
    
public function testFindAclThrowsExceptionWhenNoAclExists()
    {
        
$this->getProvider()->findAcl(new ObjectIdentity('foo', 'foo'));
    }

    public function 
testFindAclsThrowsExceptionUnlessAnACLIsFoundForEveryOID()
    {
        
$oids = array();
        
$oids[] = new ObjectIdentity('1', 'foo');
        
$oids[] = new ObjectIdentity('foo', 'foo');

        try {
            
$this->getProvider()->findAcls($oids);

            
$this->fail('Provider did not throw an expected exception.');
        } catch (
Exception $ex) {
            
$this->assertInstanceOf('SymfonyComponentSecurityAclExceptionAclNotFoundException', $ex);
            
$this->assertInstanceOf('SymfonyComponentSecurityAclExceptionNotAllAclsFoundException', $ex);

            
$partialResult = $ex->getPartialResult();
            
$this->assertTrue($partialResult->contains($oids[0]));
            
$this->assertFalse($partialResult->contains($oids[1]));
        }
    }

    public function 
testFindAcls()
    {
        
$oids = array();
        
$oids[] = new ObjectIdentity('1', 'foo');
        
$oids[] = new ObjectIdentity('2', 'foo');

        
$provider = $this->getProvider();

        
$acls = $provider->findAcls($oids);
        
$this->assertInstanceOf('SplObjectStorage', $acls);
        
$this->assertCount(2, $acls);
        
$this->assertInstanceOf('SymfonyComponentSecurityAclDomainAcl', $acl0 = $acls->offsetGet($oids[0]));
        
$this->assertInstanceOf('SymfonyComponentSecurityAclDomainAcl', $acl1 = $acls->offsetGet($oids[1]));
        
$this->assertTrue($oids[0]->equals($acl0->getObjectIdentity()));
        
$this->assertTrue($oids[1]->equals($acl1->getObjectIdentity()));
    }

    public function 
testFindAclsWithDifferentTypes()
    {
        
$oids = array();
        
$oids[] = new ObjectIdentity('123', 'BundleSomeVendorMyBundleEntitySomeEntity');
        
$oids[] = new ObjectIdentity('123', 'BundleMyBundleEntityAnotherEntity');

        
$provider = $this->getProvider();

        
$acls = $provider->findAcls($oids);
        
$this->assertInstanceOf('SplObjectStorage', $acls);
        
$this->assertCount(2, $acls);
        
$this->assertInstanceOf('SymfonyComponentSecurityAclDomainAcl', $acl0 = $acls->offsetGet($oids[0]));
        
$this->assertInstanceOf('SymfonyComponentSecurityAclDomainAcl', $acl1 = $acls->offsetGet($oids[1]));
        
$this->assertTrue($oids[0]->equals($acl0->getObjectIdentity()));
        
$this->assertTrue($oids[1]->equals($acl1->getObjectIdentity()));
    }

    public function 
testFindAclCachesAclInMemory()
    {
        
$oid = new ObjectIdentity('1', 'foo');
        
$provider = $this->getProvider();

        
$acl = $provider->findAcl($oid);
        
$this->assertSame($acl, $cAcl = $provider->findAcl($oid));

        
$cAces = $cAcl->getObjectAces();
        foreach (
$acl->getObjectAces() as $index => $ace) {
            
$this->assertSame($ace, $cAces[$index]);
        }
    }

    public function 
testFindAcl()
    {
        
$oid = new ObjectIdentity('1', 'foo');
        
$provider = $this->getProvider();

        
$acl = $provider->findAcl($oid);

        
$this->assertInstanceOf('SymfonyComponentSecurityAclDomainAcl', $acl);
        
$this->assertTrue($oid->equals($acl->getObjectIdentity()));
        
$this->assertEquals(4, $acl->getId());
        
$this->assertCount(0, $acl->getClassAces());
        
$this->assertCount(0, $this->getField($acl, 'classFieldAces'));
        
$this->assertCount(3, $acl->getObjectAces());
        
$this->assertCount(0, $this->getField($acl, 'objectFieldAces'));

        
$aces = $acl->getObjectAces();
        
$this->assertInstanceOf('SymfonyComponentSecurityAclDomainEntry', $aces[0]);
        
$this->assertTrue($aces[0]->isGranting());
        
$this->assertTrue($aces[0]->isAuditSuccess());
        
$this->assertTrue($aces[0]->isAuditFailure());
        
$this->assertEquals('all', $aces[0]->getStrategy());
        
$this->assertSame(2, $aces[0]->getMask());

        
// check ACE are in correct order
        
$i = 0;
        foreach (
$aces as $index => $ace) {
            
$this->assertEquals($i, $index);
            
$i++;
        }

        
$sid = $aces[0]->getSecurityIdentity();
        
$this->assertInstanceOf('SymfonyComponentSecurityAclDomainUserSecurityIdentity', $sid);
        
$this->assertEquals('john.doe', $sid->getUsername());
        
$this->assertEquals('SomeClass', $sid->getClass());
    }

    protected function 
setUp()
    {
        if (!
class_exists('PDO') || !in_array('sqlite', PDO::getAvailableDrivers())) {
            
self::markTestSkipped('This test requires SQLite support in your environment');
        }

        
$this->con = DriverManager::getConnection(array(
            
'driver' => 'pdo_sqlite',
            
'memory' => true,
        ));

        
// import the schema
        
$schema = new Schema($options = $this->getOptions());
        foreach (
$schema->toSql($this->con->getDatabasePlatform()) as $sql) {
            
$this->con->exec($sql);
        }

        
// populate the schema with some test data
        
$this->insertClassStmt = $this->con->prepare('INSERT INTO acl_classes (id, class_type) VALUES (?, ?)');
        foreach (
$this->getClassData() as $data) {
            
$this->insertClassStmt->execute($data);
        }

        
$this->insertSidStmt = $this->con->prepare('INSERT INTO acl_security_identities (id, identifier, username) VALUES (?, ?, ?)');
        foreach (
$this->getSidData() as $data) {
            
$this->insertSidStmt->execute($data);
        }

        
$this->insertOidStmt = $this->con->prepare('INSERT INTO acl_object_identities (id, class_id, object_identifier, parent_object_identity_id, entries_inheriting) VALUES (?, ?, ?, ?, ?)');
        foreach (
$this->getOidData() as $data) {
            
$this->insertOidStmt->execute($data);
        }

        
$this->insertEntryStmt = $this->con->prepare('INSERT INTO acl_entries (id, class_id, object_identity_id, field_name, ace_order, security_identity_id, mask, granting, granting_strategy, audit_success, audit_failure) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
        foreach (
$this->getEntryData() as $data) {
            
$this->insertEntryStmt->execute($data);
        }

        
$this->insertOidAncestorStmt = $this->con->prepare('INSERT INTO acl_object_identity_ancestors (object_identity_id, ancestor_id) VALUES (?, ?)');
        foreach (
$this->getOidAncestorData() as $data) {
            
$this->insertOidAncestorStmt->execute($data);
        }
    }

    protected function 
tearDown()
    {
        
$this->con = null;
    }

    protected function 
getField($object, $field)
    {
        
$reflection = new ReflectionProperty($object, $field);
        
$reflection->setAccessible(true);

        return 
$reflection->getValue($object);
    }

    protected function 
getEntryData()
    {
        
// id, cid, oid, field, order, sid, mask, granting, strategy, a success, a failure
        
return array(
            array(
1, 1, 1, null, 0, 1, 1, 1, 'all', 1, 1),
            array(
2, 1, 1, null, 1, 2, 1 << 2 | 1 << 1, 0, 'any', 0, 0),
            array(
3, 3, 4, null, 0, 1, 2, 1, 'all', 1, 1),
            array(
4, 3, 4, null, 2, 2, 1, 1, 'all', 1, 1),
            array(
5, 3, 4, null, 1, 3, 1, 1, 'all', 1, 1),
        );
    }

    protected function 
getOidData()
    {
        
// id, cid, oid, parent_oid, entries_inheriting
        
return array(
            array(
1, 1, '123', null, 1),
            array(
2, 2, '123', 1, 1),
            array(
3, 2, 'i:3:123', 1, 1),
            array(
4, 3, '1', 2, 1),
            array(
5, 3, '2', 2, 1),
        );
    }

    protected function 
getOidAncestorData()
    {
        return array(
            array(
1, 1),
            array(
2, 1),
            array(
2, 2),
            array(
3, 1),
            array(
3, 3),
            array(
4, 2),
            array(
4, 1),
            array(
4, 4),
            array(
5, 2),
            array(
5, 1),
            array(
5, 5),
        );
    }

    protected function 
getSidData()
    {
        return array(
            array(
1, 'SomeClass-john.doe', 1),
            array(
2, 'MyClass-john.doe@foo.com', 1),
            array(
3, 'FooClass-123', 1),
            array(
4, 'MooClass-ROLE_USER', 1),
            array(
5, 'ROLE_USER', 0),
            array(
6, 'IS_AUTHENTICATED_FULLY', 0),
        );
    }

    protected function 
getClassData()
    {
        return array(
            array(
1, 'BundleSomeVendorMyBundleEntitySomeEntity'),
            array(
2, 'BundleMyBundleEntityAnotherEntity'),
            array(
3, 'foo'),
        );
    }

    protected function 
getOptions()
    {
        return array(
            
'oid_table_name' => 'acl_object_identities',
            
'oid_ancestors_table_name' => 'acl_object_identity_ancestors',
            
'class_table_name' => 'acl_classes',
            
'sid_table_name' => 'acl_security_identities',
            
'entry_table_name' => 'acl_entries',
        );
    }

    protected function 
getStrategy()
    {
        return new 
PermissionGrantingStrategy();
    }

    protected function 
getProvider()
    {
        return new 
AclProvider($this->con, $this->getStrategy(), $this->getOptions());
    }
}
Онлайн: 1
Реклама