Issue #2006560 by dawehner, jhodgdon: Fixed The boolean string filter doesn't result in correct where clause.
parent
0e100f3c4c
commit
c5b9bb0bc5
|
@ -37,7 +37,7 @@ class BooleanOperatorString extends BooleanOperator {
|
||||||
else {
|
else {
|
||||||
$where .= "<> ''";
|
$where .= "<> ''";
|
||||||
}
|
}
|
||||||
$this->query->addWhere($this->options['group'], $where);
|
$this->query->addWhereExpression($this->options['group'], $where);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,232 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \Drupal\views\Tests\Handler\FilterBooleanOperatorStringTest.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Drupal\views\Tests\Handler;
|
||||||
|
|
||||||
|
use Drupal\views\Tests\ViewUnitTestBase;
|
||||||
|
use Drupal\views\Views;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the BooleanOperator filter handler.
|
||||||
|
*
|
||||||
|
* @see \Drupal\views\Plugin\views\filter\BooleanOperatorString
|
||||||
|
*/
|
||||||
|
class FilterBooleanOperatorStringTest extends ViewUnitTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The modules to enable for this test.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public static $modules = array('system');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Views used by this test.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public static $testViews = array('test_view');
|
||||||
|
|
||||||
|
protected $column_map = array(
|
||||||
|
'views_test_data_id' => 'id',
|
||||||
|
);
|
||||||
|
|
||||||
|
public static function getInfo() {
|
||||||
|
return array(
|
||||||
|
'name' => 'Filter: Boolean string operator',
|
||||||
|
'description' => 'Test the core Drupal\views\Plugin\views\filter\BooleanOperatorString handler.',
|
||||||
|
'group' => 'Views Handlers',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->installSchema('system', array('menu_router', 'variable', 'key_value_expire'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function schemaDefinition() {
|
||||||
|
$schema = parent::schemaDefinition();
|
||||||
|
|
||||||
|
$schema['views_test_data']['fields']['status'] = array(
|
||||||
|
'description' => 'The status of this record',
|
||||||
|
'type' => 'varchar',
|
||||||
|
'length' => 255,
|
||||||
|
'not null' => TRUE,
|
||||||
|
'default' => '',
|
||||||
|
);
|
||||||
|
|
||||||
|
return $schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function viewsData() {
|
||||||
|
$views_data = parent::viewsData();
|
||||||
|
|
||||||
|
$views_data['views_test_data']['status']['filter']['id'] = 'boolean_string';
|
||||||
|
|
||||||
|
return $views_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function dataSet() {
|
||||||
|
$data = parent::dataSet();
|
||||||
|
|
||||||
|
foreach ($data as &$row) {
|
||||||
|
if ($row['status']) {
|
||||||
|
$row['status'] = 'Enabled';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$row['status'] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the BooleanOperatorString filter.
|
||||||
|
*/
|
||||||
|
public function testFilterBooleanOperatorString() {
|
||||||
|
$view = Views::getView('test_view');
|
||||||
|
$view->setDisplay();
|
||||||
|
|
||||||
|
// Add a the status boolean filter.
|
||||||
|
$view->displayHandlers->get('default')->overrideOption('filters', array(
|
||||||
|
'status' => array(
|
||||||
|
'id' => 'status',
|
||||||
|
'field' => 'status',
|
||||||
|
'table' => 'views_test_data',
|
||||||
|
'value' => 0,
|
||||||
|
),
|
||||||
|
));
|
||||||
|
$this->executeView($view);
|
||||||
|
|
||||||
|
$expected_result = array(
|
||||||
|
array('id' => 2),
|
||||||
|
array('id' => 4),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEqual(2, count($view->result));
|
||||||
|
$this->assertIdenticalResultset($view, $expected_result, $this->column_map);
|
||||||
|
|
||||||
|
$view->destroy();
|
||||||
|
$view->setDisplay();
|
||||||
|
|
||||||
|
// Add the status boolean filter.
|
||||||
|
$view->displayHandlers->get('default')->overrideOption('filters', array(
|
||||||
|
'status' => array(
|
||||||
|
'id' => 'status',
|
||||||
|
'field' => 'status',
|
||||||
|
'table' => 'views_test_data',
|
||||||
|
'value' => 1,
|
||||||
|
),
|
||||||
|
));
|
||||||
|
$this->executeView($view);
|
||||||
|
|
||||||
|
$expected_result = array(
|
||||||
|
array('id' => 1),
|
||||||
|
array('id' => 3),
|
||||||
|
array('id' => 5),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEqual(3, count($view->result));
|
||||||
|
$this->assertIdenticalResultset($view, $expected_result, $this->column_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the Boolean filter with grouped exposed form enabled.
|
||||||
|
*/
|
||||||
|
public function testFilterGroupedExposed() {
|
||||||
|
$filters = $this->getGroupedExposedFilters();
|
||||||
|
$view = Views::getView('test_view');
|
||||||
|
|
||||||
|
$view->setExposedInput(array('status' => 1));
|
||||||
|
$view->setDisplay();
|
||||||
|
$view->displayHandlers->get('default')->overrideOption('filters', $filters);
|
||||||
|
|
||||||
|
$this->executeView($view);
|
||||||
|
|
||||||
|
$expected_result = array(
|
||||||
|
array('id' => 1),
|
||||||
|
array('id' => 3),
|
||||||
|
array('id' => 5),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEqual(3, count($view->result));
|
||||||
|
$this->assertIdenticalResultset($view, $expected_result, $this->column_map);
|
||||||
|
$view->destroy();
|
||||||
|
|
||||||
|
$view->setExposedInput(array('status' => 2));
|
||||||
|
$view->setDisplay();
|
||||||
|
$view->displayHandlers->get('default')->overrideOption('filters', $filters);
|
||||||
|
|
||||||
|
$this->executeView($view);
|
||||||
|
|
||||||
|
$expected_result = array(
|
||||||
|
array('id' => 2),
|
||||||
|
array('id' => 4),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEqual(2, count($view->result));
|
||||||
|
$this->assertIdenticalResultset($view, $expected_result, $this->column_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides grouped exposed filter configuration.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* Returns the filter configuration for exposed filters.
|
||||||
|
*/
|
||||||
|
protected function getGroupedExposedFilters() {
|
||||||
|
$filters = array(
|
||||||
|
'status' => array(
|
||||||
|
'id' => 'status',
|
||||||
|
'table' => 'views_test_data',
|
||||||
|
'field' => 'status',
|
||||||
|
'relationship' => 'none',
|
||||||
|
'exposed' => TRUE,
|
||||||
|
'expose' => array(
|
||||||
|
'operator' => 'status_op',
|
||||||
|
'label' => 'status',
|
||||||
|
'identifier' => 'status',
|
||||||
|
),
|
||||||
|
'is_grouped' => TRUE,
|
||||||
|
'group_info' => array(
|
||||||
|
'label' => 'status',
|
||||||
|
'identifier' => 'status',
|
||||||
|
'default_group' => 'All',
|
||||||
|
'group_items' => array(
|
||||||
|
1 => array(
|
||||||
|
'title' => 'Active',
|
||||||
|
'operator' => '=',
|
||||||
|
'value' => '1',
|
||||||
|
),
|
||||||
|
2 => array(
|
||||||
|
'title' => 'Blocked',
|
||||||
|
'operator' => '=',
|
||||||
|
'value' => '0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return $filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
namespace Drupal\views\Tests;
|
namespace Drupal\views\Tests;
|
||||||
|
|
||||||
|
use Drupal\Core\Database\Query\SelectInterface;
|
||||||
use Drupal\simpletest\WebTestBase;
|
use Drupal\simpletest\WebTestBase;
|
||||||
use Drupal\views\ViewExecutable;
|
use Drupal\views\ViewExecutable;
|
||||||
use Drupal\block\Plugin\Core\Entity\Block;
|
use Drupal\block\Plugin\Core\Entity\Block;
|
||||||
|
@ -228,7 +229,11 @@ abstract class ViewTestBase extends WebTestBase {
|
||||||
$view->setDisplay();
|
$view->setDisplay();
|
||||||
$view->preExecute($args);
|
$view->preExecute($args);
|
||||||
$view->execute();
|
$view->execute();
|
||||||
$this->verbose('<pre>Executed view: ' . ((string) $view->build_info['query']) . '</pre>');
|
$verbose_message = '<pre>Executed view: ' . ((string) $view->build_info['query']). '</pre>';
|
||||||
|
if ($view->build_info['query'] instanceof SelectInterface) {
|
||||||
|
$verbose_message .= '<pre>Arguments: ' . print_r($view->build_info['query']->getArguments(), TRUE) . '</pre>';
|
||||||
|
}
|
||||||
|
$this->verbose($verbose_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
namespace Drupal\views\Tests;
|
namespace Drupal\views\Tests;
|
||||||
|
|
||||||
|
use Drupal\Core\Database\Query\SelectInterface;
|
||||||
use Drupal\views\ViewExecutable;
|
use Drupal\views\ViewExecutable;
|
||||||
use Drupal\views\ViewsBundle;
|
use Drupal\views\ViewsBundle;
|
||||||
use Drupal\simpletest\DrupalUnitTestBase;
|
use Drupal\simpletest\DrupalUnitTestBase;
|
||||||
|
@ -222,7 +223,11 @@ abstract class ViewUnitTestBase extends DrupalUnitTestBase {
|
||||||
$view->setDisplay();
|
$view->setDisplay();
|
||||||
$view->preExecute($args);
|
$view->preExecute($args);
|
||||||
$view->execute();
|
$view->execute();
|
||||||
$this->verbose('<pre>Executed view: ' . ((string) $view->build_info['query']) . '</pre>');
|
$verbose_message = '<pre>Executed view: ' . ((string) $view->build_info['query']). '</pre>';
|
||||||
|
if ($view->build_info['query'] instanceof SelectInterface) {
|
||||||
|
$verbose_message .= '<pre>Arguments: ' . print_r($view->build_info['query']->getArguments(), TRUE) . '</pre>';
|
||||||
|
}
|
||||||
|
$this->verbose($verbose_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue