rabbit_hole-8.x-1.x-dev/tests/src/Kernel/BehaviorInvokerTest.php

tests/src/Kernel/BehaviorInvokerTest.php
<?php

namespace Drupal\Tests\rabbit_hole\Kernel;

use Drupal\Core\DrupalKernel;
use Drupal\KernelTests\KernelTestBase;
use Drupal\node\Entity\Node;
use Drupal\node\NodeInterface;
use Drupal\rabbit_hole\Entity\BehaviorSettings;
use Drupal\rabbit_hole\Plugin\RabbitHoleBehaviorPlugin\PageNotFound;
use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
use Drupal\Tests\user\Traits\UserCreationTrait;
use Drupal\user\Entity\User;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

/**
 * Test cases for BehaviorInvoker.
 *
 * @coversDefaultClass \Drupal\rabbit_hole\BehaviorInvoker
 * @group rabbit_hole
 */
class BehaviorInvokerTest extends KernelTestBase {

  use ContentTypeCreationTrait;
  use UserCreationTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'system',
    'filter',
    'text',
    'field',
    'user',
    'node',
    'rabbit_hole',
  ];

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->setUpCurrentUser();
    $this->installEntitySchema('node');
    $this->installEntitySchema('user');
    $this->installConfig(['filter', 'node', 'system', 'rabbit_hole']);

    \Drupal::service('rabbit_hole.behavior_settings_manager')->enableEntityType('node');

    $this->createContentType(['type' => 'article']);
    $this->createContentType(['type' => 'page']);

    BehaviorSettings::loadByEntityTypeBundle('node', 'article')
      ->setAction('page_not_found')
      ->setNoBypass(FALSE)
      ->save();

    BehaviorSettings::loadByEntityTypeBundle('node', 'page')
      ->setAction('page_not_found')
      ->setNoBypass(TRUE)
      ->save();
  }

  /**
   * @covers ::getBehaviorPlugin()
   */
  public function testGetBehaviorPlugin() {
    $node1 = Node::create(['title' => '#freeAzov', 'type' => 'article']);
    $node1->save();
    $node2 = Node::create(['title' => '#standWithUkraine', 'type' => 'page']);
    $node2->save();

    $behavior_invoker = \Drupal::service('rabbit_hole.behavior_invoker');

    $this->setUpCurrentUser([], [], TRUE);
    // "No bypass" for articles is disabled, so admin should see the page.
    // In other words, the plugin should be not available.
    $this->assertNull($behavior_invoker->getBehaviorPlugin($node1));
    // For pages, "no bypass" is enabled, so action plugin is expected.
    $this->assertInstanceOf(PageNotFound::class, $behavior_invoker->getBehaviorPlugin($node2));

    // Verify that regular user cannot access article page.
    $this->setUpCurrentUser();
    $this->assertInstanceOf(PageNotFound::class, $behavior_invoker->getBehaviorPlugin($node1));
  }

  /**
   * @covers ::getEntity()
   */
  public function testGetEntity() {
    $behavior_invoker = \Drupal::service('rabbit_hole.behavior_invoker');
    $class_loader = require $this->root . '/autoload.php';
    $kernel = new DrupalKernel('testing', $class_loader, FALSE);

    // Supported, not enabled.
    User::create(['name' => 'borisjohnsonuk'])->save();
    $event = new RequestEvent($kernel, $this->createRequest('/user/1'), HttpKernelInterface::MASTER_REQUEST);
    $this->assertEquals(FALSE, $behavior_invoker->getEntity($event));

    // Enabled.
    Node::create(['title' => 'God Save the King', 'type' => 'some'])->save();
    $event = new RequestEvent($kernel, $this->createRequest('/node/1'), HttpKernelInterface::MASTER_REQUEST);
    $this->assertInstanceOf(NodeInterface::class, $behavior_invoker->getEntity($event));
  }

  /**
   * Creates a request object for given path.
   *
   * @param string $uri
   *   A URI or path.
   *
   * @return \Symfony\Component\HttpFoundation\Request
   *   Created request object.
   */
  protected function createRequest(string $uri): Request {
    $request = Request::create($uri);
    $parameters = \Drupal::service('router.no_access_checks')->matchRequest($request);
    $request->attributes->add($parameters);
    unset($parameters['_route'], $parameters['_controller']);
    $request->attributes->set('_route_params', $parameters);
    return $request;
  }

}

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

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