224 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace tauthz\tests;
 | 
						|
 | 
						|
use tauthz\facade\Enforcer;
 | 
						|
use Casbin\Persist\Adapters\Filter;
 | 
						|
use Casbin\Exceptions\InvalidFilterTypeException;
 | 
						|
 | 
						|
class DatabaseAdapterTest extends TestCase
 | 
						|
{
 | 
						|
    public function testEnforce()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data1', 'read'));
 | 
						|
 | 
						|
            $this->assertFalse(Enforcer::enforce('bob', 'data1', 'read'));
 | 
						|
            $this->assertTrue(Enforcer::enforce('bob', 'data2', 'write'));
 | 
						|
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data2', 'read'));
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data2', 'write'));
 | 
						|
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testAddPolicy()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->assertFalse(Enforcer::enforce('eve', 'data3', 'read'));
 | 
						|
            Enforcer::addPermissionForUser('eve', 'data3', 'read');
 | 
						|
            $this->assertTrue(Enforcer::enforce('eve', 'data3', 'read'));
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testAddPolicies()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $policies = [
 | 
						|
                ['u1', 'd1', 'read'],
 | 
						|
                ['u2', 'd2', 'read'],
 | 
						|
                ['u3', 'd3', 'read'],
 | 
						|
            ];
 | 
						|
            Enforcer::clearPolicy();
 | 
						|
            $this->initTable();
 | 
						|
            $this->assertEquals([], Enforcer::getPolicy());
 | 
						|
            Enforcer::addPolicies($policies);
 | 
						|
            $this->assertEquals($policies, Enforcer::getPolicy());
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSavePolicy()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->assertFalse(Enforcer::enforce('alice', 'data4', 'read'));
 | 
						|
 | 
						|
            $model = Enforcer::getModel();
 | 
						|
            $model->clearPolicy();
 | 
						|
            $model->addPolicy('p', 'p', ['alice', 'data4', 'read']);
 | 
						|
 | 
						|
            $adapter = Enforcer::getAdapter();
 | 
						|
            $adapter->savePolicy($model);
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data4', 'read'));
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testRemovePolicy()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->assertFalse(Enforcer::enforce('alice', 'data5', 'read'));
 | 
						|
 | 
						|
            Enforcer::addPermissionForUser('alice', 'data5', 'read');
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data5', 'read'));
 | 
						|
 | 
						|
            Enforcer::deletePermissionForUser('alice', 'data5', 'read');
 | 
						|
            $this->assertFalse(Enforcer::enforce('alice', 'data5', 'read'));
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testRemovePolicies()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
                ['bob', 'data2', 'write'],
 | 
						|
                ['data2_admin', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'write'],
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
    
 | 
						|
            Enforcer::removePolicies([
 | 
						|
                ['data2_admin', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'write'],
 | 
						|
            ]);
 | 
						|
    
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
                ['bob', 'data2', 'write']
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testRemoveFilteredPolicy()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data1', 'read'));
 | 
						|
            Enforcer::removeFilteredPolicy(1, 'data1');
 | 
						|
            $this->assertFalse(Enforcer::enforce('alice', 'data1', 'read'));
 | 
						|
            $this->assertTrue(Enforcer::enforce('bob', 'data2', 'write'));
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data2', 'read'));
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data2', 'write'));
 | 
						|
            Enforcer::removeFilteredPolicy(1, 'data2', 'read');
 | 
						|
            $this->assertTrue(Enforcer::enforce('bob', 'data2', 'write'));
 | 
						|
            $this->assertFalse(Enforcer::enforce('alice', 'data2', 'read'));
 | 
						|
            $this->assertTrue(Enforcer::enforce('alice', 'data2', 'write'));
 | 
						|
            Enforcer::removeFilteredPolicy(2, 'write');
 | 
						|
            $this->assertFalse(Enforcer::enforce('bob', 'data2', 'write'));
 | 
						|
            $this->assertFalse(Enforcer::enforce('alice', 'data2', 'write'));
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testUpdatePolicy()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
                ['bob', 'data2', 'write'],
 | 
						|
                ['data2_admin', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'write'],
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
    
 | 
						|
            Enforcer::updatePolicy(
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
                ['alice', 'data1', 'write']
 | 
						|
            );
 | 
						|
    
 | 
						|
            Enforcer::updatePolicy(
 | 
						|
                ['bob', 'data2', 'write'],
 | 
						|
                ['bob', 'data2', 'read']
 | 
						|
            );
 | 
						|
    
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'write'],
 | 
						|
                ['bob', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'write'],
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testUpdatePolicies()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
                ['bob', 'data2', 'write'],
 | 
						|
                ['data2_admin', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'write'],
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
    
 | 
						|
            $oldPolicies = [
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
                ['bob', 'data2', 'write']
 | 
						|
            ];
 | 
						|
            $newPolicies = [
 | 
						|
                ['alice', 'data1', 'write'],
 | 
						|
                ['bob', 'data2', 'read']
 | 
						|
            ];
 | 
						|
    
 | 
						|
            Enforcer::updatePolicies($oldPolicies, $newPolicies);
 | 
						|
    
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'write'],
 | 
						|
                ['bob', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'write'],
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    public function testLoadFilteredPolicy()
 | 
						|
    {
 | 
						|
        $this->testing(function () {
 | 
						|
            $this->initTable();
 | 
						|
            Enforcer::clearPolicy();
 | 
						|
            $adapter = Enforcer::getAdapter();
 | 
						|
            $adapter->setFiltered(true);
 | 
						|
            $this->assertEquals([], Enforcer::getPolicy());
 | 
						|
 | 
						|
            // invalid filter type
 | 
						|
            try {
 | 
						|
                $filter = ['alice', 'data1', 'read'];
 | 
						|
                Enforcer::loadFilteredPolicy($filter);
 | 
						|
                $e = InvalidFilterTypeException::class;
 | 
						|
                $this->fail("Expected exception $e not thrown");
 | 
						|
            } catch (InvalidFilterTypeException $e) {
 | 
						|
                $this->assertEquals("invalid filter type", $e->getMessage());
 | 
						|
            }
 | 
						|
 | 
						|
            // string
 | 
						|
            $filter = "v0 = 'bob'";
 | 
						|
            Enforcer::loadFilteredPolicy($filter);
 | 
						|
            $this->assertEquals([
 | 
						|
                ['bob', 'data2', 'write']
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
            
 | 
						|
            // Filter
 | 
						|
            $filter = new Filter(['v2'], ['read']);
 | 
						|
            Enforcer::loadFilteredPolicy($filter);
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
                ['data2_admin', 'data2', 'read'],
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
 | 
						|
            // Closure
 | 
						|
            Enforcer::loadFilteredPolicy(function ($query) {
 | 
						|
                $query->where('v1', 'data1');
 | 
						|
            });
 | 
						|
 | 
						|
            $this->assertEquals([
 | 
						|
                ['alice', 'data1', 'read'],
 | 
						|
            ], Enforcer::getPolicy());
 | 
						|
            });
 | 
						|
    }
 | 
						|
}
 |