Newer
Older
Daniel Wehner
committed
<?php
Alex Pott
committed
namespace Drupal\Tests\views\Kernel\Plugin;
Daniel Wehner
committed
use Drupal\Core\Menu\MenuTreeParameters;
use Drupal\Core\Session\AnonymousUserSession;
use Drupal\views\Entity\View;
catch
committed
use Drupal\views\Views;
Alex Pott
committed
use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
Alex Pott
committed
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
Daniel Wehner
committed
/**
* Tests the page display plugin.
*
* @group views
Alex Pott
committed
* @see \Drupal\views\Plugin\display\Page
Daniel Wehner
committed
*/
Alex Pott
committed
class DisplayPageTest extends ViewsKernelTestBase {
Daniel Wehner
committed
catch
committed
/**
* Views used by this test.
*
* @var array
*/
public static $testViews = ['test_page_display', 'test_page_display_route', 'test_page_display_menu', 'test_display_more'];
Alex Pott
committed
/**
* Modules to enable.
*
* @var array
*/
Lee Rowlands
committed
public static $modules = ['system', 'user', 'field', 'views_test_data'];
Alex Pott
committed
/**
* The router dumper to get all routes.
*
* @var \Drupal\Core\Routing\MatcherDumper
*/
protected $routerDumper;
catch
committed
Daniel Wehner
committed
/**
* Checks the behavior of the page for access denied/not found behaviors.
Daniel Wehner
committed
*/
public function testPageResponses() {
\Drupal::currentUser()->setAccount(new AnonymousUserSession());
Alex Pott
committed
$subrequest = Request::create('/test_page_display_403', 'GET');
$response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
$this->assertEqual($response->getStatusCode(), 403);
$subrequest = Request::create('/test_page_display_404', 'GET');
$response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
$this->assertEqual($response->getStatusCode(), 404);
$subrequest = Request::create('/test_page_display_200', 'GET');
$response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
$this->assertEqual($response->getStatusCode(), 200);
Alex Pott
committed
$subrequest = Request::create('/test_page_display_200', 'GET');
\Drupal::getContainer()->get('request_stack')->push($subrequest);
Alex Pott
committed
// Test accessing a disabled page for a view.
catch
committed
$view = Views::getView('test_page_display');
Alex Pott
committed
// Disable the view, rebuild menu, and request the page again.
$view->storage->disable()->save();
// Router rebuild would occur in a kernel terminate event so we need to
// simulate that here.
Alex Pott
committed
\Drupal::service('router.builder')->rebuild();
Alex Pott
committed
$response = $this->container->get('http_kernel')->handle($subrequest, HttpKernelInterface::SUB_REQUEST);
$this->assertEqual($response->getStatusCode(), 404);
Alex Pott
committed
}
/**
* Checks that the router items are properly registered
*/
public function testPageRouterItems() {
Dries Buytaert
committed
$collection = \Drupal::service('views.route_subscriber')->routes();
Alex Pott
committed
// Check the controller defaults.
foreach ($collection as $id => $route) {
$this->assertEqual($route->getDefault('_controller'), 'Drupal\views\Routing\ViewPageController::handle');
$id_parts = explode('.', $id);
$this->assertEqual($route->getDefault('view_id'), $id_parts[1]);
$this->assertEqual($route->getDefault('display_id'), $id_parts[2]);
Alex Pott
committed
}
// Check the generated patterns and default values.
$route = $collection->get('view.test_page_display_route.page_1');
$this->assertEqual($route->getPath(), '/test_route_without_arguments');
$route = $collection->get('view.test_page_display_route.page_2');
$this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}');
$this->assertTrue($route->hasDefault('arg_0'), 'A default value is set for the optional argument id.');
Alex Pott
committed
$route = $collection->get('view.test_page_display_route.page_3');
$this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/suffix');
$this->assertFalse($route->hasDefault('arg_0'), 'No default value is set for the required argument id.');
Alex Pott
committed
$route = $collection->get('view.test_page_display_route.page_4');
$this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/suffix/{arg_1}');
$this->assertFalse($route->hasDefault('arg_0'), 'No default value is set for the required argument id.');
$this->assertTrue($route->hasDefault('arg_1'), 'A default value is set for the optional argument id_2.');
Alex Pott
committed
$route = $collection->get('view.test_page_display_route.page_5');
$this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/{arg_1}');
$this->assertTrue($route->hasDefault('arg_0'), 'A default value is set for the optional argument id.');
$this->assertTrue($route->hasDefault('arg_1'), 'A default value is set for the optional argument id_2.');
Alex Pott
committed
$route = $collection->get('view.test_page_display_route.page_6');
$this->assertEqual($route->getPath(), '/test_route_with_argument/{arg_0}/{arg_1}');
$this->assertFalse($route->hasDefault('arg_0'), 'No default value is set for the required argument id.');
$this->assertFalse($route->hasDefault('arg_1'), 'No default value is set for the required argument id_2.');
Daniel Wehner
committed
}
/**
* Tests the generated menu links of views.
*/
public function testMenuLinks() {
\Drupal::service('plugin.manager.menu.link')->rebuild();
$tree = \Drupal::menuTree()->load('admin', new MenuTreeParameters());
$this->assertTrue(isset($tree['system.admin']->subtree['views_view:views.test_page_display_menu.page_4']));
$menu_link = $tree['system.admin']->subtree['views_view:views.test_page_display_menu.page_4']->link;
Alex Pott
committed
$this->assertEqual($menu_link->getTitle(), 'Test child (with parent)');
$this->assertEqual($menu_link->isExpanded(), TRUE);
$this->assertEqual($menu_link->getDescription(), 'Sample description.');
Alex Pott
committed
}
/**
* Tests the calculated dependencies for various views using Page displays.
*/
public function testDependencies() {
$view = Views::getView('test_page_display');
Francesco Placella
committed
$this->assertIdentical(['module' => ['views_test_data']], $view->getDependencies());
Alex Pott
committed
$view = Views::getView('test_page_display_route');
$expected = [
'content' => ['StaticTest'],
'module' => ['views_test_data'],
];
$this->assertIdentical($expected, $view->getDependencies());
Alex Pott
committed
$view = Views::getView('test_page_display_menu');
$expected = [
'config' => [
'system.menu.admin',
'system.menu.tools',
],
Francesco Placella
committed
'module' => [
'views_test_data',
],
Alex Pott
committed
];
$this->assertIdentical($expected, $view->getDependencies());
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/**
* Tests the readmore functionality.
*/
public function testReadMore() {
/** @var \Drupal\Core\Render\RendererInterface $renderer */
$renderer = $this->container->get('renderer');
$expected_more_text = 'custom more text';
$view = Views::getView('test_display_more');
$this->executeView($view);
$output = $view->preview();
$output = $renderer->renderRoot($output);
$this->setRawContent($output);
$result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
$this->assertEqual($result[0]->attributes()->href, \Drupal::url('view.test_display_more.page_1'), 'The right more link is shown.');
$this->assertEqual(trim($result[0][0]), $expected_more_text, 'The right link text is shown.');
// Test the renderMoreLink method directly. This could be directly unit
// tested.
$more_link = $view->display_handler->renderMoreLink();
$more_link = $renderer->renderRoot($more_link);
$this->setRawContent($more_link);
$result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
$this->assertEqual($result[0]->attributes()->href, \Drupal::url('view.test_display_more.page_1'), 'The right more link is shown.');
$this->assertEqual(trim($result[0][0]), $expected_more_text, 'The right link text is shown.');
// Test the useMoreText method directly. This could be directly unit
// tested.
$more_text = $view->display_handler->useMoreText();
$this->assertEqual($more_text, $expected_more_text, 'The right more text is chosen.');
$view = Views::getView('test_display_more');
$view->setDisplay();
$view->display_handler->setOption('use_more', 0);
$this->executeView($view);
$output = $view->preview();
$output = $renderer->renderRoot($output);
$this->setRawContent($output);
$result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
$this->assertTrue(empty($result), 'The more link is not shown.');
$view = Views::getView('test_display_more');
$view->setDisplay();
$view->display_handler->setOption('use_more', 0);
$view->display_handler->setOption('use_more_always', 0);
$view->display_handler->setOption('pager', [
'type' => 'some',
'options' => [
'items_per_page' => 1,
'offset' => 0,
],
]);
$this->executeView($view);
$output = $view->preview();
$output = $renderer->renderRoot($output);
$this->setRawContent($output);
$result = $this->xpath('//div[@class=:class]/a', [':class' => 'more-link']);
$this->assertTrue(empty($result), 'The more link is not shown when view has more records.');
// Test the default value of use_more_always.
$view = View::create()->getExecutable();
$this->assertTrue($view->getDisplay()->getOption('use_more_always'), 'Always display the more link by default.');
}
Lee Rowlands
committed
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
/**
* Tests the templates with empty rows.
*/
public function testEmptyRow() {
$view = Views::getView('test_page_display');
$view->initDisplay();
$view->newDisplay('page', 'Page', 'empty_row');
$view->save();
$styles = [
'default' => '//div[@class="views-row"]',
'grid' => '//div[contains(@class, "views-col")]',
'html_list' => '//div[@class="item-list"]//li',
];
$themes = ['bartik', 'classy', 'seven', 'stable', 'stark'];
foreach ($themes as $theme) {
\Drupal::service('theme_handler')->install([$theme]);
\Drupal::theme()->setActiveTheme(\Drupal::service('theme.initialization')->initTheme($theme));
foreach ($styles as $type => $xpath) {
$view = Views::getView('test_page_display');
$view->storage->invalidateCaches();
$view->initDisplay();
$view->setDisplay('empty_row');
$view->displayHandlers->get('empty_row')->default_display->options['style']['type'] = $type;
$view->initStyle();
$this->executeView($view);
$output = $view->preview();
$output = \Drupal::service('renderer')->renderRoot($output);
$this->setRawContent($output);
$this->assertCount(5, $this->xpath("{$xpath}[not(text()) and not(node())]"), "Empty rows in theme '$theme', type '$type'.");
}
}
}