coupon-admin/vendor/casbin/think-authz/tests/DatabaseAdapterTest.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());
});
}
}