diff --git a/src/Dev/SapphireTest.php b/src/Dev/SapphireTest.php index b8ae2fb48..ea3a7895f 100644 --- a/src/Dev/SapphireTest.php +++ b/src/Dev/SapphireTest.php @@ -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; } diff --git a/tests/php/Dev/SapphireTestTest.php b/tests/php/Dev/SapphireTestTest.php index 056466f3e..8e3d64a39 100644 --- a/tests/php/Dev/SapphireTestTest.php +++ b/tests/php/Dev/SapphireTestTest.php @@ -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' ])); + } }