function AttributeRouteDiscoveryTest::testOnRouteBuild

Same name and namespace in other branches
  1. 11.x core/tests/Drupal/Tests/Core/Routing/AttributeRouteDiscoveryTest.php \Drupal\Tests\Core\Routing\AttributeRouteDiscoveryTest::testOnRouteBuild()

@legacy-covers ::onRouteBuild

File

core/tests/Drupal/Tests/Core/Routing/AttributeRouteDiscoveryTest.php, line 72

Class

AttributeRouteDiscoveryTest
Tests \Drupal\Core\Routing\AttributeRouteDiscovery.

Namespace

Drupal\Tests\Core\Routing

Code

public function testOnRouteBuild() : void {
  $this->assertNotEmpty($this->routeCollection);
  $route1 = $this->routeCollection
    ->get('router_test.method_attribute');
  $this->assertNotNull($route1);
  $this->assertSame('/test_method_attribute', $route1->getPath());
  $this->assertSame(TestAttributes::class . '::attributeMethod', $route1->getDefault('_controller'));
  $this->assertSame("TRUE", $route1->getRequirement('_access'));
  $this->assertSame($route1, $this->routeCollection
    ->get('router_test.alias_test'));
  $route2 = $this->routeCollection
    ->get('router_test.class_invoke');
  $this->assertNotNull($route2);
  $this->assertSame('/test_class_attribute', $route2->getPath());
  $this->assertSame(TestClassAttribute::class, $route2->getDefault('_controller'));
  $this->assertSame("TRUE", $route2->getRequirement('_access'));
  $this->assertSame($route2, $this->routeCollection
    ->get(TestClassAttribute::class . '::__invoke'));
  $route3 = $this->routeCollection
    ->get('router_test.method_attribute_other');
  $this->assertNotNull($route3);
  $this->assertSame('/test_method_attribute-other-path', $route3->getPath());
  $this->assertSame(TestAttributes::class . '::attributeMethod', $route3->getDefault('_controller'));
  $this->assertSame("TRUE", $route3->getRequirement('_access'));
  $formRoute = $this->routeCollection
    ->get('router_test.form_route');
  $this->assertNotNull($formRoute);
  $this->assertSame('/test-form-route', $formRoute->getPath());
  $this->assertSame(TestRouteAttributeForm::class, $formRoute->getDefault('_form'));
  $this->assertSame('router_test.form_route', $this->routeCollection
    ->getAlias(TestRouteAttributeForm::class)
    ->getId());
  $this->assertNull($this->routeCollection
    ->get('router_test.invalid_controller_route'));
  // Since Route attributes on form class methods are not supported, add a
  // virtual form class that has a Route attribute on a method to confirm
  // there that there is an AssertionError thrown.
  vfsStream::setup('router_test_invalid');
  vfsStream::create([
    'src' => [
      'Form' => [
        'TestRouteInvalidAttributeForm.php' => '',
      ],
    ],
  ]);
  file_put_contents('vfs://router_test_invalid/src/Form/TestRouteInvalidAttributeForm.php', <<<'EOF'
  <?php
  
  declare(strict_types=1);
  
  namespace Drupal\router_test_invalid\Form;
  
  use Drupal\Core\Form\FormBase;
  use Drupal\Core\Form\FormStateInterface;
  use Symfony\Component\Routing\Attribute\Route;
  
  class TestRouteInvalidAttributeForm extends FormBase {
  
    public function getFormId(): string {
      return 'invalid_router_test';
    }
  
    public function buildForm(array $form, FormStateInterface $form_state): array {
      return $form;
    }
  
    public function submitForm(array &$form, FormStateInterface $form_state): void {
    }
  
    #[Route(
      path: '/invalid-form-method-route',
      name: 'router_test.invalid_form_method_route',
    )]
    public function invalidFormMethodRoute(): array {
      return [];
    }
  
  }
  
  EOF);
  $event = new RouteBuildEvent(new RouteCollection());
  $namespaces = new \ArrayObject([
    'Drupal\\router_test_invalid' => vfsStream::url('router_test_invalid/src'),
  ]);
  $additionalClassLoader = new ClassLoader();
  $additionalClassLoader->addPsr4("Drupal\\router_test_invalid\\", vfsStream::url('router_test_invalid/src'));
  $additionalClassLoader->register(TRUE);
  $discovery = new AttributeRouteDiscovery($namespaces);
  $this->expectException(\AssertionError::class);
  $this->expectExceptionMessage('Route attributes can not target methods on class Drupal\\router_test_invalid\\Form\\TestRouteInvalidAttributeForm. Use the attribute on the form class itself.');
  $discovery->onRouteBuild($event);
}

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