Version 1
[yaffs-website] / web / core / modules / node / src / Tests / Views / NodeContextualLinksTest.php
diff --git a/web/core/modules/node/src/Tests/Views/NodeContextualLinksTest.php b/web/core/modules/node/src/Tests/Views/NodeContextualLinksTest.php
new file mode 100644 (file)
index 0000000..dc23d0c
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+namespace Drupal\node\Tests\Views;
+
+use Drupal\Component\Serialization\Json;
+use Drupal\user\Entity\User;
+
+/**
+ * Tests views contextual links on nodes.
+ *
+ * @group node
+ */
+class NodeContextualLinksTest extends NodeTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['contextual'];
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_contextual_links'];
+
+  /**
+   * Tests contextual links.
+   */
+  public function testNodeContextualLinks() {
+    $this->drupalCreateContentType(['type' => 'page']);
+    $this->drupalCreateNode(['promote' => 1]);
+    $this->drupalGet('node');
+
+    $user = $this->drupalCreateUser(['administer nodes', 'access contextual links']);
+    $this->drupalLogin($user);
+
+    $response = $this->renderContextualLinks(['node:node=1:'], 'node');
+    $this->assertResponse(200);
+    $json = Json::decode($response);
+    $this->setRawContent($json['node:node=1:']);
+
+    // @todo Add these back when the functionality for making Views displays
+    //   appear in contextual links is working again.
+    // $this->assertLinkByHref('node/1/contextual-links', 0, 'The contextual link to the view was found.');
+    // $this->assertLink('Test contextual link', 0, 'The contextual link to the view was found.');
+  }
+
+  /**
+   * Get server-rendered contextual links for the given contextual link ids.
+   *
+   * Copied from \Drupal\contextual\Tests\ContextualDynamicContextTest::renderContextualLinks().
+   *
+   * @param array $ids
+   *   An array of contextual link ids.
+   * @param string $current_path
+   *   The Drupal path for the page for which the contextual links are rendered.
+   *
+   * @return string
+   *   The response body.
+   */
+  protected function renderContextualLinks($ids, $current_path) {
+    // Build POST values.
+    $post = [];
+    for ($i = 0; $i < count($ids); $i++) {
+      $post['ids[' . $i . ']'] = $ids[$i];
+    }
+
+    // Serialize POST values.
+    foreach ($post as $key => $value) {
+      // Encode according to application/x-www-form-urlencoded
+      // Both names and values needs to be urlencoded, according to
+      // http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
+      $post[$key] = urlencode($key) . '=' . urlencode($value);
+    }
+    $post = implode('&', $post);
+
+    // Perform HTTP request.
+    return $this->curlExec([
+      CURLOPT_URL => \Drupal::url('contextual.render', [], ['absolute' => TRUE, 'query' => ['destination' => $current_path]]),
+      CURLOPT_POST => TRUE,
+      CURLOPT_POSTFIELDS => $post,
+      CURLOPT_HTTPHEADER => [
+        'Accept: application/json',
+        'Content-Type: application/x-www-form-urlencoded',
+      ],
+    ]);
+  }
+
+  /**
+   * Tests if the node page works if Contextual Links is disabled.
+   *
+   * All views have Contextual links enabled by default, even with the
+   * Contextual links module disabled. This tests if no calls are done to the
+   * Contextual links module by views when it is disabled.
+   *
+   * @see https://www.drupal.org/node/2379811
+   */
+  public function testPageWithDisabledContextualModule() {
+    \Drupal::service('module_installer')->uninstall(['contextual']);
+    \Drupal::service('module_installer')->install(['views_ui']);
+
+    // Ensure that contextual links don't get called for admin users.
+    $admin_user = User::load(1);
+    $admin_user->setPassword('new_password');
+    $admin_user->pass_raw = 'new_password';
+    $admin_user->save();
+
+    $this->drupalCreateContentType(['type' => 'page']);
+    $this->drupalCreateNode(['promote' => 1]);
+
+    $this->drupalLogin($admin_user);
+    $this->drupalGet('node');
+  }
+
+}