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('
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('Executed view: ' . ((string) $view->build_info['query']) . ''); } /** * 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 = "\n" . print_r($message, TRUE) . "\n\n"; } // Optional title to go before the output. if (!empty($title)) { $title = '' . check_plain($title) . "
\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; } }