View source
<?php
declare (strict_types=1);
namespace Drupal\Tests\og\Kernel\Action;
use Drupal\Core\Access\AccessResultAllowed;
use Drupal\Core\Session\AnonymousUserSession;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\og\Traits\OgMembershipCreationTrait;
use Drupal\Tests\user\Traits\UserCreationTrait;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\og\Entity\OgRole;
use Drupal\og\OgMembershipInterface;
use Drupal\og\OgRoleInterface;
abstract class ActionTestBase extends KernelTestBase {
use OgMembershipCreationTrait;
use UserCreationTrait;
protected $pluginId;
public static $modules = [
'node',
'og',
'system',
'user',
];
protected $users;
protected $memberships;
protected $group;
protected $roles;
protected $membershipManager;
protected $groupTypeManager;
protected function setUp() : void {
parent::setUp();
$this
->installEntitySchema('og_membership');
$this
->installEntitySchema('user');
$this
->installEntitySchema('node');
$this
->installSchema('system', [
'sequences',
]);
$this->membershipManager = $this->container
->get('og.membership_manager');
$this->groupTypeManager = $this->container
->get('og.group_type_manager');
$this->users['uid1'] = $this
->createUser();
$this->users['group_owner'] = $this
->createUser();
$group_bundle = mb_strtolower($this
->randomMachineName());
NodeType::create([
'type' => $group_bundle,
'name' => $this
->randomString(),
])
->save();
$this->groupTypeManager
->addGroup('node', $group_bundle);
$this->group = Node::create([
'title' => $this
->randomString(),
'type' => $group_bundle,
'uid' => $this->users['group_owner']
->id(),
]);
$this->group
->save();
$this->memberships['group_owner'] = $this->membershipManager
->getMembership($this->group, $this->users['group_owner']
->id());
$this->roles['administrator'] = OgRole::getRole('node', $group_bundle, OgRoleInterface::ADMINISTRATOR);
$this->roles['moderator'] = OgRole::create();
$this->roles['moderator']
->setGroupType('node')
->setGroupBundle($group_bundle)
->setName('moderator')
->grantPermission('manage members')
->save();
$this
->createUsers();
}
protected function createUsers() {
$this->users['anonymous'] = new AnonymousUserSession();
$this->users['authenticated'] = $this
->createUser();
$this->users['administrator'] = $this
->createUser([
'administer organic groups',
]);
$this->users['member'] = $this
->createUser();
$this->memberships['member'] = $this
->createOgMembership($this->group, $this->users['member']);
$this->users['pending'] = $this
->createUser();
$this->memberships['pending'] = $this
->createOgMembership($this->group, $this->users['pending'], NULL, OgMembershipInterface::STATE_PENDING);
$this->users['blocked'] = $this
->createUser();
$this->memberships['blocked'] = $this
->createOgMembership($this->group, $this->users['blocked'], NULL, OgMembershipInterface::STATE_BLOCKED);
$this->users['group_administrator'] = $this
->createUser();
$this->memberships['group_administrator'] = $this
->createOgMembership($this->group, $this->users['group_administrator'], [
OgRoleInterface::AUTHENTICATED,
OgRoleInterface::ADMINISTRATOR,
]);
$this->users['group_moderator'] = $this
->createUser();
$this->memberships['group_moderator'] = $this
->createOgMembership($this->group, $this->users['group_moderator'], [
OgRoleInterface::AUTHENTICATED,
'moderator',
]);
}
public function getPlugin($configuration = []) {
$plugin_manager = $this->container
->get('plugin.manager.action');
return $plugin_manager
->createInstance($this->pluginId, $configuration);
}
public abstract function testExecute($membership);
public function testAccess() {
$test_cases = $this
->accessProvider();
foreach ($test_cases as $test_case) {
list($user, $membership) = $test_case;
if ($user === 'group_owner') {
$this
->config('og.settings')
->set('group_manager_full_access', $test_case[2])
->save();
}
$plugin = $this
->getPlugin();
$access_as_object = $plugin
->access($this->memberships[$membership], $this->users[$user], TRUE);
$this
->assertTrue($access_as_object instanceof AccessResultAllowed, "{$user} {$membership}");
$access_as_boolean = $plugin
->access($this->memberships[$membership], $this->users[$user], FALSE);
$this
->assertTrue($access_as_boolean);
}
}
public function testNoAccess() {
$test_cases = $this
->noAccessProvider();
foreach ($test_cases as $test_case) {
list($user, $membership) = $test_case;
if ($user === 'group_owner') {
$this
->config('og.settings')
->set('group_manager_full_access', $test_case[2])
->save();
}
$plugin = $this
->getPlugin();
$access_as_object = $plugin
->access($this->memberships[$membership], $this->users[$user], TRUE);
$this
->assertFalse($access_as_object instanceof AccessResultAllowed);
$access_as_boolean = $plugin
->access($this->memberships[$membership], $this->users[$user], FALSE);
$this
->assertFalse($access_as_boolean);
}
}
public abstract function executeProvider();
public abstract function accessProvider();
public abstract function noAccessProvider();
}