diff --git a/lib/Drupal/views/Tests/Handler/RelationshipTest.php b/lib/Drupal/views/Tests/Handler/RelationshipTest.php new file mode 100644 index 0000000000000000000000000000000000000000..68bb28a1c0306aa20e406ac3f812f45aa0d63dd5 --- /dev/null +++ b/lib/Drupal/views/Tests/Handler/RelationshipTest.php @@ -0,0 +1,185 @@ +<?php + +/** + * @file + * Definition of Drupal\views\Tests\Handler\RelationshipTest. + */ + +namespace Drupal\views\Tests\Handler; + +/** + * Tests the base relationship handler. + * + * @see Drupal\views\Plugin\views\relationship\RelationshipPluginBase + */ +class RelationshipTest extends HandlerTestBase { + + /** + * Maps between the key in the expected result and the query result. + * + * @var array + */ + protected $columnMap = array( + 'views_test_data_name' => 'name', + 'users_views_test_data_uid' => 'uid', + ); + + public static function getInfo() { + return array( + 'name' => 'Relationship: Standard', + 'description' => 'Tests the base relationship handler.', + 'group' => 'Views Handlers', + ); + } + + protected function setUp() { + parent::setUp(); + + $this->enableViewsTestModule(); + } + + + /** + * Overrides Drupal\views\Tests\ViewTestBase::schemaDefinition(). + * + * Adds a uid column to test the relationships. + * + * @return array + */ + protected function schemaDefinition() { + $schema = parent::schemaDefinition(); + + $schema['views_test_data']['fields']['uid'] = array( + 'description' => "The {users}.uid of the author of the beatle entry.", + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0 + ); + + return $schema; + } + + + /** + * Overrides Drupal\views\Tests\ViewTestBase::viewsData(). + * + * Adds a relationship for the uid column. + * + * @return array + */ + protected function viewsData() { + $data = parent::viewsData(); + $data['views_test_data']['uid'] = array( + 'title' => t('UID'), + 'help' => t('The test data UID'), + 'relationship' => array( + 'id' => 'standard', + 'base' => 'users', + 'base field' => 'uid' + ) + ); + + return $data; + } + + /** + * Tests the query result of a view with a relationship. + */ + public function testRelationshipQuery() { + // Set the first entry to have the admin as author. + db_query("UPDATE {views_test_data} SET uid = 1 WHERE id = 1"); + db_query("UPDATE {views_test_data} SET uid = 2 WHERE id <> 1"); + + $view = $this->getBasicView(); + + $view->display['default']->handler->overrideOption('relationships', array( + 'uid' => array( + 'id' => 'uid', + 'table' => 'views_test_data', + 'field' => 'uid', + ), + )); + + $view->display['default']->handler->overrideOption('filters', array( + 'uid' => array( + 'id' => 'uid', + 'table' => 'users', + 'field' => 'uid', + 'relationship' => 'uid', + ), + )); + + $fields = $view->display['default']->handler->getOption('fields'); + $view->display['default']->handler->overrideOption('fields', $fields + array( + 'uid' => array( + 'id' => 'uid', + 'table' => 'users', + 'field' => 'uid', + 'relationship' => 'uid', + ), + )); + + $view->initDisplay(); + $view->initHandlers(); + + // Check for all beatles created by admin. + $view->filter['uid']->value = array(1); + $this->executeView($view); + + $expected_result = array( + array( + 'name' => 'John', + 'uid' => 1 + ) + ); + $this->assertIdenticalResultset($view, $expected_result, $this->columnMap); + $view->destroy(); + + // Check for all beatles created by another user, which so doesn't exist. + $view->initDisplay(); + $view->initHandlers(); + $view->filter['uid']->value = array(3); + $this->executeView($view); + $expected_result = array(); + $this->assertIdenticalResultset($view, $expected_result, $this->columnMap); + $view->destroy(); + + // Set the relationship to required, so only results authored by the admin + // should return. + $view->initDisplay(); + $view->initHandlers(); + $view->relationship['uid']->options['required'] = TRUE; + $this->executeView($view); + + $expected_result = array( + array( + 'name' => 'John', + 'uid' => 1 + ) + ); + $this->assertIdenticalResultset($view, $expected_result, $this->columnMap); + $view->destroy(); + + // Set the relationship to optional should cause to return all beatles. + $view->initDisplay(); + $view->initHandlers(); + $view->relationship['uid']->options['required'] = FALSE; + $this->executeView($view); + + $expected_result = $this->dataSet(); + // Alter the expected result to contain the right uids. + foreach ($expected_result as $key => &$row) { + // Only John has an existing author. + if ($row['name'] == 'John') { + $row['uid'] = 1; + } + else { + // The LEFT join should set an empty {users}.uid field. + $row['uid'] = NULL; + } + } + + $this->assertIdenticalResultset($view, $expected_result, $this->columnMap); + } +} diff --git a/lib/Drupal/views/Tests/Node/RevisionRelationships.php b/lib/Drupal/views/Tests/Node/RevisionRelationships.php new file mode 100644 index 0000000000000000000000000000000000000000..ce066875978f048a0258526e5bb0f23e8f5a46a2 --- /dev/null +++ b/lib/Drupal/views/Tests/Node/RevisionRelationships.php @@ -0,0 +1,69 @@ +<?php + +/** + * @file + * Definition of Drupal\views\Tests\Node\RevisionRelationships. + */ +namespace Drupal\views\Tests\Node; + +use Drupal\views\Tests\ViewTestBase; + +/** + * Tests basic node_revision table integration into views. + */ +class RevisionRelationships extends ViewTestBase { + + public static function getInfo() { + return array( + 'name' => 'Node: Revision integration', + 'description' => 'Tests the integration of node_revision table of node module', + 'group' => 'Views Modules', + ); + } + + /** + * Create a node with revision and rest result count for both views. + */ + public function testNodeRevisionRelationship() { + $node = $this->drupalCreateNode(); + // Create revision of the node. + $node_revision = clone $node; + $node_revision->revision = 1; + $node->save(); + $column_map = array( + 'vid' => 'vid', + 'node_revision_nid' => 'node_revision_nid', + 'node_node_revision_nid' => 'node_node_revision_nid', + ); + + // Here should be two rows. + $view_nid = $this->createViewFromConfig('test_node_revision_nid'); + $this->executeView($view_nid, array($node->nid)); + $resultset_nid = array( + array( + 'vid' => '1', + 'node_revision_nid' => '1', + 'node_node_revision_nid' => '1', + ), + array( + 'vid' => '2', + 'node_revision_nid' => '1', + 'node_node_revision_nid' => '1', + ), + ); + $this->assertIdenticalResultset($view_nid, $resultset_nid, $column_map); + + // There should be only one row with active revision 2. + $view_vid = $this->createViewFromConfig('test_node_revision_vid'); + $this->executeView($view_vid, array($node->nid)); + $resultset_vid = array( + array( + 'vid' => '2', + 'node_revision_nid' => '1', + 'node_node_revision_nid' => '1', + ), + ); + $this->assertIdenticalResultset($view_vid, $resultset_vid, $column_map); + } + +}