og-8.x-1.x-dev/tests/src/Kernel/GroupMembershipTypeConfigTest.php
tests/src/Kernel/GroupMembershipTypeConfigTest.php
<?php
declare(strict_types=1);
namespace Drupal\Tests\og\Kernel;
use Drupal\KernelTests\KernelTestBase;
use Drupal\node\Entity\NodeType;
use Drupal\og\Entity\OgMembershipType;
use Drupal\og\GroupTypeManagerInterface;
use Drupal\og\OgMembershipInterface;
/**
* Tests the group membership type configuration functionality.
*
* @group og
* @coversDefaultClass \Drupal\og\GroupTypeManager
*/
class GroupMembershipTypeConfigTest extends KernelTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = [
'field',
'node',
'og',
'options',
'system',
'user',
];
/**
* The group type manager.
*/
protected GroupTypeManagerInterface $groupTypeManager;
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->installConfig(['og']);
$this->installEntitySchema('node');
$this->installEntitySchema('og_membership');
$this->installEntitySchema('user');
$this->installSchema('system', ['sequences']);
$this->groupTypeManager = $this->container->get('og.group_type_manager');
// Create group types for testing.
NodeType::create([
'name' => 'Group Type A',
'type' => 'group_type_a',
])->save();
NodeType::create([
'name' => 'Group Type B',
'type' => 'group_type_b',
])->save();
// Add them as OG groups.
$this->groupTypeManager->addGroup('node', 'group_type_a');
$this->groupTypeManager->addGroup('node', 'group_type_b');
// Create a custom membership type for testing.
OgMembershipType::create([
'type' => 'premium_membership',
'name' => 'Premium Membership',
])->save();
}
/**
* Tests getting default and setting custom membership types.
*
* @covers ::getGroupDefaultMembershipType
* @covers ::setGroupDefaultMembershipType
*/
public function testGetAndSetMembershipType(): void {
// Should return default when none is configured.
$membership_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_a');
$this->assertSame(OgMembershipInterface::TYPE_DEFAULT, $membership_type);
// Set a custom membership type.
$this->groupTypeManager->setGroupDefaultMembershipType('node', 'group_type_b', 'premium_membership');
// Should return the custom type.
$custom_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_b');
$this->assertSame('premium_membership', $custom_type);
// Other bundles should still return default.
$default_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_a');
$this->assertSame(OgMembershipInterface::TYPE_DEFAULT, $default_type);
}
/**
* Tests that membership type configuration persists.
*
* @covers ::setGroupDefaultMembershipType
* @covers ::getGroupDefaultMembershipType
*/
public function testMembershipTypeConfigPersistence(): void {
$this->groupTypeManager->setGroupDefaultMembershipType('node', 'group_type_b', 'premium_membership');
// Rebuild the container to get a fresh instance.
$this->container->get('kernel')->rebuildContainer();
$this->groupTypeManager = $this->container->get('og.group_type_manager');
// Configuration should persist.
$membership_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_b');
$this->assertSame('premium_membership', $membership_type);
}
/**
* Tests that removing a group bundle cleans up its membership type config.
*
* @covers ::removeGroup
* @covers ::getGroupDefaultMembershipType
*/
public function testRemoveGroupCleansUpMembershipType(): void {
// Set a custom membership type.
$this->groupTypeManager->setGroupDefaultMembershipType('node', 'group_type_b', 'premium_membership');
$membership_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_b');
$this->assertSame('premium_membership', $membership_type);
// Remove the group bundle.
$this->groupTypeManager->removeGroup('node', 'group_type_b');
// Should return default (the old config should be cleaned up).
$default_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_b');
$this->assertSame(OgMembershipInterface::TYPE_DEFAULT, $default_type);
}
/**
* Tests that a deleted membership type falls back to default.
*
* @covers ::getGroupDefaultMembershipType
*/
public function testDeletedMembershipTypeFallsBackToDefault(): void {
// Set a custom membership type.
$this->groupTypeManager->setGroupDefaultMembershipType('node', 'group_type_a', 'premium_membership');
// Verify it's configured correctly.
$membership_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_a');
$this->assertSame('premium_membership', $membership_type);
// Now delete the membership type entity.
$membership_type_entity = \Drupal::entityTypeManager()
->getStorage('og_membership_type')
->load('premium_membership');
$membership_type_entity->delete();
// The getGroupDefaultMembershipType() should now fall back to default.
$fallback_type = $this->groupTypeManager->getGroupDefaultMembershipType('node', 'group_type_a');
$this->assertSame(
OgMembershipInterface::TYPE_DEFAULT,
$fallback_type,
'When a configured membership type is deleted, the system should fall back to the default type.'
);
// Verify that creating a membership with this group works correctly.
$user = $this->container->get('entity_type.manager')
->getStorage('user')
->create(['name' => $this->randomString()]);
$user->save();
$group = $this->container->get('entity_type.manager')
->getStorage('node')
->create([
'type' => 'group_type_a',
'title' => $this->randomString(),
]);
$group->save();
// Create a membership - should use the default type, not fail.
$membership = $this->container->get('og.membership_manager')
->createMembership($group, $user);
$this->assertSame(
OgMembershipInterface::TYPE_DEFAULT,
$membership->bundle(),
'Membership creation should use the default type when the configured type is deleted.'
);
}
}
