Pull merge.
[yaffs-website] / web / core / modules / views / tests / src / Unit / Routing / ViewPageControllerTest.php
1 <?php
2
3 namespace Drupal\Tests\views\Unit\Routing;
4
5 use Drupal\Core\Routing\RouteMatch;
6 use Drupal\Tests\UnitTestCase;
7 use Drupal\views\Routing\ViewPageController;
8 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
9 use Symfony\Component\HttpFoundation\ParameterBag;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\Routing\Route;
12
13 /**
14  * @coversDefaultClass \Drupal\views\Routing\ViewPageController
15  * @group views
16  */
17 class ViewPageControllerTest extends UnitTestCase {
18
19   /**
20    * The page controller of views.
21    *
22    * @var \Drupal\views\Routing\ViewPageController
23    */
24   public $pageController;
25
26   /**
27    * A render array expected for every page controller render array result.
28    *
29    * @var array
30    */
31   protected $defaultRenderArray = [
32     '#cache_properties' => ['#view_id', '#view_display_show_admin_links', '#view_display_plugin_id'],
33     '#view_id' => 'test_page_view',
34     '#view_display_plugin_id' => NULL,
35     '#view_display_show_admin_links' => NULL,
36   ];
37
38   protected function setUp() {
39     $this->pageController = new ViewPageController();
40   }
41
42   /**
43    * Tests the page controller.
44    */
45   public function testPageController() {
46     $build = [
47       '#type' => 'view',
48       '#name' => 'test_page_view',
49       '#display_id' => 'default',
50       '#embed' => FALSE,
51       '#arguments' => [],
52       '#cache' => [
53         'keys' => ['view', 'test_page_view', 'display', 'default'],
54       ],
55     ] + $this->defaultRenderArray;
56
57     $request = new Request();
58     $request->attributes->set('view_id', 'test_page_view');
59     $request->attributes->set('display_id', 'default');
60     $options = [
61       '_view_display_plugin_class' => '\Drupal\views\Plugin\views\display\Page',
62     ];
63     $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/test', ['view_id' => 'test_page_view', 'display_id' => 'default'], [], $options));
64     $route_match = RouteMatch::createFromRequest($request);
65
66     $output = $this->pageController->handle($route_match->getParameter('view_id'), $route_match->getParameter('display_id'), $route_match);
67     $this->assertInternalType('array', $output);
68     $this->assertEquals($build, $output);
69   }
70
71   /**
72    * Tests the page controller with arguments on a non overridden page view.
73    */
74   public function testHandleWithArgumentsWithoutOverridden() {
75     $request = new Request();
76     $request->attributes->set('view_id', 'test_page_view');
77     $request->attributes->set('display_id', 'page_1');
78     // Add the argument to the request.
79     $request->attributes->set('arg_0', 'test-argument');
80     $options = [
81       '_view_argument_map' => ['arg_0' => 'arg_0'],
82       '_view_display_plugin_class' => '\Drupal\views\Plugin\views\display\Page',
83     ];
84     $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/test/{arg_0}', ['view_id' => 'test_page_view', 'display_id' => 'default'], [], $options));
85     $route_match = RouteMatch::createFromRequest($request);
86
87     $result = $this->pageController->handle($route_match->getParameter('view_id'), $route_match->getParameter('display_id'), $route_match);
88
89     $build = [
90       '#type' => 'view',
91       '#name' => 'test_page_view',
92       '#display_id' => 'page_1',
93       '#embed' => FALSE,
94       '#arguments' => ['test-argument'],
95       '#cache' => [
96         'keys' => ['view', 'test_page_view', 'display', 'page_1', 'args', 'test-argument'],
97       ],
98     ] + $this->defaultRenderArray;
99
100     $this->assertEquals($build, $result);
101   }
102
103   /**
104    * Tests the page controller with arguments of a overridden page view.
105    *
106    * Note: This test does not care about upcasting for now.
107    */
108   public function testHandleWithArgumentsOnOverriddenRoute() {
109     $request = new Request();
110     $request->attributes->set('view_id', 'test_page_view');
111     $request->attributes->set('display_id', 'page_1');
112     // Add the argument to the request.
113     $request->attributes->set('parameter', 'test-argument');
114     $options = [
115       '_view_argument_map' => [
116         'arg_0' => 'parameter',
117       ],
118       '_view_display_plugin_class' => '\Drupal\views\Plugin\views\display\Page',
119     ];
120     $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/test/{parameter}', ['view_id' => 'test_page_view', 'display_id' => 'default'], [], $options));
121     $route_match = RouteMatch::createFromRequest($request);
122
123     $result = $this->pageController->handle($route_match->getParameter('view_id'), $route_match->getParameter('display_id'), $route_match);
124
125     $build = [
126       '#type' => 'view',
127       '#name' => 'test_page_view',
128       '#display_id' => 'page_1',
129       '#embed' => FALSE,
130       '#arguments' => ['test-argument'],
131       '#cache' => [
132         'keys' => ['view', 'test_page_view', 'display', 'page_1', 'args', 'test-argument'],
133       ],
134       ] + $this->defaultRenderArray;
135
136     $this->assertEquals($build, $result);
137   }
138
139   /**
140    * Tests the page controller with arguments of a overridden page view.
141    *
142    * This test care about upcasted values and ensures that the raw variables
143    * are pulled in.
144    */
145   public function testHandleWithArgumentsOnOverriddenRouteWithUpcasting() {
146     $request = new Request();
147     $request->attributes->set('view_id', 'test_page_view');
148     $request->attributes->set('display_id', 'page_1');
149     // Add the argument to the request.
150     $request->attributes->set('test_entity', $this->getMock('Drupal\Core\Entity\EntityInterface'));
151     $raw_variables = new ParameterBag(['test_entity' => 'example_id']);
152     $request->attributes->set('_raw_variables', $raw_variables);
153     $options = [
154       '_view_argument_map' => [
155         'arg_0' => 'test_entity',
156       ],
157       '_view_display_plugin_class' => '\Drupal\views\Plugin\views\display\Page',
158     ];
159     $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/test/{test_entity}', ['view_id' => 'test_page_view', 'display_id' => 'default'], [], $options));
160     $route_match = RouteMatch::createFromRequest($request);
161
162     $result = $this->pageController->handle($route_match->getParameter('view_id'), $route_match->getParameter('display_id'), $route_match);
163
164     $build = [
165       '#type' => 'view',
166       '#name' => 'test_page_view',
167       '#display_id' => 'page_1',
168       '#embed' => FALSE,
169       '#arguments' => ['example_id'],
170       '#cache' => [
171         'keys' => ['view', 'test_page_view', 'display', 'page_1', 'args', 'example_id'],
172       ],
173       ] + $this->defaultRenderArray;
174
175     $this->assertEquals($build, $result);
176   }
177
178 }
179
180 // @todo https://www.drupal.org/node/2571679 replace
181 //   views_add_contextual_links().
182 namespace Drupal\views\Routing;
183
184 if (!function_exists('views_add_contextual_links')) {
185
186   function views_add_contextual_links() {
187   }
188
189 }