510 lines
13 KiB
Plaintext
510 lines
13 KiB
Plaintext
<?php
|
|
|
|
/**
|
|
* @file
|
|
* Abstract class for views testing.
|
|
*/
|
|
|
|
/**
|
|
*
|
|
*/
|
|
abstract class ViewsTestCase extends DrupalWebTestCase {
|
|
|
|
/**
|
|
*
|
|
*/
|
|
protected $sort_column = NULL;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
protected $sort_order = 1;
|
|
|
|
/**
|
|
* Helper function: verify a result set returned by view.
|
|
*
|
|
* The comparison is done on the string representation of the columns of the
|
|
* column map, taking the order of the rows into account, but not the order
|
|
* of the columns.
|
|
*
|
|
* @param view $view
|
|
* An executed View.
|
|
* @param array $expected_result
|
|
* An expected result set.
|
|
* @param array $column_map
|
|
* An associative array mapping the columns of the result set from the view
|
|
* (as keys) and the expected result set (as values).
|
|
*/
|
|
protected function assertIdenticalResultset($view, $expected_result, $column_map = array(), $message = 'Identical result set') {
|
|
return $this->assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, 'assertIdentical');
|
|
}
|
|
|
|
/**
|
|
* Helper function: verify a result set returned by view..
|
|
*
|
|
* Inverse of ViewsTestCase::assertIdenticalResultset().
|
|
*
|
|
* @param view $view
|
|
* An executed View.
|
|
* @param array $expected_result
|
|
* An expected result set.
|
|
* @param array $column_map
|
|
* An associative array mapping the columns of the result set from the view
|
|
* (as keys) and the expected result set (as values).
|
|
*/
|
|
protected function assertNotIdenticalResultset($view, $expected_result, $column_map = array(), $message = 'Identical result set') {
|
|
return $this->assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, 'assertNotIdentical');
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
protected function assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, $assert_method) {
|
|
// Convert $view->result to an array of arrays.
|
|
$result = array();
|
|
foreach ($view->result as $key => $value) {
|
|
$row = array();
|
|
foreach ($column_map as $view_column => $expected_column) {
|
|
// The comparison will be done on the string representation of the
|
|
// value.
|
|
$row[$expected_column] = (string) $value->$view_column;
|
|
}
|
|
$result[$key] = $row;
|
|
}
|
|
|
|
// Remove the columns we don't need from the expected result.
|
|
foreach ($expected_result as $key => $value) {
|
|
$row = array();
|
|
foreach ($column_map as $expected_column) {
|
|
// The comparison will be done on the string representation of the
|
|
// value.
|
|
$row[$expected_column] = (string) (is_object($value) ? $value->$expected_column : $value[$expected_column]);
|
|
}
|
|
$expected_result[$key] = $row;
|
|
}
|
|
|
|
// Reset the numbering of the arrays.
|
|
$result = array_values($result);
|
|
$expected_result = array_values($expected_result);
|
|
|
|
$this->verbose('<pre>Returned data set: ' . print_r($result, TRUE) . "\n\nExpected: " . print_r($expected_result, TRUE));
|
|
|
|
// Do the actual comparison.
|
|
return $this->$assert_method($result, $expected_result, $message);
|
|
}
|
|
|
|
/**
|
|
* Order an array of array based on a column.
|
|
*/
|
|
protected function orderResultSet($result_set, $column, $reverse = FALSE) {
|
|
$this->sort_column = $column;
|
|
$this->sort_order = $reverse ? -1 : 1;
|
|
usort($result_set, array($this, 'helperCompareFunction'));
|
|
return $result_set;
|
|
}
|
|
|
|
/**
|
|
* Helper comparison function for orderResultSet().
|
|
*/
|
|
protected function helperCompareFunction($a, $b) {
|
|
$value1 = $a[$this->sort_column];
|
|
$value2 = $b[$this->sort_column];
|
|
if ($value1 == $value2) {
|
|
return 0;
|
|
}
|
|
return $this->sort_order * (($value1 < $value2) ? -1 : 1);
|
|
}
|
|
|
|
/**
|
|
* Check whether a button with a certain id exists and has a certain label.
|
|
*/
|
|
protected function helperButtonHasLabel($id, $expected_label, $message = 'Label has the expected value: %label.') {
|
|
return $this->assertFieldById($id, $expected_label, t($message, array('%label' => $expected_label)));
|
|
}
|
|
|
|
/**
|
|
* Execute a view with debugging.
|
|
*
|
|
* @param view $view
|
|
* @param array $args
|
|
*/
|
|
protected function executeView($view, $args = array()) {
|
|
$view->set_display();
|
|
$view->pre_execute($args);
|
|
$view->execute();
|
|
$this->verbose('<pre>Executed view: ' . ((string) $view->build_info['query']) . '</pre>');
|
|
}
|
|
|
|
/**
|
|
* Log in as user 1.
|
|
*/
|
|
protected function loginUser1() {
|
|
$password = user_password();
|
|
// Reset the user 1 password.
|
|
$account = user_load(1);
|
|
$edit = array(
|
|
'pass' => $password,
|
|
);
|
|
$account = user_save($account, $edit);
|
|
$account->pass_raw = $password;
|
|
|
|
// Log in as user 1.
|
|
$this->drupalLogin($account);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function verbose($message, $title = NULL) {
|
|
// Handle arrays, objects, etc.
|
|
if (!is_string($message)) {
|
|
$message = "<pre>\n" . print_r($message, TRUE) . "\n</pre>\n";
|
|
}
|
|
|
|
// Optional title to go before the output.
|
|
if (!empty($title)) {
|
|
$title = '<h2>' . check_plain($title) . "</h2>\n";
|
|
}
|
|
|
|
parent::verbose($title . $message);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
abstract class ViewsSqlTest extends ViewsTestCase {
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function setUp() {
|
|
parent::setUp('views', 'views_ui');
|
|
|
|
// Define the schema and views data variable before enabling the test
|
|
// module.
|
|
variable_set('views_test_schema', $this->schemaDefinition());
|
|
variable_set('views_test_views_data', $this->viewsData());
|
|
variable_set('views_test_views_plugins', $this->viewsPlugins());
|
|
module_enable(array('views_test'));
|
|
$this->resetAll();
|
|
|
|
// Load the test dataset.
|
|
$data_set = $this->dataSet();
|
|
$query = db_insert('views_test')
|
|
->fields(array_keys($data_set[0]));
|
|
foreach ($data_set as $record) {
|
|
$query->values($record);
|
|
}
|
|
$query->execute();
|
|
$this->checkPermissions(array(), TRUE);
|
|
}
|
|
|
|
/**
|
|
* Create a term.
|
|
*
|
|
* @param int $vid
|
|
* The vocabulary ID that the term is to be added to.
|
|
*
|
|
* @return object
|
|
* A full term object with a random name.
|
|
*/
|
|
protected function drupalCreateTerm($vid) {
|
|
$term = new stdClass();
|
|
$term->name = $this->randomName();
|
|
$term->description = $this->randomName();
|
|
$term->vid = $vid;
|
|
taxonomy_term_save($term);
|
|
return $term;
|
|
}
|
|
|
|
/**
|
|
* This function allows to enable views ui from a higher class which can't
|
|
* change the setup function anymore.
|
|
*
|
|
* @todo Convert existing setUp functions.
|
|
*/
|
|
function enableViewsUi() {
|
|
module_enable(array('views_ui'));
|
|
// @todo Figure out why it's required to clear the cache here.
|
|
views_module_include('views_default', TRUE);
|
|
views_get_all_views(TRUE);
|
|
menu_rebuild();
|
|
}
|
|
|
|
/**
|
|
* The schema definition.
|
|
*/
|
|
protected function schemaDefinition() {
|
|
$schema['views_test'] = array(
|
|
'description' => 'Basic test table for Views tests.',
|
|
'fields' => array(
|
|
'id' => array(
|
|
'type' => 'serial',
|
|
'unsigned' => TRUE,
|
|
'not null' => TRUE,
|
|
),
|
|
'name' => array(
|
|
'description' => "A person's name",
|
|
'type' => 'varchar',
|
|
'length' => 255,
|
|
'not null' => TRUE,
|
|
'default' => '',
|
|
),
|
|
'age' => array(
|
|
'description' => "The person's age",
|
|
'type' => 'int',
|
|
'unsigned' => TRUE,
|
|
'not null' => TRUE,
|
|
'default' => 0),
|
|
'job' => array(
|
|
'description' => "The person's job",
|
|
'type' => 'varchar',
|
|
'length' => 255,
|
|
'not null' => TRUE,
|
|
'default' => 'Undefined',
|
|
),
|
|
'created' => array(
|
|
'description' => "The creation date of this record",
|
|
'type' => 'int',
|
|
'unsigned' => TRUE,
|
|
'not null' => TRUE,
|
|
'default' => 0,
|
|
),
|
|
),
|
|
'primary key' => array('id'),
|
|
'unique keys' => array(
|
|
'name' => array('name'),
|
|
),
|
|
'indexes' => array(
|
|
'ages' => array('age'),
|
|
),
|
|
);
|
|
return $schema;
|
|
}
|
|
|
|
/**
|
|
* The views data definition.
|
|
*/
|
|
protected function viewsData() {
|
|
// Declaration of the base table.
|
|
$data['views_test']['table'] = array(
|
|
'group' => t('Views test'),
|
|
'base' => array(
|
|
'field' => 'id',
|
|
'title' => t('Views test'),
|
|
'help' => t('Users who have created accounts on your site.'),
|
|
),
|
|
);
|
|
|
|
// Declaration of fields.
|
|
$data['views_test']['id'] = array(
|
|
'title' => t('ID'),
|
|
'help' => t('The test data ID'),
|
|
'field' => array(
|
|
'handler' => 'views_handler_field_numeric',
|
|
'click sortable' => TRUE,
|
|
),
|
|
'argument' => array(
|
|
'handler' => 'views_handler_argument_numeric',
|
|
),
|
|
'filter' => array(
|
|
'handler' => 'views_handler_filter_numeric',
|
|
),
|
|
'sort' => array(
|
|
'handler' => 'views_handler_sort',
|
|
),
|
|
);
|
|
$data['views_test']['name'] = array(
|
|
'title' => t('Name'),
|
|
'help' => t('The name of the person'),
|
|
'field' => array(
|
|
'handler' => 'views_handler_field',
|
|
'click sortable' => TRUE,
|
|
),
|
|
'argument' => array(
|
|
'handler' => 'views_handler_argument_string',
|
|
),
|
|
'filter' => array(
|
|
'handler' => 'views_handler_filter_string',
|
|
),
|
|
'sort' => array(
|
|
'handler' => 'views_handler_sort',
|
|
),
|
|
);
|
|
$data['views_test']['age'] = array(
|
|
'title' => t('Age'),
|
|
'help' => t('The age of the person'),
|
|
'field' => array(
|
|
'handler' => 'views_handler_field_numeric',
|
|
'click sortable' => TRUE,
|
|
),
|
|
'argument' => array(
|
|
'handler' => 'views_handler_argument_numeric',
|
|
),
|
|
'filter' => array(
|
|
'handler' => 'views_handler_filter_numeric',
|
|
),
|
|
'sort' => array(
|
|
'handler' => 'views_handler_sort',
|
|
),
|
|
);
|
|
$data['views_test']['job'] = array(
|
|
'title' => t('Job'),
|
|
'help' => t('The job of the person'),
|
|
'field' => array(
|
|
'handler' => 'views_handler_field',
|
|
'click sortable' => TRUE,
|
|
),
|
|
'argument' => array(
|
|
'handler' => 'views_handler_argument_string',
|
|
),
|
|
'filter' => array(
|
|
'handler' => 'views_handler_filter_string',
|
|
),
|
|
'sort' => array(
|
|
'handler' => 'views_handler_sort',
|
|
),
|
|
);
|
|
$data['views_test']['created'] = array(
|
|
'title' => t('Created'),
|
|
'help' => t('The creation date of this record'),
|
|
'field' => array(
|
|
'handler' => 'views_handler_field_date',
|
|
'click sortable' => TRUE,
|
|
),
|
|
'argument' => array(
|
|
'handler' => 'views_handler_argument_date',
|
|
),
|
|
'filter' => array(
|
|
'handler' => 'views_handler_filter_date',
|
|
),
|
|
'sort' => array(
|
|
'handler' => 'views_handler_sort_date',
|
|
),
|
|
);
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
protected function viewsPlugins() {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* A very simple test dataset.
|
|
*/
|
|
protected function dataSet() {
|
|
return array(
|
|
array(
|
|
'name' => 'John',
|
|
'age' => 25,
|
|
'job' => 'Singer',
|
|
'created' => gmmktime(0, 0, 0, 1, 1, 2000),
|
|
),
|
|
array(
|
|
'name' => 'George',
|
|
'age' => 27,
|
|
'job' => 'Singer',
|
|
'created' => gmmktime(0, 0, 0, 1, 2, 2000),
|
|
),
|
|
array(
|
|
'name' => 'Ringo',
|
|
'age' => 28,
|
|
'job' => 'Drummer',
|
|
'created' => gmmktime(6, 30, 30, 1, 1, 2000),
|
|
),
|
|
array(
|
|
'name' => 'Paul',
|
|
'age' => 26,
|
|
'job' => 'Songwriter',
|
|
'created' => gmmktime(6, 0, 0, 1, 1, 2000),
|
|
),
|
|
array(
|
|
'name' => 'Meredith',
|
|
'age' => 30,
|
|
'job' => 'Speaker',
|
|
'created' => gmmktime(6, 30, 10, 1, 1, 2000),
|
|
),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Build and return a basic view of the views_test table.
|
|
*
|
|
* @return view
|
|
*/
|
|
protected function getBasicView() {
|
|
views_include('view');
|
|
|
|
// Create the basic view.
|
|
$view = new view();
|
|
$view->name = 'test_view';
|
|
$view->add_display('default');
|
|
$view->base_table = 'views_test';
|
|
|
|
// Set up the fields we need.
|
|
$display = $view->new_display('default', 'Master', 'default');
|
|
$display->override_option('fields', array(
|
|
'id' => array(
|
|
'id' => 'id',
|
|
'table' => 'views_test',
|
|
'field' => 'id',
|
|
'relationship' => 'none',
|
|
),
|
|
'name' => array(
|
|
'id' => 'name',
|
|
'table' => 'views_test',
|
|
'field' => 'name',
|
|
'relationship' => 'none',
|
|
),
|
|
'age' => array(
|
|
'id' => 'age',
|
|
'table' => 'views_test',
|
|
'field' => 'age',
|
|
'relationship' => 'none',
|
|
),
|
|
));
|
|
|
|
// Set up the sort order.
|
|
$display->override_option('sorts', array(
|
|
'id' => array(
|
|
'order' => 'ASC',
|
|
'id' => 'id',
|
|
'table' => 'views_test',
|
|
'field' => 'id',
|
|
'relationship' => 'none',
|
|
),
|
|
));
|
|
|
|
// Set up the pager.
|
|
$display->override_option('pager', array(
|
|
'type' => 'none',
|
|
'options' => array('offset' => 0),
|
|
));
|
|
|
|
return $view;
|
|
}
|
|
|
|
/**
|
|
* Build and return a Page view of the views_test table.
|
|
*
|
|
* @return view
|
|
*/
|
|
protected function getBasicPageView() {
|
|
views_include('view');
|
|
$view = $this->getBasicView();
|
|
|
|
// In order to test exposed filters, we have to disable the exposed forms
|
|
// cache.
|
|
drupal_static_reset('views_exposed_form_cache');
|
|
|
|
$display = $view->new_display('page', 'Page', 'page_1');
|
|
return $view;
|
|
}
|
|
|
|
}
|