class OgRoleCacheContextTest in Organic groups 8
Same name in this branch
- 8 tests/src/Unit/Cache/Context/OgRoleCacheContextTest.php \Drupal\Tests\og\Unit\Cache\Context\OgRoleCacheContextTest
- 8 tests/src/Kernel/Cache/Context/OgRoleCacheContextTest.php \Drupal\Tests\og\Kernel\Cache\Context\OgRoleCacheContextTest
Tests the OG role cache context.
@group og @coversDefaultClass \Drupal\og\Cache\Context\OgRoleCacheContext
Hierarchy
- class \Drupal\Tests\UnitTestCase extends \PHPUnit\Framework\TestCase uses PhpunitCompatibilityTrait
- class \Drupal\Tests\og\Unit\Cache\Context\OgCacheContextTestBase
- class \Drupal\Tests\og\Unit\Cache\Context\OgRoleCacheContextTest uses OgRoleCacheContextTestTrait
- class \Drupal\Tests\og\Unit\Cache\Context\OgCacheContextTestBase
Expanded class hierarchy of OgRoleCacheContextTest
File
- tests/
src/ Unit/ Cache/ Context/ OgRoleCacheContextTest.php, line 24
Namespace
Drupal\Tests\og\Unit\Cache\ContextView source
class OgRoleCacheContextTest extends OgCacheContextTestBase {
use OgRoleCacheContextTestTrait;
/**
* The mocked entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface|\Prophecy\Prophecy\ObjectProphecy
*/
protected $entityTypeManager;
/**
* The mocked OG membership manager service.
*
* @var \Drupal\og\MembershipManagerInterface|\Prophecy\Prophecy\ObjectProphecy
*/
protected $membershipManager;
/**
* The mocked database connection.
*
* @var \Drupal\Core\Database\Connection|\Prophecy\Prophecy\ObjectProphecy
*/
protected $database;
/**
* The mocked private key handler.
*
* @var \Drupal\Core\PrivateKey|\Prophecy\Prophecy\ObjectProphecy
*/
protected $privateKey;
/**
* {@inheritdoc}
*/
protected function setUp() : void {
parent::setUp();
$this->entityTypeManager = $this
->prophesize(EntityTypeManagerInterface::class);
$this->membershipManager = $this
->prophesize(MembershipManagerInterface::class);
$this->database = $this
->prophesize(Connection::class);
$this->privateKey = $this
->prophesize(PrivateKey::class);
}
/**
* Tests generating of a cache context key for a user with no memberships.
*
* This is a common case, e.g. for anonymous users.
*
* @covers ::getContext
*/
public function testNoMemberships() : void {
// No memberships (an empty array) will be returned by the membership
// manager.
/** @var \Drupal\Core\Session\AccountInterface|\Prophecy\Prophecy\ObjectProphecy $user */
$user = $this
->prophesize(AccountInterface::class)
->reveal();
$this->membershipManager
->getMemberships($user
->id())
->willReturn([]);
// The result should be the predefined 'NO_CONTEXT' value.
$result = $this
->getContextResult($user);
$this
->assertEquals(OgRoleCacheContext::NO_CONTEXT, $result);
}
/**
* Tests that no cache context key is returned if a user has lost membership.
*
* This can happen if for example if a user is a member with a certain role in
* a group, and then the role is removed from config. In this case the
* membership entity will still exist, but the user will not have any roles,
* so no cache context key should be generated.
*
* @covers ::getContext
*/
public function testMembershipsWithOrphanedRole() : void {
// Mock the membership with the orphaned role. It will return a group and
// group entity type, but no roles.
/** @var \Drupal\og\OgMembershipInterface|\Prophecy\Prophecy\ObjectProphecy $membership */
$membership = $this
->prophesize(OgMembershipInterface::class);
$membership
->getRolesIds()
->willReturn([]);
// The membership with the orphaned role will be returned by the membership
// manager.
/** @var \Drupal\Core\Session\AccountInterface|\Prophecy\Prophecy\ObjectProphecy $user */
$user = $this
->prophesize(AccountInterface::class)
->reveal();
$this->membershipManager
->getMemberships($user
->id())
->willReturn([
$membership,
]);
// The result should be the predefined 'NO_CONTEXT' value.
$result = $this
->getContextResult($user);
$this
->assertEquals(OgRoleCacheContext::NO_CONTEXT, $result);
}
/**
* Tests that the correct cache context key is returned for group members.
*
* Different users might have the identical roles across a number of different
* groups. Verify that a unique hash is returned for each combination of
* roles.
*
* This tests the fallback implementation for NoSQL databases. The main
* implementation is tested in a kernel test.
*
* @param array $group_memberships
* An array that defines the roles test users have in test groups. See the
* data provider for a description of the format of the array.
* @param array $expected_identical_role_groups
* An array containing arrays of user IDs that are expected to have
* identical cache context keys, since they have identical memberships in
* the defined test groups.
*
* @see \Drupal\Tests\og\Kernel\Cache\Context\OgRoleCacheContextTest::testMemberships()
*
* @covers ::getContext
* @dataProvider membershipsProvider
*/
public function testMembershipsNoSql(array $group_memberships, array $expected_identical_role_groups) : void {
// 'Mock' the unmockable singleton that holds the Drupal settings array by
// instantiating it and populating it with a random salt.
new Settings([
'hash_salt' => $this
->randomMachineName(),
]);
// Mock the private key that will be returned by the private key handler.
$this->privateKey
->get()
->willReturn($this
->randomMachineName());
// Mock the users that are defined in the test case.
$user_ids = array_keys($group_memberships);
$users = array_map(function ($user_id) {
/** @var \Drupal\Core\Session\AccountInterface|\Prophecy\Prophecy\ObjectProphecy $user */
$user = $this
->prophesize(AccountInterface::class);
$user
->id()
->willReturn($user_id);
return $user
->reveal();
}, array_combine($user_ids, $user_ids));
// Set up the memberships that are expected to be returned from the
// membership manager.
$memberships = [];
// Use incremental IDs for the OgMembership object. These are not actually
// used for calculating the cache context, but this simulates that in the
// database no two memberships will have the same ID.
$membership_id = 0;
foreach ($group_memberships as $user_id => $group_entity_type_ids) {
$memberships[$user_id] = [];
foreach ($group_entity_type_ids as $group_entity_type_id => $group_ids) {
foreach ($group_ids as $group_id => $roles) {
// Construct the role IDs that will be returned by the membership.
$roles_ids = array_map(function (string $role_name) use ($group_entity_type_id) {
return "{$group_entity_type_id}-bundle-{$role_name}";
}, $roles);
// Mock the expected returns of method calls on the membership.
/** @var \Drupal\og\OgMembershipInterface|\Prophecy\Prophecy\ObjectProphecy $membership */
$membership = $this
->prophesize(OgMembershipInterface::class);
$membership
->getGroupEntityType()
->willReturn($group_entity_type_id);
$membership
->getGroupBundle()
->willReturn('bundle');
$membership
->getGroupId()
->willReturn($group_id);
$membership
->getRolesIds()
->willReturn($roles_ids);
$memberships[$user_id][++$membership_id] = $membership
->reveal();
}
}
}
// Calculate the cache context keys for every user.
$cache_context_ids = [];
foreach ($users as $user_id => $user) {
// When the memberships for every user in the test case are requested from
// the membership manager, the respective array of memberships will be
// returned.
$this->membershipManager
->getMemberships($user_id)
->willReturn($memberships[$user_id]);
$cache_context_ids[$user_id] = $this
->getContextResult($user);
}
// Loop over the expected results and check that all users that have
// identical roles have the same cache context key.
foreach ($expected_identical_role_groups as $expected_identical_role_group) {
// Check that the cache context keys for all users in the group are
// identical.
$cache_context_ids_subset = array_intersect_key($cache_context_ids, array_flip($expected_identical_role_group));
$this
->assertTrue(count(array_unique($cache_context_ids_subset)) === 1);
// Also check that the cache context keys for the other users are
// different than the ones from our test group.
$cache_context_id_from_test_group = reset($cache_context_ids_subset);
$cache_context_ids_from_other_users = array_diff_key($cache_context_ids, array_flip($expected_identical_role_group));
$this
->assertFalse(in_array($cache_context_id_from_test_group, $cache_context_ids_from_other_users));
}
}
/**
* {@inheritdoc}
*/
protected function getCacheContext(?AccountInterface $user = NULL) : CacheContextInterface {
return new OgRoleCacheContext($user, $this->entityTypeManager
->reveal(), $this->membershipManager
->reveal(), $this->database
->reveal(), $this->privateKey
->reveal());
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
OgRoleCacheContextTest:: |
protected | property | The mocked database connection. | |
OgRoleCacheContextTest:: |
protected | property | The mocked entity type manager. | |
OgRoleCacheContextTest:: |
protected | property | The mocked OG membership manager service. | |
OgRoleCacheContextTest:: |
protected | property | The mocked private key handler. | |
OgRoleCacheContextTest:: |
protected | function |
Returns the instantiated cache context service which is being tested. Overrides OgCacheContextTestBase:: |
|
OgRoleCacheContextTest:: |
protected | function |
Overrides UnitTestCase:: |
|
OgRoleCacheContextTest:: |
public | function | Tests that the correct cache context key is returned for group members. | |
OgRoleCacheContextTest:: |
public | function | Tests that no cache context key is returned if a user has lost membership. | |
OgRoleCacheContextTest:: |
public | function | Tests generating of a cache context key for a user with no memberships. | |
OgRoleCacheContextTestTrait:: |
protected | function | Return the context result. | |
OgRoleCacheContextTestTrait:: |
public | function | Data provider for testMemberships(). | |
PhpunitCompatibilityTrait:: |
public | function | Returns a mock object for the specified class using the available method. | |
PhpunitCompatibilityTrait:: |
public | function | Compatibility layer for PHPUnit 6 to support PHPUnit 4 code. | |
UnitTestCase:: |
protected | property | The random generator. | |
UnitTestCase:: |
protected | property | The app root. | 1 |
UnitTestCase:: |
protected | function | Asserts if two arrays are equal by sorting them first. | |
UnitTestCase:: |
protected | function | Mocks a block with a block plugin. | 1 |
UnitTestCase:: |
protected | function | Returns a stub class resolver. | |
UnitTestCase:: |
public | function | Returns a stub config factory that behaves according to the passed array. | |
UnitTestCase:: |
public | function | Returns a stub config storage that returns the supplied configuration. | |
UnitTestCase:: |
protected | function | Sets up a container with a cache tags invalidator. | |
UnitTestCase:: |
protected | function | Gets the random generator for the utility methods. | |
UnitTestCase:: |
public | function | Returns a stub translation manager that just returns the passed string. | |
UnitTestCase:: |
public | function | Generates a unique random string containing letters and numbers. |