NEW Add actWithPermission to SapphireTest for shortcut to perform actions with specific permissions

This commit is contained in:
Daniel Hensby 2017-09-26 12:16:02 +01:00
parent 5f8eb0806e
commit 28552155c3
No known key found for this signature in database
GPG Key ID: 5DE415D786BBB2FD
2 changed files with 51 additions and 5 deletions

View File

@ -950,13 +950,24 @@ class SapphireTest extends PHPUnit_Framework_TestCase implements TestOnly
}
/**
* Create a member and group with the given permission code, and log in with it.
* Returns the member ID.
* A wrapper for automatically performing callbacks as a user with a specific permission
*
* @param string|array $permCode Either a permission, or list of permissions
* @return int Member ID
* @param string|array $permCode
* @param callable $callback
* @return mixed
*/
public function logInWithPermission($permCode = "ADMIN")
public function actWithPermission($permCode, $callback)
{
return Member::actAs($this->createMemberWithPermission($permCode), $callback);
}
/**
* Create Member and Group objects on demand with specific permission code
*
* @param string|array $permCode
* @return Member
*/
protected function createMemberWithPermission($permCode)
{
if (is_array($permCode)) {
$permArray = $permCode;
@ -997,6 +1008,19 @@ class SapphireTest extends PHPUnit_Framework_TestCase implements TestOnly
$this->cache_generatedMembers[$permCode] = $member;
}
return $member;
}
/**
* Create a member and group with the given permission code, and log in with it.
* Returns the member ID.
*
* @param string|array $permCode Either a permission, or list of permissions
* @return int Member ID
*/
public function logInWithPermission($permCode = "ADMIN")
{
$member = $this->createMemberWithPermission($permCode);
$this->logInAs($member);
return $member->ID;
}

View File

@ -3,6 +3,8 @@
namespace SilverStripe\Dev\Tests;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
class SapphireTestTest extends SapphireTest
{
@ -29,4 +31,24 @@ class SapphireTestTest extends SapphireTest
$this->resolveFixturePath(dirname(__DIR__) .'/ORM/DataObjectTest.yml')
);
}
public function testActWithPermission()
{
$this->logOut();
$this->assertFalse(Permission::check('ADMIN'));
$this->actWithPermission('ADMIN', function () {
$this->assertTrue(Permission::check('ADMIN'));
// check nested actAs calls work as expected
Member::actAs(null, function () {
$this->assertFalse(Permission::check('ADMIN'));
});
});
}
public function testCreateMemberWithPermission()
{
$this->assertCount(0, Member::get()->filter([ 'Email' => 'TESTPERM@example.org' ]));
$this->createMemberWithPermission('TESTPERM');
$this->assertCount(1, Member::get()->filter([ 'Email' => 'TESTPERM@example.org' ]));
}
}