83d0505f15c765a2dbf3d4af011c2d2a9cb7ca81
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Routing / RequestFormatRouteFilterTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Routing;
4
5 use Drupal\Core\DependencyInjection\ContainerBuilder;
6 use Drupal\Core\GeneratedUrl;
7 use Drupal\Core\Routing\RequestFormatRouteFilter;
8 use Drupal\Core\Utility\UnroutedUrlAssemblerInterface;
9 use Drupal\Tests\UnitTestCase;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException;
12 use Symfony\Component\Routing\Route;
13 use Symfony\Component\Routing\RouteCollection;
14
15 /**
16  * @coversDefaultClass \Drupal\Core\Routing\RequestFormatRouteFilter
17  * @group Routing
18  */
19 class RequestFormatRouteFilterTest extends UnitTestCase {
20
21   /**
22    * @covers ::filter
23    * @dataProvider filterProvider
24    */
25   public function testFilter(RouteCollection $collection, $request_format, array $expected_filtered_collection) {
26     $route_filter = new RequestFormatRouteFilter();
27
28     $request = new Request();
29     $request->setRequestFormat($request_format);
30     $collection = $route_filter->filter($collection, $request);
31
32     $this->assertCount(count($expected_filtered_collection), $collection);
33     $this->assertSame($expected_filtered_collection, array_keys($collection->all()));
34   }
35
36   public function filterProvider() {
37     $route_without_format = new Route('/test');
38     $route_with_format = $route = new Route('/test');
39     $route_with_format->setRequirement('_format', 'json');
40     $route_with_multiple_formats = $route = new Route('/test');
41     $route_with_multiple_formats->setRequirement('_format', 'json|xml');
42
43     $collection = new RouteCollection();
44     $collection->add('test_0', $route_without_format);
45     $collection->add('test_1', $route_with_format);
46     $collection->add('test_2', $route_with_multiple_formats);
47
48     $sole_route_match_single_format = new RouteCollection();
49     $sole_route_match_single_format->add('sole_route_single_format', $route_with_format);
50
51     return [
52       'nothing requested' => [clone $collection, '', ['test_0']],
53       'xml requested' => [clone $collection, 'xml', ['test_2', 'test_0']],
54       'json requested' => [clone $collection, 'json', ['test_1', 'test_2', 'test_0']],
55       'html format requested' => [clone $collection, 'html', ['test_0']],
56       'no format requested, defaults to html' => [clone $collection, NULL, ['test_0']],
57       'no format requested, single route match with single format, defaults to that format' => [clone $sole_route_match_single_format, NULL, ['sole_route_single_format']],
58     ];
59   }
60
61   /**
62    * @covers ::filter
63    */
64   public function testNoRouteFound() {
65     $url = $this->prophesize(GeneratedUrl::class);
66     $url_assembler = $this->prophesize(UnroutedUrlAssemblerInterface::class);
67     $url_assembler->assemble('http://localhost/test?_format=xml', ['query' => ['_format' => 'json'], 'external' => TRUE], TRUE)
68       ->willReturn($url);
69     $container = new ContainerBuilder();
70     $container->set('unrouted_url_assembler', $url_assembler->reveal());
71     \Drupal::setContainer($container);
72
73     $collection = new RouteCollection();
74     $route_with_format = $route = new Route('/test');
75     $route_with_format->setRequirement('_format', 'json');
76     $collection->add('test_0', $route_with_format);
77     $collection->add('test_1', clone $route_with_format);
78
79     $request = Request::create('test?_format=xml', 'GET');
80     $request->setRequestFormat('xml');
81     $route_filter = new RequestFormatRouteFilter();
82     $this->setExpectedException(NotAcceptableHttpException::class, 'No route found for the specified format xml.');
83     $route_filter->filter($collection, $request);
84   }
85
86   /**
87    * @covers ::filter
88    */
89   public function testNoRouteFoundWhenNoRequestFormatAndSingleRouteWithMultipleFormats() {
90     $this->setExpectedException(NotAcceptableHttpException::class, 'No route found for the specified format html.');
91
92     $url = $this->prophesize(GeneratedUrl::class);
93     $url_assembler = $this->prophesize(UnroutedUrlAssemblerInterface::class);
94     $url_assembler->assemble('http://localhost/test', ['query' => ['_format' => 'json'], 'external' => TRUE], TRUE)
95       ->willReturn($url);
96     $url_assembler->assemble('http://localhost/test', ['query' => ['_format' => 'xml'], 'external' => TRUE], TRUE)
97       ->willReturn($url);
98     $container = new ContainerBuilder();
99     $container->set('unrouted_url_assembler', $url_assembler->reveal());
100     \Drupal::setContainer($container);
101
102     $collection = new RouteCollection();
103     $route_with_format = $route = new Route('/test');
104     $route_with_format->setRequirement('_format', 'json|xml');
105     $collection->add('sole_route_multiple_formats', $route_with_format);
106
107     $request = Request::create('test', 'GET');
108     $route_filter = new RequestFormatRouteFilter();
109     $route_filter->filter($collection, $request);
110   }
111
112 }