class ControllerResolverTest

Same name and namespace in other branches
  1. 9 core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php \Drupal\Tests\Core\Controller\ControllerResolverTest
  2. 8.9.x core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php \Drupal\Tests\Core\Controller\ControllerResolverTest
  3. 10 core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php \Drupal\Tests\Core\Controller\ControllerResolverTest

@coversDefaultClass \Drupal\Core\Controller\ControllerResolver
@group Controller

Hierarchy

Expanded class hierarchy of ControllerResolverTest

File

core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php, line 22

Namespace

Drupal\Tests\Core\Controller
View source
class ControllerResolverTest extends UnitTestCase {
  
  /**
   * The tested controller resolver.
   *
   * @var \Drupal\Core\Controller\ControllerResolver
   */
  public $controllerResolver;
  
  /**
   * The container.
   *
   * @var \Symfony\Component\DependencyInjection\ContainerBuilder
   */
  protected $container;
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->container = new ContainerBuilder();
    $class_resolver = new ClassResolver($this->container);
    $callable_resolver = new CallableResolver($class_resolver);
    $this->controllerResolver = new ControllerResolver($callable_resolver);
  }
  
  /**
   * Tests createController().
   *
   * @dataProvider providerTestCreateController
   */
  public function testCreateController($controller, $class, $output) : void {
    $this->container
      ->set('some_service', new MockController());
    $result = $this->controllerResolver
      ->getControllerFromDefinition($controller);
    $this->assertCallableController($result, $class, $output);
  }
  
  /**
   * Provides test data for testCreateController().
   */
  public static function providerTestCreateController() {
    return [
      // Tests class::method.
[
        'Drupal\\Tests\\Core\\Controller\\MockController::getResult',
        'Drupal\\Tests\\Core\\Controller\\MockController',
        'This is a regular controller.',
      ],
      // Tests service:method.
[
        'some_service:getResult',
        'Drupal\\Tests\\Core\\Controller\\MockController',
        'This is a regular controller.',
      ],
      // Tests a class with injection.
[
        'Drupal\\Tests\\Core\\Controller\\MockContainerInjection::getResult',
        'Drupal\\Tests\\Core\\Controller\\MockContainerInjection',
        'This used injection.',
      ],
    ];
  }
  
  /**
   * Tests createController() with a non-existent class.
   */
  public function testCreateControllerNonExistentClass() : void {
    $this->expectException(\InvalidArgumentException::class);
    $this->controllerResolver
      ->getControllerFromDefinition('Class::method');
  }
  
  /**
   * Tests createController() with an invalid name.
   */
  public function testCreateControllerInvalidName() : void {
    $this->expectException(\LogicException::class);
    $this->controllerResolver
      ->getControllerFromDefinition('ClassWithoutMethod');
  }
  
  /**
   * Tests getController().
   *
   * @dataProvider providerTestGetController
   */
  public function testGetController($attributes, $class, $output = NULL) : void {
    $request = new Request([], [], $attributes);
    $result = $this->controllerResolver
      ->getController($request);
    if ($class) {
      $this->assertCallableController($result, $class, $output);
    }
    else {
      $this->assertFalse($result);
    }
  }
  
  /**
   * Provides test data for testGetController().
   */
  public static function providerTestGetController() {
    return [
      // Tests passing a controller via the request.
[
        [
          '_controller' => MockContainerInjection::class . '::getResult',
        ],
        MockContainerInjection::class,
        'This used injection.',
      ],
      // Tests a request with no controller specified.
[
        [],
        FALSE,
      ],
    ];
  }
  
  /**
   * Tests getControllerFromDefinition().
   *
   * @dataProvider providerTestGetControllerFromDefinition
   */
  public function testGetControllerFromDefinition($definition, $output) : void {
    $this->container
      ->set('invoke_service', new MockInvokeController());
    $controller = $this->controllerResolver
      ->getControllerFromDefinition($definition);
    $this->assertCallableController($controller, NULL, $output);
  }
  
  /**
   * Provides test data for testGetControllerFromDefinition().
   */
  public static function providerTestGetControllerFromDefinition() {
    return [
      // Tests a method on an object.
[
        [
          new MockController(),
          'getResult',
        ],
        'This is a regular controller.',
      ],
      // Tests a function.
[
        'phpversion',
        phpversion(),
      ],
      // Tests an object using __invoke().
[
        new MockInvokeController(),
        'This used __invoke().',
      ],
      // Tests a class using __invoke().
[
        'Drupal\\Tests\\Core\\Controller\\MockInvokeController',
        'This used __invoke().',
      ],
      // Tests a service from the container using __invoke().
[
        'invoke_service',
        'This used __invoke().',
      ],
    ];
  }
  
  /**
   * Tests getControllerFromDefinition() without a callable.
   */
  public function testGetControllerFromDefinitionNotCallable() : void {
    $this->expectException(\InvalidArgumentException::class);
    $this->controllerResolver
      ->getControllerFromDefinition('Drupal\\Tests\\Core\\Controller\\MockController::bananas');
  }
  
  /**
   * Asserts that the controller is callable and produces the correct output.
   *
   * @param callable $controller
   *   A callable controller.
   * @param string|null $class
   *   Either the name of the class the controller represents, or NULL if it is
   *   not an object.
   * @param string|null $output
   *   The output expected for this controller.
   *
   * @internal
   */
  protected function assertCallableController(callable $controller, ?string $class, ?string $output) : void {
    if ($class) {
      $this->assertIsObject($controller[0]);
      $this->assertInstanceOf($class, $controller[0]);
    }
    $this->assertIsCallable($controller);
    $this->assertSame($output, call_user_func($controller));
  }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
ControllerResolverTest::$container protected property The container.
ControllerResolverTest::$controllerResolver public property The tested controller resolver.
ControllerResolverTest::assertCallableController protected function Asserts that the controller is callable and produces the correct output.
ControllerResolverTest::providerTestCreateController public static function Provides test data for testCreateController().
ControllerResolverTest::providerTestGetController public static function Provides test data for testGetController().
ControllerResolverTest::providerTestGetControllerFromDefinition public static function Provides test data for testGetControllerFromDefinition().
ControllerResolverTest::setUp protected function Overrides UnitTestCase::setUp
ControllerResolverTest::testCreateController public function Tests createController().
ControllerResolverTest::testCreateControllerInvalidName public function Tests createController() with an invalid name.
ControllerResolverTest::testCreateControllerNonExistentClass public function Tests createController() with a non-existent class.
ControllerResolverTest::testGetController public function Tests getController().
ControllerResolverTest::testGetControllerFromDefinition public function Tests getControllerFromDefinition().
ControllerResolverTest::testGetControllerFromDefinitionNotCallable public function Tests getControllerFromDefinition() without a callable.
ExpectDeprecationTrait::expectDeprecation public function Adds an expected deprecation.
ExpectDeprecationTrait::setUpErrorHandler public function Sets up the test error handler.
ExpectDeprecationTrait::tearDownErrorHandler public function Tears down the test error handler.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers.
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
UnitTestCase::$root protected property The app root.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed array.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::setDebugDumpHandler public static function Registers the dumper CLI handler when the DebugDump extension is enabled.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.