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()); | ||
|  |             }); | ||
|  |     } | ||
|  | } |