3 namespace Drupal\Tests\Core\Routing;
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;
16 * @coversDefaultClass \Drupal\Core\Routing\RequestFormatRouteFilter
19 class RequestFormatRouteFilterTest extends UnitTestCase {
23 * @dataProvider filterProvider
25 public function testFilter(RouteCollection $collection, $request_format, array $expected_filtered_collection) {
26 $route_filter = new RequestFormatRouteFilter();
28 $request = new Request();
29 $request->setRequestFormat($request_format);
30 $collection = $route_filter->filter($collection, $request);
32 $this->assertCount(count($expected_filtered_collection), $collection);
33 $this->assertSame($expected_filtered_collection, array_keys($collection->all()));
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');
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);
48 $sole_route_match_single_format = new RouteCollection();
49 $sole_route_match_single_format->add('sole_route_single_format', $route_with_format);
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']],
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)
69 $container = new ContainerBuilder();
70 $container->set('unrouted_url_assembler', $url_assembler->reveal());
71 \Drupal::setContainer($container);
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);
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);
89 public function testNoRouteFoundWhenNoRequestFormatAndSingleRouteWithMultipleFormats() {
90 $this->setExpectedException(NotAcceptableHttpException::class, 'No route found for the specified format html.');
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)
96 $url_assembler->assemble('http://localhost/test', ['query' => ['_format' => 'xml'], 'external' => TRUE], TRUE)
98 $container = new ContainerBuilder();
99 $container->set('unrouted_url_assembler', $url_assembler->reveal());
100 \Drupal::setContainer($container);
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);
107 $request = Request::create('test', 'GET');
108 $route_filter = new RequestFormatRouteFilter();
109 $route_filter->filter($collection, $request);