View source
<?php
namespace Drupal\views\Tests\Plugin;
use Drupal\Component\Utility\Html;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
use Drupal\views\Tests\ViewTestBase;
use Drupal\views\ViewExecutable;
use Drupal\views\Views;
class ExposedFormTest extends ViewTestBase {
use AssertPageCacheContextsAndTagsTrait;
public static $testViews = array(
'test_exposed_form_buttons',
'test_exposed_block',
'test_exposed_form_sort_items_per_page',
);
public static $modules = array(
'node',
'views_ui',
'block',
'entity_test',
);
protected function setUp() {
parent::setUp();
$this
->drupalCreateContentType(array(
'type' => 'article',
));
for ($i = 0; $i < 5; $i++) {
$this
->drupalCreateNode(array(
'type' => 'article',
));
}
}
public function testSubmitButton() {
$this
->drupalGet('test_exposed_form_buttons');
$this
->assertResponse(200);
$this
->helperButtonHasLabel('edit-submit-test-exposed-form-buttons', t('Apply'));
$view = Views::getView('test_exposed_form_buttons');
$view
->setDisplay();
$exposed_form = $view->display_handler
->getOption('exposed_form');
$exposed_form['options']['submit_button'] = $expected_label = $this
->randomMachineName();
$view->display_handler
->setOption('exposed_form', $exposed_form);
$view
->save();
$this
->drupalGet('test_exposed_form_buttons');
$this
->helperButtonHasLabel('edit-submit-test-exposed-form-buttons', $expected_label);
$view = Views::getView('test_exposed_form_buttons');
$view
->setDisplay();
$exposed_form = $view->display_handler
->getOption('exposed_form');
$exposed_form['options']['submit_button'] = '';
$view->display_handler
->setOption('exposed_form', $exposed_form);
$view
->save();
$this
->drupalGet('test_exposed_form_buttons');
$this
->helperButtonHasLabel('edit-submit-test-exposed-form-buttons', t('Apply'));
}
public function testResetButton() {
$this
->drupalGet('test_exposed_form_buttons');
$this
->assertNoField('edit-reset');
$this
->drupalGet('test_exposed_form_buttons', array(
'query' => array(
'type' => 'article',
),
));
$this
->assertFieldById('edit-type', 'article', 'Article type filter set.');
$this
->drupalGet('test_exposed_form_buttons', array(
'query' => array(
'op' => 'Reset',
),
));
$this
->assertResponse(200);
$this
->assertFieldById('edit-type', 'All', 'Article type filter has been reset.');
$this
->assertNoField('edit-reset');
$this
->drupalGet('test_exposed_form_buttons', array(
'query' => array(
'type' => 'article',
'op' => 'Reset',
),
));
$this
->assertResponse(200);
$this
->assertFieldById('edit-type', 'All', 'Article type filter has been reset.');
$view = Views::getView('test_exposed_form_buttons');
$view
->setDisplay();
$exposed_form = $view->display_handler
->getOption('exposed_form');
$exposed_form['options']['reset_button_label'] = $expected_label = $this
->randomMachineName();
$exposed_form['options']['reset_button'] = TRUE;
$view->display_handler
->setOption('exposed_form', $exposed_form);
$view
->save();
$this
->drupalGet('test_exposed_form_buttons', array(
'query' => array(
'type' => 'article',
),
));
$this
->assertResponse(200);
$this
->helperButtonHasLabel('edit-reset', $expected_label);
}
public function testExposedFormRender() {
$view = Views::getView('test_exposed_form_buttons');
$this
->executeView($view);
$exposed_form = $view->display_handler
->getPlugin('exposed_form');
$output = $exposed_form
->renderExposedForm();
$this
->setRawContent(\Drupal::service('renderer')
->renderRoot($output));
$this
->assertFieldByXpath('//form/@id', $this
->getExpectedExposedFormId($view), 'Expected form ID found.');
$view
->setDisplay('page_1');
$expected_action = $view->display_handler
->getUrlInfo()
->toString();
$this
->assertFieldByXPath('//form/@action', $expected_action, 'The expected value for the action attribute was found.');
$result = $this
->xpath('//form//div[contains(@id, :id) and normalize-space(text())=:description]', array(
':id' => 'edit-type--description',
':description' => t('Exposed description'),
));
$this
->assertEqual(count($result), 1, 'Filter description was found.');
}
public function testExposedBlock() {
$view = Views::getView('test_exposed_block');
$view
->setDisplay('page_1');
$block = $this
->drupalPlaceBlock('views_exposed_filter_block:test_exposed_block-page_1');
$this
->drupalGet('test_exposed_block');
$xpath = $this
->buildXPathQuery('//div[@id=:id]/form/@id', array(
':id' => Html::getUniqueId('block-' . $block
->id()),
));
$this
->assertFieldByXpath($xpath, $this
->getExpectedExposedFormId($view), 'Expected form found in views block.');
$xpath = $this
->buildXPathQuery('//div[@class="view-content"]/form/@id', array(
':id' => Html::getUniqueId('block-' . $block
->id()),
));
$this
->assertNoFieldByXpath($xpath, $this
->getExpectedExposedFormId($view), 'No exposed form found in views content region.');
$elements = $this
->xpath('//form[@id=:id]', array(
':id' => $this
->getExpectedExposedFormId($view),
));
$this
->assertEqual(count($elements), 1, 'One exposed form block found.');
}
public function testInputRequired() {
$view = entity_load('view', 'test_exposed_form_buttons');
$display =& $view
->getDisplay('default');
$display['display_options']['exposed_form']['type'] = 'input_required';
$view
->save();
$this
->drupalGet('test_exposed_form_buttons');
$this
->assertResponse(200);
$this
->helperButtonHasLabel('edit-submit-test-exposed-form-buttons', t('Apply'));
$rows = $this
->xpath("//div[contains(@class, 'views-row')]");
$this
->assertEqual(count($rows), 0, 'No rows are displayed by default when no input is provided.');
$this
->drupalGet('test_exposed_form_buttons', array(
'query' => array(
'type' => 'article',
),
));
$rows = $this
->xpath("//div[contains(@class, 'views-row')]");
$this
->assertEqual(count($rows), 5, 'All rows are displayed by default when input is provided.');
}
public function testTextInputRequired() {
$view = Views::getView('test_exposed_form_buttons');
$display =& $view->storage
->getDisplay('default');
$display['display_options']['exposed_form']['type'] = 'input_required';
$on_demand_text = 'Select any filter and click Apply to see results.';
$display['display_options']['exposed_form']['options']['text_input_required'] = $on_demand_text;
$display['display_options']['exposed_form']['options']['text_input_required_format'] = filter_default_format();
$view
->save();
$this
->drupalGet('test_exposed_form_buttons');
$this
->assertText('Select any filter and click Apply to see results.');
$this
->drupalGet('test_exposed_form_buttons', array(
'query' => array(
'type' => 'article',
),
));
$this
->assertNoText($on_demand_text);
}
public function testExposedSortAndItemsPerPage() {
for ($i = 0; $i < 50; $i++) {
$entity = EntityTest::create([]);
$entity
->save();
}
$contexts = [
'languages:language_interface',
'entity_test_view_grants',
'theme',
'url.query_args',
'languages:language_content',
];
$this
->drupalGet('test_exposed_form_sort_items_per_page');
$this
->assertCacheContexts($contexts);
$this
->assertIds(range(1, 10, 1));
$this
->drupalGet('test_exposed_form_sort_items_per_page', [
'query' => [
'sort_order' => 'DESC',
],
]);
$this
->assertCacheContexts($contexts);
$this
->assertIds(range(50, 41, 1));
$this
->drupalGet('test_exposed_form_sort_items_per_page', [
'query' => [
'sort_order' => 'DESC',
'items_per_page' => 25,
],
]);
$this
->assertCacheContexts($contexts);
$this
->assertIds(range(50, 26, 1));
$this
->drupalGet('test_exposed_form_sort_items_per_page', [
'query' => [
'sort_order' => 'DESC',
'items_per_page' => 25,
'offset' => 10,
],
]);
$this
->assertCacheContexts($contexts);
$this
->assertIds(range(40, 16, 1));
}
protected function assertIds(array $ids) {
$elements = $this
->cssSelect('div.view-test-exposed-form-sort-items-per-page div.views-row span.field-content');
$actual_ids = [];
foreach ($elements as $element) {
$actual_ids[] = (int) $element;
}
return $this
->assertIdentical($ids, $actual_ids);
}
protected function getExpectedExposedFormId(ViewExecutable $view) {
return Html::cleanCssIdentifier('views-exposed-form-' . $view->storage
->id() . '-' . $view->current_display);
}
}