Version 1
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Plugin / RelationshipTest.php
diff --git a/web/core/modules/views/tests/src/Kernel/Plugin/RelationshipTest.php b/web/core/modules/views/tests/src/Kernel/Plugin/RelationshipTest.php
new file mode 100644 (file)
index 0000000..802befe
--- /dev/null
@@ -0,0 +1,178 @@
+<?php
+
+namespace Drupal\Tests\views\Kernel\Plugin;
+
+use Drupal\simpletest\UserCreationTrait;
+use Drupal\views\Views;
+
+/**
+ * Tests the base relationship handler.
+ *
+ * @group views
+ * @see \Drupal\views\Plugin\views\relationship\RelationshipPluginBase
+ */
+class RelationshipTest extends RelationshipJoinTestBase {
+  use UserCreationTrait;
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_view'];
+
+  /**
+   * Maps between the key in the expected result and the query result.
+   *
+   * @var array
+   */
+  protected $columnMap = [
+    'views_test_data_name' => 'name',
+    'users_field_data_views_test_data_uid' => 'uid',
+  ];
+
+  /**
+   * 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 = Views::getView('test_view');
+    $view->setDisplay();
+
+    $view->displayHandlers->get('default')->overrideOption('relationships', [
+      'uid' => [
+        'id' => 'uid',
+        'table' => 'views_test_data',
+        'field' => 'uid',
+      ],
+    ]);
+
+    $view->displayHandlers->get('default')->overrideOption('filters', [
+      'uid' => [
+        'id' => 'uid',
+        'table' => 'users_field_data',
+        'field' => 'uid',
+        'relationship' => 'uid',
+      ],
+    ]);
+
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    $view->displayHandlers->get('default')->overrideOption('fields', $fields + [
+      'uid' => [
+        'id' => 'uid',
+        'table' => 'users_field_data',
+        'field' => 'uid',
+        'relationship' => 'uid',
+      ],
+    ]);
+
+    $view->initHandlers();
+
+    // Check for all beatles created by admin.
+    $view->filter['uid']->value = [1];
+    $this->executeView($view);
+
+    $expected_result = [
+      [
+        '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->initHandlers();
+    $view->filter['uid']->value = [3];
+    $this->executeView($view);
+    $expected_result = [];
+    $this->assertIdenticalResultset($view, $expected_result, $this->columnMap);
+    $view->destroy();
+
+    // Set the relationship to required, so only results authored by the admin
+    // should return.
+    $view->initHandlers();
+    $view->relationship['uid']->options['required'] = TRUE;
+    $this->executeView($view);
+
+    $expected_result = [
+      [
+        '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->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 &$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);
+  }
+
+  /**
+   * Tests rendering of a view with a relationship.
+   */
+  public function testRelationshipRender() {
+    $author1 = $this->createUser();
+    db_query("UPDATE {views_test_data} SET uid = :uid WHERE id = 1", [':uid' => $author1->id()]);
+    $author2 = $this->createUser();
+    db_query("UPDATE {views_test_data} SET uid = :uid WHERE id = 2", [':uid' => $author2->id()]);
+    // Set uid to non-existing author uid for row 3.
+    db_query("UPDATE {views_test_data} SET uid = :uid WHERE id = 3", [':uid' => $author2->id() + 123]);
+
+    $view = Views::getView('test_view');
+    // Add a relationship for authors.
+    $view->getDisplay()->overrideOption('relationships', [
+      'uid' => [
+        'id' => 'uid',
+        'table' => 'views_test_data',
+        'field' => 'uid',
+      ],
+    ]);
+    // Add fields for {views_test_data}.id and author name.
+    $view->getDisplay()->overrideOption('fields', [
+      'id' => [
+        'id' => 'id',
+        'table' => 'views_test_data',
+        'field' => 'id',
+      ],
+      'author' => [
+        'id' => 'author',
+        'table' => 'users_field_data',
+        'field' => 'name',
+        'relationship' => 'uid',
+      ],
+    ]);
+
+    // Render the view.
+    $output = $view->preview();
+    $html = $this->container->get('renderer')->renderRoot($output);
+    $this->setRawContent($html);
+
+    // Check that the output contains correct values.
+    $xpath = '//div[@class="views-row" and div[@class="views-field views-field-id"]=:id and div[@class="views-field views-field-author"]=:author]';
+    $this->assertEqual(1, count($this->xpath($xpath, [':id' => 1, ':author' => $author1->getUsername()])));
+    $this->assertEqual(1, count($this->xpath($xpath, [':id' => 2, ':author' => $author2->getUsername()])));
+    $this->assertEqual(1, count($this->xpath($xpath, [':id' => 3, ':author' => ''])));
+  }
+
+}