Version 1
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Plugin / DisplayPageTest.php
1 <?php
2
3 namespace Drupal\Tests\views\Kernel\Plugin;
4
5 use Drupal\Core\Menu\MenuTreeParameters;
6 use Drupal\Core\Session\AnonymousUserSession;
7 use Drupal\views\Entity\View;
8 use Drupal\views\Views;
9 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpKernel\HttpKernelInterface;
12
13 /**
14  * Tests the page display plugin.
15  *
16  * @group views
17  * @see \Drupal\views\Plugin\display\Page
18  */
19 class DisplayPageTest extends ViewsKernelTestBase {
20
21   /**
22    * Views used by this test.
23    *
24    * @var array
25    */
26   public static $testViews = ['test_page_display', 'test_page_display_route', 'test_page_display_menu', 'test_display_more'];
27
28   /**
29    * Modules to enable.
30    *
31    * @var array
32    */
33   public static $modules = ['system', 'user', 'field'];
34
35   /**
36    * The router dumper to get all routes.
37    *
38    * @var \Drupal\Core\Routing\MatcherDumper
39    */
40   protected $routerDumper;
41
42   /**
43    * Checks the behavior of the page for access denied/not found behaviors.
44    */
45   public function testPageResponses() {
46     \Drupal::currentUser()->setAccount(new AnonymousUserSession());
47     $subrequest = Request::create('/test_page_display_403', 'GET');
48     $response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
49     $this->assertEqual($response->getStatusCode(), 403);
50
51     $subrequest = Request::create('/test_page_display_404', 'GET');
52     $response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
53     $this->assertEqual($response->getStatusCode(), 404);
54
55     $subrequest = Request::create('/test_page_display_200', 'GET');
56     $response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
57     $this->assertEqual($response->getStatusCode(), 200);
58
59     $subrequest = Request::create('/test_page_display_200', 'GET');
60     \Drupal::getContainer()->get('request_stack')->push($subrequest);
61
62     // Test accessing a disabled page for a view.
63     $view = Views::getView('test_page_display');
64     // Disable the view, rebuild menu, and request the page again.
65     $view->storage->disable()->save();
66     // Router rebuild would occur in a kernel terminate event so we need to
67     // simulate that here.
68     \Drupal::service('router.builder')->rebuild();
69
70     $response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
71     $this->assertEqual($response->getStatusCode(), 404);
72   }
73
74   /**
75    * Checks that the router items are properly registered
76    */
77   public function testPageRouterItems() {
78     $collection = \Drupal::service('views.route_subscriber')->routes();
79
80     // Check the controller defaults.
81     foreach ($collection as $id => $route) {
82       $this->assertEqual($route->getDefault('_controller'), 'Drupal\views\Routing\ViewPageController::handle');
83       $id_parts = explode('.', $id);
84       $this->assertEqual($route->getDefault('view_id'), $id_parts[1]);
85       $this->assertEqual($route->getDefault('display_id'), $id_parts[2]);
86     }
87
88     // Check the generated patterns and default values.
89     $route = $collection->get('view.test_page_display_route.page_1');
90     $this->assertEqual($route->getPath(), '/test_route_without_arguments');
91
92     $route = $collection->get('view.test_page_display_route.page_2');
93     $this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}');
94     $this->assertTrue($route->hasDefault('arg_0'), 'A default value is set for the optional argument id.');
95
96     $route = $collection->get('view.test_page_display_route.page_3');
97     $this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/suffix');
98     $this->assertFalse($route->hasDefault('arg_0'), 'No default value is set for the required argument id.');
99
100     $route = $collection->get('view.test_page_display_route.page_4');
101     $this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/suffix/{arg_1}');
102     $this->assertFalse($route->hasDefault('arg_0'), 'No default value is set for the required argument id.');
103     $this->assertTrue($route->hasDefault('arg_1'), 'A default value is set for the optional argument id_2.');
104
105     $route = $collection->get('view.test_page_display_route.page_5');
106     $this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/{arg_1}');
107     $this->assertTrue($route->hasDefault('arg_0'), 'A default value is set for the optional argument id.');
108     $this->assertTrue($route->hasDefault('arg_1'), 'A default value is set for the optional argument id_2.');
109
110     $route = $collection->get('view.test_page_display_route.page_6');
111     $this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/{arg_1}');
112     $this->assertFalse($route->hasDefault('arg_0'), 'No default value is set for the required argument id.');
113     $this->assertFalse($route->hasDefault('arg_1'), 'No default value is set for the required argument id_2.');
114   }
115
116   /**
117    * Tests the generated menu links of views.
118    */
119   public function testMenuLinks() {
120     \Drupal::service('plugin.manager.menu.link')->rebuild();
121     $tree = \Drupal::menuTree()->load('admin', new MenuTreeParameters());
122     $this->assertTrue(isset($tree['system.admin']->subtree['views_view:views.test_page_display_menu.page_4']));
123     $menu_link = $tree['system.admin']->subtree['views_view:views.test_page_display_menu.page_4']->link;
124     $this->assertEqual($menu_link->getTitle(), 'Test child (with parent)');
125     $this->assertEqual($menu_link->isExpanded(), TRUE);
126     $this->assertEqual($menu_link->getDescription(), 'Sample description.');
127   }
128
129   /**
130    * Tests the calculated dependencies for various views using Page displays.
131    */
132   public function testDependencies() {
133     $view = Views::getView('test_page_display');
134     $this->assertIdentical([], $view->getDependencies());
135
136     $view = Views::getView('test_page_display_route');
137     $expected = [
138       'content' => ['StaticTest'],
139       'module' => ['views_test_data'],
140     ];
141     $this->assertIdentical($expected, $view->getDependencies());
142
143     $view = Views::getView('test_page_display_menu');
144     $expected = [
145       'config' => [
146         'system.menu.admin',
147         'system.menu.tools',
148       ],
149     ];
150     $this->assertIdentical($expected, $view->getDependencies());
151   }
152
153   /**
154    * Tests the readmore functionality.
155    */
156   public function testReadMore() {
157     /** @var \Drupal\Core\Render\RendererInterface $renderer */
158     $renderer = $this->container->get('renderer');
159
160     $expected_more_text = 'custom more text';
161
162     $view = Views::getView('test_display_more');
163     $this->executeView($view);
164
165     $output = $view->preview();
166     $output = $renderer->renderRoot($output);
167
168     $this->setRawContent($output);
169     $result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
170     $this->assertEqual($result[0]->attributes()->href, \Drupal::url('view.test_display_more.page_1'), 'The right more link is shown.');
171     $this->assertEqual(trim($result[0][0]), $expected_more_text, 'The right link text is shown.');
172
173     // Test the renderMoreLink method directly. This could be directly unit
174     // tested.
175     $more_link = $view->display_handler->renderMoreLink();
176     $more_link = $renderer->renderRoot($more_link);
177     $this->setRawContent($more_link);
178     $result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
179     $this->assertEqual($result[0]->attributes()->href, \Drupal::url('view.test_display_more.page_1'), 'The right more link is shown.');
180     $this->assertEqual(trim($result[0][0]), $expected_more_text, 'The right link text is shown.');
181
182     // Test the useMoreText method directly. This could be directly unit
183     // tested.
184     $more_text = $view->display_handler->useMoreText();
185     $this->assertEqual($more_text, $expected_more_text, 'The right more text is chosen.');
186
187     $view = Views::getView('test_display_more');
188     $view->setDisplay();
189     $view->display_handler->setOption('use_more', 0);
190     $this->executeView($view);
191     $output = $view->preview();
192     $output = $renderer->renderRoot($output);
193     $this->setRawContent($output);
194     $result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
195     $this->assertTrue(empty($result), 'The more link is not shown.');
196
197     $view = Views::getView('test_display_more');
198     $view->setDisplay();
199     $view->display_handler->setOption('use_more', 0);
200     $view->display_handler->setOption('use_more_always', 0);
201     $view->display_handler->setOption('pager', [
202       'type' => 'some',
203       'options' => [
204         'items_per_page' => 1,
205         'offset' => 0,
206       ],
207     ]);
208     $this->executeView($view);
209     $output = $view->preview();
210     $output = $renderer->renderRoot($output);
211     $this->setRawContent($output);
212     $result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
213     $this->assertTrue(empty($result), 'The more link is not shown when view has more records.');
214
215     // Test the default value of use_more_always.
216     $view = View::create()->getExecutable();
217     $this->assertTrue($view->getDisplay()->getOption('use_more_always'), 'Always display the more link by default.');
218   }
219
220 }