og-8.x-1.x-dev/tests/src/Kernel/Entity/GetMembershipsTest.php

tests/src/Kernel/Entity/GetMembershipsTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\og\Kernel\Entity;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\og\Traits\OgMembershipCreationTrait;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\og\Og;
use Drupal\og\OgMembershipInterface;
use Drupal\user\Entity\User;

/**
 * Tests retrieving OgMembership entities associated with a given user.
 *
 * @group og
 * @coversDefaultClass \Drupal\og\Og
 */
class GetMembershipsTest extends KernelTestBase {

  use OgMembershipCreationTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'entity_test',
    'field',
    'node',
    'og',
    'options',
    'system',
    'user',
  ];

  /**
   * Test groups.
   *
   * @var \Drupal\Core\Entity\EntityInterface[]
   */
  protected array $groups = [];

  /**
   * Test users.
   *
   * @var \Drupal\user\UserInterface[]
   */
  protected array $users;

  /**
   * The entity type manager.
   */
  protected EntityTypeManagerInterface $entityTypeManager;

  /**
   * {@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->installSchema('user', ['users_data']);

    $this->entityTypeManager = $this->container->get('entity_type.manager');

    // Create group admin user.
    $group_admin = User::create(['name' => $this->randomString()]);
    $group_admin->save();

    // Create two groups.
    for ($i = 0; $i < 2; $i++) {
      $bundle = "node_$i";
      NodeType::create([
        'name' => $this->randomString(),
        'type' => $bundle,
      ])->save();
      Og::groupTypeManager()->addGroup('node', $bundle);

      $group = Node::create([
        'title' => $this->randomString(),
        'type' => $bundle,
        'uid' => $group_admin->id(),
      ]);
      $group->save();
      $this->groups[] = $group;
    }

    // Create test users with different membership states in the two groups.
    $matrix = [
      // A user which is an active member of the first group.
      [OgMembershipInterface::STATE_ACTIVE, NULL],

      // A user which is a pending member of the second group.
      [NULL, OgMembershipInterface::STATE_PENDING],

      // A user which is an active member of both groups.
      [OgMembershipInterface::STATE_ACTIVE, OgMembershipInterface::STATE_ACTIVE],

      // A user which is a pending member of the first group and blocked in the
      // second group.
      [
        OgMembershipInterface::STATE_PENDING,
        OgMembershipInterface::STATE_BLOCKED,
      ],

      // A user which is not subscribed to either of the two groups.
      [NULL, NULL],
    ];

    foreach ($matrix as $user_key => $states) {
      $user = User::create(['name' => $this->randomString()]);
      $user->save();
      $this->users[$user_key] = $user;
      foreach ($states as $group_key => $state) {
        $group = $this->groups[$group_key];
        if ($state) {
          $this->createOgMembership($group, $user, NULL, $state);
        }
      }
    }
  }

  /**
   * Tests retrieval of OG Membership entities associated with a given user.
   *
   * @param int $index
   *   The array index in the $this->users array of the user to test.
   * @param array $states
   *   Array with the states to retrieve.
   * @param array $expected
   *   An array containing the expected results to be returned.
   *
   * @covers ::getMemberships
   * @dataProvider membershipDataProvider
   */
  public function testGetMemberships(int $index, array $states, array $expected): void {
    $result = Og::getMemberships($this->users[$index], $states);

    // Check that the correct number of results is returned.
    $this->assertEquals(count($expected), count($result));

    // Inspect the results that were returned.
    foreach ($result as $key => $membership) {
      // Check that all result items are OgMembership objects.
      $this->assertInstanceOf('Drupal\og\OgMembershipInterface', $membership);
      // Check that the results are keyed by OgMembership ID.
      $this->assertEquals($membership->id(), $key);
    }

    // Check that all expected results are returned.
    foreach ($expected as $expected_group) {
      $expected_id = $this->groups[$expected_group]->id();
      foreach ($result as $membership) {
        if ($membership->getGroupId() === $expected_id) {
          // Test successful: the expected result was found.
          continue 2;
        }
      }
      $this->fail("The expected group with ID $expected_id was not found.");
    }
  }

  /**
   * Provides test data to test retrieval of memberships.
   *
   * @return array
   *   An array of test properties. Each property is an indexed array with the
   *   following items:
   *   - The key of the user in the $this->users array for which to retrieve
   *     memberships.
   *   - An array of membership states to filter on.
   *   - An array containing the expected results to be returned.
   */
  public static function membershipDataProvider(): array {
    return [
      // The first user is an active member of the first group.
      // Query default values. The group should be returned.
      [0, [], [0]],
      // Filter by active state.
      [0, [OgMembershipInterface::STATE_ACTIVE], [0]],
      // Filter by active + pending state.
      [0, [
        OgMembershipInterface::STATE_ACTIVE,
        OgMembershipInterface::STATE_PENDING,
      ], [0],
      ],
      // Filter by blocked + pending state. Since the user is active this should
      // not return any matches.
      [0, [
        OgMembershipInterface::STATE_BLOCKED,
        OgMembershipInterface::STATE_PENDING,
      ], [],
      ],

      // The second user is a pending member of the second group.
      // Query default values. The group should be returned.
      [1, [], [1]],
      // Filter by pending state.
      [1, [OgMembershipInterface::STATE_PENDING], [1]],
      // Filter by active state. The user is pending so this should not return
      // any matches.
      [1, [OgMembershipInterface::STATE_ACTIVE], []],

      // The third user is an active member of both groups.
      // Query default values. Both groups should be returned.
      [2, [], [0, 1]],
      // Filter by active state.
      [2, [OgMembershipInterface::STATE_ACTIVE], [0, 1]],
      // Filter by blocked state. This should not return any matches.
      [2, [OgMembershipInterface::STATE_BLOCKED], []],

      // The fourth user is a pending member of the first group and blocked in
      // the second group.
      // Query default values. Both groups should be returned.
      [3, [], [0, 1]],
      // Filter by active state. No results should be returned.
      [3, [OgMembershipInterface::STATE_ACTIVE], []],
      // Filter by pending state.
      [3, [OgMembershipInterface::STATE_PENDING], [0]],
      // Filter by blocked state.
      [3, [OgMembershipInterface::STATE_BLOCKED], [1]],
      // Filter by combinations of states.
      [3, [
        OgMembershipInterface::STATE_ACTIVE,
        OgMembershipInterface::STATE_PENDING,
      ], [0],
      ],
      [3, [
        OgMembershipInterface::STATE_ACTIVE,
        OgMembershipInterface::STATE_PENDING,
        OgMembershipInterface::STATE_BLOCKED,
      ], [0, 1],
      ],
      [3, [
        OgMembershipInterface::STATE_ACTIVE,
        OgMembershipInterface::STATE_BLOCKED,
      ], [1],
      ],
      [3, [
        OgMembershipInterface::STATE_PENDING,
        OgMembershipInterface::STATE_BLOCKED,
      ], [0, 1],
      ],

      // A user which is not subscribed to either of the two groups.
      [4, [], []],
      [4, [OgMembershipInterface::STATE_ACTIVE], []],
      [4, [OgMembershipInterface::STATE_BLOCKED], []],
      [4, [OgMembershipInterface::STATE_PENDING], []],
      [4, [
        OgMembershipInterface::STATE_ACTIVE,
        OgMembershipInterface::STATE_PENDING,
        OgMembershipInterface::STATE_BLOCKED,
      ], [],
      ],
    ];
  }

  /**
   * Tests that memberships are deleted when a user is deleted.
   */
  public function testOrphanedMembershipsDeletion(): void {
    foreach ($this->users as $user) {
      // Keep track of the user ID before deleting the user.
      $user_id = $user->id();

      $user->delete();

      // Check that the memberships for the user are deleted from the database.
      $memberships = $this->entityTypeManager
        ->getStorage('og_membership')
        ->getQuery()
        ->accessCheck()
        ->condition('uid', $user_id)
        ->execute();

      $this->assertEmpty($memberships);
    }
  }

}

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

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