Skip to content
Snippets Groups Projects
Commit 6cc9fd2b authored by Daniel Wehner's avatar Daniel Wehner Committed by Tim Plunkett
Browse files

Issue #1754256 by dawehner: Add a generic testcase for the query base.

parent 81d97ba4
No related branches found
No related tags found
2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
<?php
/**
* @file
* Definition of Drupal\views\Tests\Plugin\QueryTest.
*/
namespace Drupal\views\Tests\Plugin;
use Drupal\views\Tests\ViewTestBase;
use Drupal\views_test_data\Plugin\views\query\QueryTest as QueryTestPlugin;
/**
* Tests query plugins.
*/
class QueryTest extends ViewTestBase {
public static function getInfo() {
return array(
'name' => 'Query',
'description' => 'Tests query plugins.',
'group' => 'Views Plugins'
);
}
protected function setUp() {
parent::setUp();
$this->enableViewsTestModule();
}
protected function viewsData() {
$data = parent::viewsData();
$data['views_test_data']['table']['base']['query_id'] = 'query_test';
return $data;
}
/**
* Tests query plugins.
*/
public function testQuery() {
$this->_testInitQuery();
$this->_testQueryExecute();
}
/**
* Tests the ViewExecutable::initQuery method.
*/
public function _testInitQuery() {
$view = $this->getBasicView();
$view->initQuery();
$this->assertTrue($view->query instanceof QueryTestPlugin, 'Make sure the right query plugin got instantiated.');
}
public function _testQueryExecute() {
$view = $this->getBasicView();
$view->initQuery();
$view->query->setAllItems($this->dataSet());
$this->executeView($view);
$this->assertTrue($view->result, 'Make sure the view result got filled');
}
}
......@@ -947,7 +947,7 @@ public function initQuery() {
$query_options = $this->display_handler->getOption('query');
// Create and initialize the query object.
$plugin = !empty($views_data['table']['base']['query class']) ? $views_data['table']['base']['query class'] : 'views_query';
$plugin = !empty($views_data['table']['base']['query_id']) ? $views_data['table']['base']['query_id'] : 'views_query';
$this->query = views_get_plugin('query', $plugin);
if (empty($this->query)) {
......
......@@ -12,7 +12,7 @@
use Drupal\Core\Annotation\Translation;
/**
* Defines a Display test plugin.
* Defines a join test plugin.
*
* @Plugin(
* id = "join_test",
......
<?php
/**
* @file
* Definition of Drupal\views_test_data\Plugin\views\query\QueryTest.
*/
namespace Drupal\views_test_data\Plugin\views\query;
use Drupal\views\Plugin\views\query\QueryPluginBase;
use Drupal\views\Plugin\views\join\JoinPluginBase;
use Drupal\views\ViewExecutable;
use Drupal\Core\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;
/**
* Defines a query test plugin.
*
* @Plugin(
* id = "query_test",
* title = @Translation("Query test")
* )
*/
class QueryTest extends QueryPluginBase {
protected $conditions = array();
protected $fields = array();
protected $allItems = array();
protected $orderBy = array();
/**
* Sets the allItems property.
*
* @param array $allItems
* An array of stdClasses.
*/
public function setAllItems($allItems) {
$this->allItems = $allItems;
}
public function add_where($group, $field, $value = NULL, $operator = NULL) {
$this->conditions[] = array(
'field' => $field,
'value' => $value,
'operator' => $operator
);
}
public function add_field($table, $field, $alias = '', $params = array()) {
$this->fields[$field] = $field;
return $field;
}
public function add_orderby($table, $field = NULL, $order = 'ASC', $alias = '', $params = array()) {
$this->orderBy = array('field' => $field, 'order' => $order);
}
public function ensure_table($table, $relationship = NULL, JoinPluginBase $join = NULL) {
// There is no concept of joins.
}
/**
* Implements Drupal\views\Plugin\views\query\QueryPluginBase::build().
*
* @param Drupal\views\ViewExecutable $view
*/
public function build(ViewExecutable $view) {
$this->view = $view;
// @todo Support pagers for know, a php based one would probably match.
// @todo You could add a string representatin of the query.
$this->view->build_info['query'] = "";
$this->view->build_info['count_query'] = "";
}
/**
* Implements Drupal\views\Plugin\views\query\QueryPluginBase::execute().
*/
public function execute(ViewExecutable $view) {
$result = array();
foreach ($this->allItems as $element) {
// Run all conditions on the element, and add it to the result if they
// match.
$match = TRUE;
foreach ($this->conditions as $condition) {
$match &= $this->match($element, $condition);
}
if ($match) {
// If the query explicit defines fields to use, filter all others out.
// Filter out fields
if ($this->fields) {
$element = array_intersect_key($element, $this->fields);
}
$result[] = (object) $element;
}
}
$this->view->result = $result;
}
/**
* Check a single condition for a single element.
*
* @param array $element
* The element which should be checked.
* @param array $condition
* An associative array containing:
* - field: The field to by, for example id.
* - value: The expected value of the element.
* - operator: The operator to compare the element value with the expected
* value.
*
* @return bool
* Returns whether the condition matches with the element.
*/
public function match($element, $condition) {
$value = $element[$condition['field']];
switch ($condition['operator']) {
case '=':
return $value == $condition['value'];
case 'IN':
return in_array($value, $condition['value']);
}
return FALSE;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment