function RouteSubscriberTest::testOnAlterRoutes

Same name in other branches
  1. 9 core/modules/views/tests/src/Unit/EventSubscriber/RouteSubscriberTest.php \Drupal\Tests\views\Unit\EventSubscriber\RouteSubscriberTest::testOnAlterRoutes()
  2. 8.9.x core/modules/views/tests/src/Unit/EventSubscriber/RouteSubscriberTest.php \Drupal\Tests\views\Unit\EventSubscriber\RouteSubscriberTest::testOnAlterRoutes()
  3. 10 core/modules/views/tests/src/Unit/EventSubscriber/RouteSubscriberTest.php \Drupal\Tests\views\Unit\EventSubscriber\RouteSubscriberTest::testOnAlterRoutes()

Tests the onAlterRoutes method.

See also

\Drupal\views\EventSubscriber\RouteSubscriber::onAlterRoutes()

File

core/modules/views/tests/src/Unit/EventSubscriber/RouteSubscriberTest.php, line 92

Class

RouteSubscriberTest
@coversDefaultClass \Drupal\views\EventSubscriber\RouteSubscriber @group views

Namespace

Drupal\Tests\views\Unit\EventSubscriber

Code

public function testOnAlterRoutes() : void {
    $collection = new RouteCollection();
    // The first route will be overridden later.
    $collection->add('test_route', new Route('test_route', [
        '_controller' => 'Drupal\\Tests\\Core\\Controller\\TestController',
    ]));
    $route_2 = new Route('test_route/example', [
        '_controller' => 'Drupal\\Tests\\Core\\Controller\\TestController',
    ]);
    $collection->add('test_route_2', $route_2);
    $route_event = new RouteBuildEvent($collection);
    [
        $display_1,
        $display_2,
    ] = $this->setupMocks();
    // The page_1 display overrides an existing route, so the dynamicRoutes
    // should only call the second display.
    $display_1->expects($this->once())
        ->method('collectRoutes')
        ->willReturnCallback(function () use ($collection) {
        $collection->add('views.test_id.page_1', new Route('test_route', [
            '_controller' => 'Drupal\\views\\Routing\\ViewPageController',
        ]));
        return [
            'test_id.page_1' => 'views.test_id.page_1',
        ];
    });
    $display_1->expects($this->once())
        ->method('alterRoutes')
        ->willReturn([
        'test_id.page_1' => 'test_route',
    ]);
    $display_2->expects($this->once())
        ->method('collectRoutes')
        ->willReturnCallback(function () use ($collection) {
        $collection->add('views.test_id.page_2', new Route('test_route', [
            '_controller' => 'Drupal\\views\\Routing\\ViewPageController',
        ]));
        return [
            'test_id.page_2' => 'views.test_id.page_2',
        ];
    });
    $display_2->expects($this->once())
        ->method('alterRoutes')
        ->willReturn([]);
    // Ensure that even both the collectRoutes() and alterRoutes() methods
    // are called on the displays, we ensure that the route first defined by
    // views is dropped.
    $this->routeSubscriber
        ->routes();
    $this->assertNull($this->routeSubscriber
        ->onAlterRoutes($route_event));
    $this->state
        ->expects($this->once())
        ->method('set')
        ->with('views.view_route_names', [
        'test_id.page_1' => 'test_route',
        'test_id.page_2' => 'views.test_id.page_2',
    ]);
    $collection = $route_event->getRouteCollection();
    $this->assertEquals([
        'test_route',
        'test_route_2',
        'views.test_id.page_2',
    ], array_keys($collection->all()));
    $this->routeSubscriber
        ->routeRebuildFinished();
}

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