Changing AclBase into AclInterface as it is now an interface.

Splitting the test case into separate test cases for each class.
This commit is contained in:
Mark Story 2010-04-23 23:52:36 -04:00
parent 523eda018e
commit e111735905
2 changed files with 219 additions and 100 deletions

View file

@ -76,8 +76,8 @@ class AclComponent extends Object {
if (is_string($adapter)) {
$adapter = new $adapter();
}
if (!$adapter instanceof AclBase) {
throw new Exception(__('AclComponent adapters must extend AclBase'));
if (!$adapter instanceof AclInterface) {
throw new Exception(__('AclComponent adapters must implement AclInterface'));
}
$this->_Instance = $adapter;
$this->_Instance->initialize($this);
@ -176,14 +176,13 @@ class AclComponent extends Object {
}
/**
* Access Control List abstract class. Not to be instantiated.
* Subclasses of this class are used by AclComponent to perform ACL checks in Cake.
* Access Control List interface.
* Implementing classes are used by AclComponent to perform ACL checks in Cake.
*
* @package cake
* @subpackage cake.cake.libs.controller.components
* @abstract
*/
abstract class AclBase extends Object {
interface AclInterface {
/**
* Empty method to be overridden in subclasses
@ -192,14 +191,44 @@ abstract class AclBase extends Object {
* @param string $aco ACO The controlled object identifier.
* @param string $action Action (defaults to *)
*/
public abstract function check($aro, $aco, $action = "*");
public function check($aro, $aco, $action = "*");
/**
* Empty method to be overridden in subclasses
* Allow methods are used to grant an ARO access to an ACO.
*
* @param object $component Component
* @param string $aro ARO The requesting object identifier.
* @param string $aco ACO The controlled object identifier.
* @param string $action Action (defaults to *)
* @return boolean Success
*/
public abstract function initialize($component);
public function allow($aro, $aco, $action = "*");
/**
* Deny methods are used to remove permission from an ARO to access an ACO.
*
* @param string $aro ARO The requesting object identifier.
* @param string $aco ACO The controlled object identifier.
* @param string $action Action (defaults to *)
* @return boolean Success
*/
public function deny($aro, $aco, $action = "*");
/**
* Inherit methods modify the permission for an ARO to be that of its parent object.
*
* @param string $aro ARO The requesting object identifier.
* @param string $aco ACO The controlled object identifier.
* @param string $action Action (defaults to *)
* @return boolean Success
*/
public function inherit($aro, $aco, $action = "*");
/**
* Initialization method for the Acl implementation
*
* @param AclComponent $component
*/
public function initialize($component);
}
/**
@ -222,7 +251,7 @@ abstract class AclBase extends Object {
* @package cake
* @subpackage cake.cake.libs.model
*/
class DbAcl extends AclBase {
class DbAcl extends Object implements AclInterface {
/**
* Constructor
@ -492,7 +521,7 @@ class DbAcl extends AclBase {
* @package cake
* @subpackage cake.cake.libs.model.iniacl
*/
class IniAcl extends AclBase {
class IniAcl extends Object implements AclInterface {
/**
* Array with configuration, parsed from ini file
@ -512,6 +541,42 @@ class IniAcl extends AclBase {
}
/**
* No op method, allow cannot be done with IniAcl
*
* @param string $aro ARO The requesting object identifier.
* @param string $aco ACO The controlled object identifier.
* @param string $action Action (defaults to *)
* @return boolean Success
*/
public function allow($aro, $aco, $action = "*") {
}
/**
* No op method, deny cannot be done with IniAcl
*
* @param string $aro ARO The requesting object identifier.
* @param string $aco ACO The controlled object identifier.
* @param string $action Action (defaults to *)
* @return boolean Success
*/
public function deny($aro, $aco, $action = "*") {
}
/**
* No op method, inherit cannot be done with IniAcl
*
* @param string $aro ARO The requesting object identifier.
* @param string $aco ACO The controlled object identifier.
* @param string $action Action (defaults to *)
* @return boolean Success
*/
public function inherit($aro, $aco, $action = "*") {
}
/**
* Main ACL check function. Checks to see if the ARO (access request object) has access to the
* ACO (access control object).Looks at the acl.ini.php file for permissions

View file

@ -188,7 +188,6 @@ class DbAclTwoTest extends DbAcl {
* @subpackage cake.tests.cases.libs.controller.components
*/
class AclComponentTest extends CakeTestCase {
/**
* fixtures property
*
@ -196,7 +195,6 @@ class AclComponentTest extends CakeTestCase {
* @access public
*/
public $fixtures = array('core.aro_two', 'core.aco_two', 'core.aros_aco_two');
/**
* startTest method
*
@ -265,6 +263,145 @@ class AclComponentTest extends CakeTestCase {
$this->Acl->adapter($thing);
}
/**
* testStartup method
*
* @access public
* @return void
*/
function testStartup() {
$controller = new Controller();
$this->assertTrue($this->Acl->startup($controller));
}
}
/**
* Test case for the IniAcl implementation
*
* @package cake.tests.cases.libs.controller.components
*/
class IniAclTestCase extends CakeTestCase {
/**
* testIniReadConfigFile
*
* @access public
* @return void
*/
function testIniReadConfigFile() {
$Ini = new IniAcl();
$iniFile = TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'config'. DS . 'acl.ini.php';
$result = $Ini->readConfigFile($iniFile);
$expected = array(
'admin' => array(
'groups' => 'administrators',
'allow' => '',
'deny' => 'ads',
),
'paul' => array(
'groups' => 'users',
'allow' =>'',
'deny' => '',
),
'jenny' => array(
'groups' => 'users',
'allow' => 'ads',
'deny' => 'images, files',
),
'nobody' => array(
'groups' => 'anonymous',
'allow' => '',
'deny' => '',
),
'administrators' => array(
'deny' => '',
'allow' => 'posts, comments, images, files, stats, ads',
),
'users' => array(
'allow' => 'posts, comments, images, files',
'deny' => 'stats, ads',
),
'anonymous' => array(
'allow' => '',
'deny' => 'posts, comments, images, files, stats, ads',
),
);
$this->assertEqual($result, $expected);
}
/**
* testIniCheck method
*
* @access public
* @return void
*/
function testIniCheck() {
$iniFile = TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'config'. DS . 'acl.ini.php';
$Ini = new IniAcl();
$Ini->config = $Ini->readConfigFile($iniFile);
$this->assertFalse($Ini->check('admin', 'ads'));
$this->assertTrue($Ini->check('admin', 'posts'));
$this->assertTrue($Ini->check('jenny', 'posts'));
$this->assertTrue($Ini->check('jenny', 'ads'));
$this->assertTrue($Ini->check('paul', 'posts'));
$this->assertFalse($Ini->check('paul', 'ads'));
$this->assertFalse($Ini->check('nobody', 'comments'));
}
}
/**
* Test case for AclComponent using the DbAcl implementation.
*
* @package cake.tests.cases.libs.controller.components
*/
class DbAclTestCase extends CakeTestCase {
/**
* fixtures property
*
* @var array
* @access public
*/
public $fixtures = array('core.aro_two', 'core.aco_two', 'core.aros_aco_two');
/**
* startTest method
*
* @access public
* @return void
*/
function startTest() {
$this->Acl =& new AclComponent();
}
/**
* before method
*
* @param mixed $method
* @access public
* @return void
*/
function before($method) {
Configure::write('Acl.classname', 'DbAclTwoTest');
Configure::write('Acl.database', 'test_suite');
parent::before($method);
}
/**
* tearDown method
*
* @access public
* @return void
*/
function tearDown() {
unset($this->Acl);
}
/**
* testAclCreate method
*
@ -517,90 +654,6 @@ class AclComponentTest extends CakeTestCase {
$this->expectError('DbAcl::allow() - Invalid node');
$this->assertFalse($this->Acl->deny('Bobs', 'ROOT/printers/DoesNotExist', 'create'));
}
/**
* testStartup method
*
* @access public
* @return void
*/
function testStartup() {
$controller = new Controller();
$this->assertTrue($this->Acl->startup($controller));
}
/**
* testIniReadConfigFile
*
* @access public
* @return void
*/
function testIniReadConfigFile() {
$Ini = new IniAcl();
$iniFile = TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'config'. DS . 'acl.ini.php';
$result = $Ini->readConfigFile($iniFile);
$expected = array(
'admin' => array(
'groups' => 'administrators',
'allow' => '',
'deny' => 'ads',
),
'paul' => array(
'groups' => 'users',
'allow' =>'',
'deny' => '',
),
'jenny' => array(
'groups' => 'users',
'allow' => 'ads',
'deny' => 'images, files',
),
'nobody' => array(
'groups' => 'anonymous',
'allow' => '',
'deny' => '',
),
'administrators' => array(
'deny' => '',
'allow' => 'posts, comments, images, files, stats, ads',
),
'users' => array(
'allow' => 'posts, comments, images, files',
'deny' => 'stats, ads',
),
'anonymous' => array(
'allow' => '',
'deny' => 'posts, comments, images, files, stats, ads',
),
);
$this->assertEqual($result, $expected);
}
/**
* testIniCheck method
*
* @access public
* @return void
*/
function testIniCheck() {
$iniFile = TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'config'. DS . 'acl.ini.php';
$Ini = new IniAcl();
$Ini->config = $Ini->readConfigFile($iniFile);
$this->Acl->adapter($Ini);
$this->assertFalse($this->Acl->check('admin', 'ads'));
$this->assertTrue($this->Acl->check('admin', 'posts'));
$this->assertTrue($this->Acl->check('jenny', 'posts'));
$this->assertTrue($this->Acl->check('jenny', 'ads'));
$this->assertTrue($this->Acl->check('paul', 'posts'));
$this->assertFalse($this->Acl->check('paul', 'ads'));
$this->assertFalse($this->Acl->check('nobody', 'comments'));
}
/**
* debug function - to help editing/creating test cases for the ACL component
*
@ -664,4 +717,5 @@ class AclComponentTest extends CakeTestCase {
return str_pad($string, $len);
}
}
?>