currency-8.x-3.3/tests/src/Unit/Entity/Currency/CurrencyAccessControlHandlerTest.php

tests/src/Unit/Entity/Currency/CurrencyAccessControlHandlerTest.php
<?php

namespace Drupal\Tests\currency\Unit\Entity\Currency;

use Drupal\Core\Cache\Context\CacheContextsManager;
use Drupal\Core\DependencyInjection\Container;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\currency\Entity\Currency\CurrencyAccessControlHandler;
use Drupal\currency\Entity\CurrencyInterface;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Tests the currency access control handler.
 *
 * @coversDefaultClass \Drupal\currency\Entity\Currency\CurrencyAccessControlHandler
 *
 * @group Currency
 */
class CurrencyAccessControlHandlerTest extends UnitTestCase {

  /**
   * The cache contexts manager.
   *
   * @var \Drupal\Core\Cache\Context\CacheContextsManager|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $cacheContextsManager;

  /**
   * Information about the entity type.
   *
   * @var \Drupal\Core\Entity\EntityTypeInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $entityType;

  /**
   * The module handler.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $moduleHandler;

  /**
   * The class under test.
   *
   * @var \Drupal\currency\Entity\Currency\CurrencyAccessControlHandler
   */
  protected $sut;

  /**
   * {@inheritdoc}
   */
  public function setUp(): void {
    parent::setUp();

    $this->cacheContextsManager = $this->createMock(CacheContextsManager::class);
    $this->cacheContextsManager->expects($this->any())
      ->method('assertValidTokens')
      ->willReturn(TRUE);

    $container = new Container();
    $container->set('cache_contexts_manager', $this->cacheContextsManager);
    \Drupal::setContainer($container);

    $this->entityType = $this->createMock(EntityTypeInterface::class);

    $this->moduleHandler = $this->createMock(ModuleHandlerInterface::class);

    $this->sut = new CurrencyAccessControlHandler($this->entityType, $this->moduleHandler);
  }

  /**
   * @covers ::createInstance
   * @covers ::__construct
   */
  public function testCreateInstance() {
    $container = $this->createMock(ContainerInterface::class);
    $container->expects($this->once())
      ->method('get')
      ->with('module_handler')
      ->willReturn($this->moduleHandler);

    $sut = CurrencyAccessControlHandler::createInstance($container, $this->entityType);
    $this->assertInstanceOf(CurrencyAccessControlHandler::class, $sut);
  }

  /**
   * @covers ::checkAccess
   *
   * @dataProvider providerTestCheckAccess
   */
  public function testCheckAccess($expected_value, $operation, $has_permission, $permission, $entity_status = FALSE, $currency_code = NULL) {
    $account = $this->createMock(AccountInterface::class);
    $account->expects($this->any())
      ->method('hasPermission')
      ->with($permission)
      ->willReturn((bool) $has_permission);

    $language = $this->createMock(LanguageInterface::class);

    $currency = $this->createMock(CurrencyInterface::class);
    $currency->expects($this->any())
      ->method('getCurrencyCode')
      ->willReturn($currency_code);
    $currency->expects($this->any())
      ->method('language')
      ->willReturn($language);
    $currency->expects($this->any())
      ->method('status')
      ->willReturn($entity_status);

    $this->moduleHandler->expects($this->any())
      ->method('invokeAll')
      ->willReturn([]);

    $method = new \ReflectionMethod($this->sut, 'checkAccess');
    $method->setAccessible(TRUE);

    $this->assertSame($expected_value, $method->invoke($this->sut, $currency, $operation, $account)->isAllowed());
  }

  /**
   * Provides data to self::testCheckAccess().
   */
  public static function providerTestCheckAccess() {
    return [
      // The default currency cannot be deleted, even with permission.
      [FALSE, 'delete', TRUE, 'currency.currency.delete', TRUE, 'XXX'],
      // A disabled currency cannot be disabled.
      [FALSE, 'disable', TRUE, 'currency.currency.update', FALSE],
      // An enabled currency cannot be enabled.
      [FALSE, 'enable', TRUE, 'currency.currency.update', TRUE],
      // A disabled currency cannot be enabled without permission.
      [FALSE, 'disable', FALSE, 'currency.currency.update', TRUE],
      // A disabled currency cannot be enabled without permission.
      [FALSE, 'enable', FALSE, 'currency.currency.update', FALSE],
      // A disabled currency can be enabled.
      [TRUE, 'disable', TRUE, 'currency.currency.update', TRUE],
      // A disabled currency can be enabled.
      [TRUE, 'enable', TRUE, 'currency.currency.update', FALSE],
      // A currency cannot be updated without permission.
      [FALSE, 'update', FALSE, 'currency.currency.update'],
      // A currency can be updated with permission.
      [TRUE, 'update', TRUE, 'currency.currency.update'],
      // A currency cannot be deleted without permission.
      [FALSE, 'delete', FALSE, 'currency.currency.delete'],
      // A currency can be deleted with permission.
      [TRUE, 'delete', TRUE, 'currency.currency.delete'],
    ];
  }

  /**
   * @covers ::checkCreateAccess
   *
   * @dataProvider providerTestCheckCreateAccess
   */
  public function testCheckCreateAccess($expected_value, $has_permission) {
    $account = $this->createMock(AccountInterface::class);
    $account->expects($this->once())
      ->method('hasPermission')
      ->with('currency.currency.create')
      ->willReturn($has_permission);
    $context = [];

    $method = new \ReflectionMethod($this->sut, 'checkCreateAccess');
    $method->setAccessible(TRUE);

    $this->assertSame($expected_value, $method->invoke($this->sut, $account, $context)->isAllowed());
  }

  /**
   * Provides data to self::testCheckCreateAccess().
   */
  public static function providerTestCheckCreateAccess() {
    return [
      [TRUE, TRUE],
      [FALSE, FALSE],
    ];
  }

}

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

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