1<?php
2
3namespace Drupal\KernelTests\Core\Entity;
4
5use Drupal\entity_test\Entity\EntityTestAdminRoutes;
6use Drupal\entity_test\Entity\EntityTestMul;
7use Drupal\KernelTests\KernelTestBase;
8use Drupal\Tests\user\Traits\UserCreationTrait;
9use Drupal\user\Entity\Role;
10use Drupal\user\RoleInterface;
11use Symfony\Component\HttpFoundation\Request;
12use Symfony\Component\HttpKernel\HttpKernelInterface;
13
14/**
15 * Tests route providers for entity types.
16 *
17 * @group Entity
18 */
19class RouteProviderTest extends KernelTestBase {
20
21  use UserCreationTrait;
22
23  /**
24   * {@inheritdoc}
25   */
26  protected static $modules = ['entity_test', 'user', 'system'];
27
28  /**
29   * {@inheritdoc}
30   */
31  protected function setUp(): void {
32    parent::setUp();
33
34    $this->setUpCurrentUser(['uid' => 1]);
35
36    $this->installEntitySchema('entity_test_mul');
37    $this->installEntitySchema('entity_test_admin_routes');
38
39    /** @var \Drupal\user\RoleInterface $role */
40    $role = Role::create([
41      'id' => RoleInterface::ANONYMOUS_ID,
42    ]);
43    $role
44      ->grantPermission('administer entity_test content')
45      ->grantPermission('view test entity');
46    $role->save();
47  }
48
49  protected function httpKernelHandle($url) {
50    $request = Request::create($url);
51    /** @var \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel */
52    $http_kernel = \Drupal::service('http_kernel');
53    return $http_kernel->handle($request, HttpKernelInterface::SUB_REQUEST)->getContent();
54  }
55
56  /**
57   * @covers \Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider::getRoutes
58   */
59  public function testHtmlRoutes() {
60    /** @var \Drupal\Core\Routing\RouteProviderInterface $route_provider */
61    $route_provider = \Drupal::service('router.route_provider');
62
63    $route = $route_provider->getRouteByName('entity.entity_test_mul.canonical');
64    $this->assertEquals('entity_test_mul.full', $route->getDefault('_entity_view'));
65    $this->assertEquals('\Drupal\Core\Entity\Controller\EntityController::title', $route->getDefault('_title_callback'));
66    $this->assertEquals('entity_test_mul.view', $route->getRequirement('_entity_access'));
67    $this->assertFalse($route->hasOption('_admin_route'));
68
69    $route = $route_provider->getRouteByName('entity.entity_test_mul.edit_form');
70    $this->assertEquals('entity_test_mul.default', $route->getDefault('_entity_form'));
71    $this->assertEquals('\Drupal\Core\Entity\Controller\EntityController::editTitle', $route->getDefault('_title_callback'));
72    $this->assertEquals('entity_test_mul.update', $route->getRequirement('_entity_access'));
73    $this->assertFalse($route->hasOption('_admin_route'));
74
75    $route = $route_provider->getRouteByName('entity.entity_test_mul.delete_form');
76    $this->assertEquals('entity_test_mul.delete', $route->getDefault('_entity_form'));
77    $this->assertEquals('\Drupal\Core\Entity\Controller\EntityController::deleteTitle', $route->getDefault('_title_callback'));
78    $this->assertEquals('entity_test_mul.delete', $route->getRequirement('_entity_access'));
79    $this->assertFalse($route->hasOption('_admin_route'));
80
81    $entity = EntityTestMul::create([
82      'name' => 'Test title',
83    ]);
84    $entity->save();
85
86    $this->setRawContent($this->httpKernelHandle($entity->toUrl()->toString()));
87    $this->assertTitle('Test title | ');
88
89    $this->setRawContent($this->httpKernelHandle($entity->toUrl('edit-form')->toString()));
90    $this->assertTitle('Edit Test title | ');
91
92    $this->setRawContent($this->httpKernelHandle($entity->toUrl('delete-form')->toString()));
93    $this->assertTitle('Are you sure you want to delete the test entity - data table Test title? | ');
94  }
95
96  /**
97   * @covers \Drupal\Core\Entity\Routing\AdminHtmlRouteProvider::getEditFormRoute
98   * @covers \Drupal\Core\Entity\Routing\AdminHtmlRouteProvider::getDeleteFormRoute
99   */
100  public function testAdminHtmlRoutes() {
101    /** @var \Drupal\Core\Routing\RouteProviderInterface $route_provider */
102    $route_provider = \Drupal::service('router.route_provider');
103
104    $route = $route_provider->getRouteByName('entity.entity_test_admin_routes.canonical');
105    $this->assertEquals('entity_test_admin_routes.full', $route->getDefault('_entity_view'));
106    $this->assertEquals('\Drupal\Core\Entity\Controller\EntityController::title', $route->getDefault('_title_callback'));
107    $this->assertEquals('entity_test_admin_routes.view', $route->getRequirement('_entity_access'));
108    $this->assertFalse($route->hasOption('_admin_route'));
109
110    $route = $route_provider->getRouteByName('entity.entity_test_admin_routes.edit_form');
111    $this->assertEquals('entity_test_admin_routes.default', $route->getDefault('_entity_form'));
112    $this->assertEquals('\Drupal\Core\Entity\Controller\EntityController::editTitle', $route->getDefault('_title_callback'));
113    $this->assertEquals('entity_test_admin_routes.update', $route->getRequirement('_entity_access'));
114    $this->assertTrue($route->hasOption('_admin_route'));
115    $this->assertTrue($route->getOption('_admin_route'));
116
117    $route = $route_provider->getRouteByName('entity.entity_test_admin_routes.delete_form');
118    $this->assertEquals('entity_test_admin_routes.delete', $route->getDefault('_entity_form'));
119    $this->assertEquals('\Drupal\Core\Entity\Controller\EntityController::deleteTitle', $route->getDefault('_title_callback'));
120    $this->assertEquals('entity_test_admin_routes.delete', $route->getRequirement('_entity_access'));
121    $this->assertTrue($route->hasOption('_admin_route'));
122    $this->assertTrue($route->getOption('_admin_route'));
123
124    $entity = EntityTestAdminRoutes::create([
125      'name' => 'Test title',
126    ]);
127    $entity->save();
128
129    $this->setRawContent($this->httpKernelHandle($entity->toUrl()->toString()));
130    $this->assertTitle('Test title | ');
131
132    $this->setRawContent($this->httpKernelHandle($entity->toUrl('edit-form')->toString()));
133    $this->assertTitle('Edit Test title | ');
134
135    $this->setRawContent($this->httpKernelHandle($entity->toUrl('delete-form')->toString()));
136    $this->assertTitle('Are you sure you want to delete the test entity - admin routes Test title? | ');
137  }
138
139}
140