container->get("plugin.manager.views.$plugin_type")->clearCachedDefinitions(); } ViewTestData::createTestViews(get_class($this), array('views_test_config')); } /** * Sets up the views_test_data.module. * * Because the schema of views_test_data.module is dependent on the test * using it, it cannot be enabled normally. */ protected function enableViewsTestModule() { // Define the schema and views data variable before enabling the test module. \Drupal::state()->set('views_test_data_schema', $this->schemaDefinition()); \Drupal::state()->set('views_test_data_views_data', $this->viewsData()); \Drupal::moduleHandler()->install(array('views_test_data')); $this->resetAll(); $this->rebuildContainer(); $this->container->get('module_handler')->reload(); // Load the test dataset. $data_set = $this->dataSet(); $query = db_insert('views_test_data') ->fields(array_keys($data_set[0])); foreach ($data_set as $record) { $query->values($record); } $query->execute(); $this->checkPermissions(array(), TRUE); } /** * Verifies that a result set returned by a View matches expected values. * * 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 \Drupal\views\ViewExecutable $view * An executed View. * @param array $expected_result * An expected result set. * @param array $column_map * (optional) An associative array mapping the columns of the result set * from the view (as keys) and the expected result set (as values). * @param string $message * (optional) A custom message to display with the assertion. Defaults to * 'Identical result set.' * * @return bool * TRUE if the assertion succeeded, or FALSE otherwise. */ protected function assertIdenticalResultset($view, $expected_result, $column_map = array(), $message = 'Identical result set.') { return $this->assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, 'assertIdentical'); } /** * Verifies that a result set returned by a View differs from certain values. * * Inverse of ViewsTestCase::assertIdenticalResultset(). * * @param \Drupal\views\ViewExecutable $view * An executed View. * @param array $expected_result * An expected result set. * @param array $column_map * (optional) An associative array mapping the columns of the result set * from the view (as keys) and the expected result set (as values). * @param string $message * (optional) A custom message to display with the assertion. Defaults to * 'Non-identical result set.' * * @return bool * TRUE if the assertion succeeded, or FALSE otherwise. */ protected function assertNotIdenticalResultset($view, $expected_result, $column_map = array(), $message = 'Non-identical result set.') { return $this->assertIdenticalResultsetHelper($view, $expected_result, $column_map, $message, 'assertNotIdentical'); } /** * Performs View result assertions. * * This is a helper method for ViewTestBase::assertIdenticalResultset() and * ViewTestBase::assertNotIdenticalResultset(). * * @param \Drupal\views\ViewExecutable $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). * @param string $message * The message to display with the assertion. * @param string $assert_method * The TestBase assertion method to use (either 'assertIdentical' or * 'assertNotIdentical'). * * @return bool * TRUE if the assertion succeeded, or FALSE otherwise. * * @see \Drupal\views\Tests\ViewTestBase::assertIdenticalResultset() * @see \Drupal\views\Tests\ViewTestBase::assertNotIdenticalResultset() */ 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); } /** * Orders a nested array containing a result set based on a given column. * * @param array $result_set * An array of rows from a result set, with each row as an associative * array keyed by column name. * @param string $column * The column name by which to sort the result set. * @param bool $reverse * (optional) Boolean indicating whether to sort the result set in reverse * order. Defaults to FALSE. * * @return array * The sorted result set. */ protected function orderResultSet($result_set, $column, $reverse = FALSE) { $order = $reverse ? -1 : 1; usort($result_set, function ($a, $b) use ($column, $order) { if ($a[$column] == $b[$column]) { return 0; } return $order * (($a[$column] < $b[$column]) ? -1 : 1); }); return $result_set; } /** * Asserts the existence of a button with a certain ID and label. * * @param string $id * The HTML ID of the button * @param string $label. * The expected label for the button. * @param string $message * (optional) A custom message to display with the assertion. If no custom * message is provided, the message will indicate the button label. * * @return bool * TRUE if the asserion was successful, or FALSE on failure. */ 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))); } /** * Executes a view with debugging. * * @param \Drupal\views\ViewExecutable $view * The view object. * @param array $args * (optional) An array of the view arguments to use for the view. */ protected function executeView($view, $args = array()) { // A view does not really work outside of a request scope, due to many // dependencies like the current user. $this->container->enterScope('request'); $view->setDisplay(); $view->preExecute($args); $view->execute(); $verbose_message = 'Executed view: ' . ((string) $view->build_info['query']). ''; if ($view->build_info['query'] instanceof SelectInterface) { $verbose_message .= 'Arguments: ' . print_r($view->build_info['query']->getArguments(), TRUE) . ''; } $this->verbose($verbose_message); } /** * Checks to see whether a block appears on the page. * * @param \Drupal\block\Entity\Block $block * The block entity to find on the page. */ protected function assertBlockAppears(Block $block) { $result = $this->findBlockInstance($block); $this->assertTrue(!empty($result), format_string('Ensure the block @id appears on the page', array('@id' => $block->id()))); } /** * Checks to see whether a block does not appears on the page. * * @param \Drupal\block\Entity\Block $block * The block entity to find on the page. */ protected function assertNoBlockAppears(Block $block) { $result = $this->findBlockInstance($block); $this->assertFalse(!empty($result), format_string('Ensure the block @id does not appear on the page', array('@id' => $block->id()))); } /** * Find a block instance on the page. * * @param \Drupal\block\Entity\Block $block * The block entity to find on the page. * * @return array * The result from the xpath query. */ protected function findBlockInstance(Block $block) { return $this->xpath('//div[@id = :id]', array(':id' => 'block-' . $block->id())); } /** * Returns the schema definition. */ protected function schemaDefinition() { return ViewTestData::schemaDefinition(); } /** * Returns the views data definition. */ protected function viewsData() { return ViewTestData::viewsData(); } /** * Returns a very simple test dataset. */ protected function dataSet() { return ViewTestData::dataSet(); } }