Chris@0: assertIdenticalResultsetHelper($view, $expected_result, $column_map, 'assertIdentical', $message); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Verifies that a result set returned by a View differs from certain values. Chris@0: * Chris@0: * Inverse of ViewsTestCase::assertIdenticalResultset(). Chris@0: * Chris@0: * @param \Drupal\views\ViewExecutable $view Chris@0: * An executed View. Chris@0: * @param array $expected_result Chris@0: * An expected result set. Chris@0: * @param array $column_map Chris@0: * (optional) An associative array mapping the columns of the result set Chris@0: * from the view (as keys) and the expected result set (as values). Chris@0: * @param string $message Chris@0: * (optional) A custom message to display with the assertion. Defaults to Chris@0: * 'Non-identical result set.' Chris@0: * Chris@0: * @return bool Chris@0: * TRUE if the assertion succeeded, or FALSE otherwise. Chris@0: */ Chris@0: protected function assertNotIdenticalResultset($view, $expected_result, $column_map = [], $message = NULL) { Chris@0: return $this->assertIdenticalResultsetHelper($view, $expected_result, $column_map, 'assertNotIdentical', $message); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Performs View result assertions. Chris@0: * Chris@0: * This is a helper method for ViewTestBase::assertIdenticalResultset() and Chris@0: * ViewTestBase::assertNotIdenticalResultset(). Chris@0: * Chris@0: * @param \Drupal\views\ViewExecutable $view Chris@0: * An executed View. Chris@0: * @param array $expected_result Chris@0: * An expected result set. Chris@0: * @param array $column_map Chris@0: * An associative array mapping the columns of the result set Chris@0: * from the view (as keys) and the expected result set (as values). Chris@0: * @param string $assert_method Chris@0: * The TestBase assertion method to use (either 'assertIdentical' or Chris@0: * 'assertNotIdentical'). Chris@0: * @param string $message Chris@0: * (optional) The message to display with the assertion. Chris@0: * Chris@0: * @return bool Chris@0: * TRUE if the assertion succeeded, or FALSE otherwise. Chris@0: */ Chris@0: protected function assertIdenticalResultsetHelper($view, $expected_result, $column_map, $assert_method, $message = NULL) { Chris@0: // Convert $view->result to an array of arrays. Chris@0: $result = []; Chris@0: foreach ($view->result as $key => $value) { Chris@0: $row = []; Chris@0: foreach ($column_map as $view_column => $expected_column) { Chris@0: if (property_exists($value, $view_column)) { Chris@0: $row[$expected_column] = (string) $value->$view_column; Chris@0: } Chris@0: // For entity fields we don't have the raw value. Let's try to fetch it Chris@0: // using the entity itself. Chris@0: elseif (empty($value->$view_column) && isset($view->field[$expected_column]) && ($field = $view->field[$expected_column]) && $field instanceof EntityField) { Chris@0: $column = NULL; Chris@0: if (count(explode(':', $view_column)) == 2) { Chris@0: $column = explode(':', $view_column)[1]; Chris@0: } Chris@12: // The comparison will be done on the string representation of the Chris@12: // value. Chris@12: $field_value = $field->getValue($value, $column); Chris@12: $row[$expected_column] = is_array($field_value) ? array_map('strval', $field_value) : (string) $field_value; Chris@0: } Chris@0: } Chris@0: $result[$key] = $row; Chris@0: } Chris@0: Chris@0: // Remove the columns we don't need from the expected result. Chris@0: foreach ($expected_result as $key => $value) { Chris@0: $row = []; Chris@0: foreach ($column_map as $expected_column) { Chris@0: // The comparison will be done on the string representation of the value. Chris@0: if (is_object($value)) { Chris@0: $row[$expected_column] = (string) $value->$expected_column; Chris@0: } Chris@0: // This case is about fields with multiple values. Chris@0: elseif (is_array($value[$expected_column])) { Chris@0: foreach (array_keys($value[$expected_column]) as $delta) { Chris@0: $row[$expected_column][$delta] = (string) $value[$expected_column][$delta]; Chris@0: } Chris@0: } Chris@0: else { Chris@0: $row[$expected_column] = (string) $value[$expected_column]; Chris@0: } Chris@0: } Chris@0: $expected_result[$key] = $row; Chris@0: } Chris@0: Chris@0: $this->verbose('
'
Chris@0:       . "\n\nQuery:\n" . $view->build_info['query']
Chris@0:       . "\n\nQuery arguments:\n" . var_export($view->build_info['query']->getArguments(), TRUE)
Chris@0:       . "\n\nActual result:\n" . var_export($result, TRUE)
Chris@0:       . "\n\nExpected result:\n" . var_export($expected_result, TRUE));
Chris@0: 
Chris@0:     // Reset the numbering of the arrays.
Chris@0:     $result = array_values($result);
Chris@0:     $expected_result = array_values($expected_result);
Chris@0: 
Chris@0:     // Do the actual comparison.
Chris@0:     if (!isset($message)) {
Chris@0:       $not = (strpos($assert_method, 'Not') ? 'not' : '');
Chris@0:       $message = format_string("Actual result 
\n@actual\n
is $not identical to expected
\n@expected\n
", [ Chris@0: '@actual' => var_export($result, TRUE), Chris@0: '@expected' => var_export($expected_result, TRUE), Chris@0: ]); Chris@0: } Chris@0: return $this->$assert_method($result, $expected_result, $message); Chris@0: } Chris@0: Chris@0: }