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.'
    );
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc