public function OgRoleCacheContextTest::testMembershipsNoSql in Organic groups 8
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.
@covers ::getContext @dataProvider membershipsProvider
Parameters
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.
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 also
\Drupal\Tests\og\Kernel\Cache\Context\OgRoleCacheContextTest::testMemberships()
File
- tests/
src/ Unit/ Cache/ Context/ OgRoleCacheContextTest.php, line 138
Class
- OgRoleCacheContextTest
- Tests the OG role cache context.
Namespace
Drupal\Tests\og\Unit\Cache\ContextCode
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));
}
}