search_api_autocomplete-8.x-1.x-dev/tests/src/Unit/AccessTest.php

tests/src/Unit/AccessTest.php
<?php

namespace Drupal\Tests\search_api_autocomplete\Unit;

use Drupal\Core\Access\AccessResultReasonInterface;
use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\Core\Cache\Context\CacheContextsManager;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Session\AccountInterface;
use Drupal\search_api\IndexInterface;
use Drupal\search_api_autocomplete\SearchInterface;
use Drupal\search_api_autocomplete\Utility\AutocompleteHelper;
use Drupal\Tests\UnitTestCase;

/**
 * Tests access to the autocomplete path.
 *
 * @group search_api_autocomplete
 *
 * @coversDefaultClass \Drupal\search_api_autocomplete\Utility\AutocompleteHelper
 */
class AccessTest extends UnitTestCase {

  /**
   * The autocomplete helper object used for the test.
   *
   * @var \Drupal\search_api_autocomplete\Utility\AutocompleteHelperInterface
   */
  protected $autocompleteHelper;

  /**
   * The search entity used in this test.
   *
   * @var \Drupal\search_api_autocomplete\SearchInterface|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $search;

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

    $this->autocompleteHelper = new AutocompleteHelper();
    $this->search = $this->createMock(SearchInterface::class);
    $this->search->method('id')->willReturn('test');
    $this->search->method('getCacheContexts')->willReturn(['test']);
    $this->search->method('getCacheTags')->willReturn(['test']);
    $this->search->method('getCacheMaxAge')->willReturn(1337);

    // \Drupal\Core\Access\AccessResult::addCacheContexts() will need the cache
    // contexts manager service for validation.
    $container = new ContainerBuilder();
    $contexts = ['test', 'user.permissions'];
    $cacheContextsManager = new CacheContextsManager($container, $contexts);
    $container->set('cache_contexts_manager', $cacheContextsManager);
    \Drupal::setContainer($container);
  }

  /**
   * Tests access to the autocomplete path under a given set of conditions.
   *
   * @param array $options
   *   Associative array of options, containing one or more of the following:
   *   - status: Whether the search should be enabled.
   *   - index: Whether the search's index should exist.
   *   - index_status: Whether the search's index should be enabled.
   *   - permission: Whether the user should have the necessary permission to
   *     access the search.
   *   - admin: Whether the user should have the "administer
   *     search_api_autocomplete" permission.
   *   All options default to TRUE.
   * @param bool $should_be_allowed
   *   Whether access should be allowed.
   *
   * @covers ::access
   *
   * @dataProvider accessTestDataProvider
   */
  public function testAccess(array $options, $should_be_allowed) {
    $options += [
      'status' => TRUE,
      'index' => TRUE,
      'index_status' => TRUE,
      'permission' => TRUE,
      'admin' => TRUE,
    ];

    $this->search->method('status')->willReturn($options['status']);
    $this->search->method('hasValidIndex')->willReturn($options['index']);
    if ($options['index']) {
      $index = $this->createMock(IndexInterface::class);
      $index->method('status')->willReturn($options['index_status']);
      $this->search->method('getIndex')->willReturn($index);
    }

    /** @var \Drupal\Core\Session\AccountInterface|\PHPUnit\Framework\MockObject\MockObject $account */
    $account = $this->createMock(AccountInterface::class);
    $permission = 'use search_api_autocomplete for ' . $this->search->id();
    $account->method('hasPermission')->willReturnMap([
      [$permission, $options['permission']],
      ['administer search_api_autocomplete', $options['admin']],
    ]);

    // Needn't really be AccessResultNeutral, of course, but this is the easiest
    // way to get all the possible interfaces.
    /** @var \Drupal\Core\Access\AccessResultNeutral $result */
    $result = $this->autocompleteHelper->access($this->search, $account);
    $this->assertEquals($should_be_allowed, $result->isAllowed());
    $this->assertEquals(FALSE, $result->isForbidden());
    $this->assertEquals(!$should_be_allowed, $result->isNeutral());

    $this->assertInstanceOf(CacheableDependencyInterface::class, $result);
    $this->assertContains('test', $result->getCacheContexts());
    $this->assertContains('test', $result->getCacheTags());
    $this->assertEquals(1337, $result->getCacheMaxAge());

    if (!$should_be_allowed) {
      $this->assertInstanceOf(AccessResultReasonInterface::class, $result);
      $this->assertEquals("The \"$permission\" permission is required and autocomplete for this search must be enabled.", $result->getReason());
    }
  }

  /**
   * Provides test data for the testAccess() method.
   *
   * @return array
   *   An array containing arrays of method arguments for testAccess().
   *
   * @see \Drupal\Tests\search_api_autocomplete\Unit\AccessTest::testAccess
   */
  public static function accessTestDataProvider(): array {
    return [
      'search disabled' => [
        ['status' => FALSE],
        FALSE,
      ],
      'index does not exist' => [
        ['index' => FALSE],
        FALSE,
      ],
      'index disabled' => [
        ['index_status' => FALSE],
        FALSE,
      ],
      'search-specific permission missing' => [
        ['permission' => FALSE, 'admin' => FALSE],
        FALSE,
      ],
      'search-specific permission present' => [
        ['admin' => FALSE],
        TRUE,
      ],
      'is admin' => [
        ['permission' => FALSE],
        TRUE,
      ],
    ];
  }

}

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

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