From 2fe57efec0208b6ba304ab18b0919218b46c6ba6 Mon Sep 17 00:00:00 2001
From: Dries <dries@buytaert.net>
Date: Thu, 20 Jun 2013 14:07:44 -0400
Subject: [PATCH] Issue #2022769 by fubhy, xjm: Fixed conversion of
 field_delete_field() in hook_uninstall().

---
 core/modules/comment/comment.install          |  3 -
 .../comment/Tests/CommentUninstallTest.php    | 77 +++++++++++++++++++
 core/modules/forum/forum.install              |  5 +-
 .../Drupal/forum/Tests/ForumUninstallTest.php | 69 +++++++++++++++++
 4 files changed, 150 insertions(+), 4 deletions(-)
 create mode 100644 core/modules/comment/lib/Drupal/comment/Tests/CommentUninstallTest.php
 create mode 100644 core/modules/forum/lib/Drupal/forum/Tests/ForumUninstallTest.php

diff --git a/core/modules/comment/comment.install b/core/modules/comment/comment.install
index 936159095d97..71b2cf0556aa 100644
--- a/core/modules/comment/comment.install
+++ b/core/modules/comment/comment.install
@@ -9,9 +9,6 @@
  * Implements hook_uninstall().
  */
 function comment_uninstall() {
-  // Delete comment_body field.
-  field_info_field('comment_body')->delete();
-
   // Remove variables.
   variable_del('comment_block_count');
   $node_types = array_keys(node_type_get_types());
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentUninstallTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentUninstallTest.php
new file mode 100644
index 000000000000..48e749feef4d
--- /dev/null
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentUninstallTest.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\comment\Tests\CommentUninstallTest.
+ */
+
+namespace Drupal\comment\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests comment module uninstallation.
+ */
+class CommentUninstallTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('comment', 'node');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment uninstallation',
+      'description' => 'Tests comment module uninstallation.',
+      'group' => 'Comment',
+    );
+  }
+
+  protected function setUp() {
+    parent::setup();
+
+    // Create a content type so that the comment module creates the
+    // 'comment_body' field upon installation.
+    $this->drupalCreateContentType();
+  }
+
+  /**
+   * Tests if comment module uninstallation properly deletes the field.
+   */
+  function testCommentUninstallWithField() {
+    // Ensure that the field exists before uninstallation.
+    $field = field_info_field('comment_body');
+    $this->assertNotNull($field, 'The comment_body field exists.');
+
+    // Uninstall the comment module which should trigger field deletion.
+    $this->container->get('module_handler')->disable(array('comment'));
+    $this->container->get('module_handler')->uninstall(array('comment'));
+
+    // Check that the field is now deleted.
+    $field = field_info_field('comment_body');
+    $this->assertNull($field, 'The comment_body field has been deleted.');
+  }
+
+
+  /**
+   * Tests if uninstallation succeeds if the field has been deleted beforehand.
+   */
+  function testCommentUninstallWithoutField() {
+    // Manually delete the comment_body field before module uninstallation.
+    $field = field_info_field('comment_body');
+    $this->assertNotNull($field, 'The comment_body field exists.');
+    $field->delete();
+
+    // Check that the field is now deleted.
+    $field = field_info_field('comment_body');
+    $this->assertNull($field, 'The comment_body field has been deleted.');
+
+    // Ensure that uninstallation succeeds even if the field has already been
+    // deleted manually beforehand.
+    $this->container->get('module_handler')->disable(array('comment'));
+    $this->container->get('module_handler')->uninstall(array('comment'));
+  }
+
+}
diff --git a/core/modules/forum/forum.install b/core/modules/forum/forum.install
index f90b9665b1de..9f1609934dda 100644
--- a/core/modules/forum/forum.install
+++ b/core/modules/forum/forum.install
@@ -122,7 +122,10 @@ function forum_uninstall() {
 
   variable_del('node_options_forum');
 
-  field_info_field('taxonomy_forums')->delete();
+  if ($field = field_info_field('taxonomy_forums')) {
+    $field->delete();
+  }
+
   // Purge field data now to allow taxonomy module to be uninstalled
   // if this is the only field remaining.
   field_purge_batch(10);
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumUninstallTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumUninstallTest.php
new file mode 100644
index 000000000000..0fe25e3ae4b1
--- /dev/null
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumUninstallTest.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\forum\Tests\ForumUninstallTest.
+ */
+
+namespace Drupal\forum\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests forum module uninstallation.
+ */
+class ForumUninstallTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('forum');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Forum uninstallation',
+      'description' => 'Tests forum module uninstallation.',
+      'group' => 'Forum',
+    );
+  }
+
+  /**
+   * Tests if forum module uninstallation properly deletes the field.
+   */
+  function testForumUninstallWithField() {
+    // Ensure that the field exists before uninstallation.
+    $field = field_info_field('taxonomy_forums');
+    $this->assertNotNull($field, 'The taxonomy_forums field exists.');
+
+    // Uninstall the forum module which should trigger field deletion.
+    $this->container->get('module_handler')->disable(array('forum'));
+    $this->container->get('module_handler')->uninstall(array('forum'));
+
+    // Check that the field is now deleted.
+    $field = field_info_field('taxonomy_forums');
+    $this->assertNull($field, 'The taxonomy_forums field has been deleted.');
+  }
+
+
+  /**
+   * Tests if uninstallation succeeds if the field has been deleted beforehand.
+   */
+  function testForumUninstallWithoutField() {
+    // Manually delete the taxonomy_forums field before module uninstallation.
+    $field = field_info_field('taxonomy_forums');
+    $this->assertNotNull($field, 'The taxonomy_forums field exists.');
+    $field->delete();
+
+    // Check that the field is now deleted.
+    $field = field_info_field('taxonomy_forums');
+    $this->assertNull($field, 'The taxonomy_forums field has been deleted.');
+
+    // Ensure that uninstallation succeeds even if the field has already been
+    // deleted manually beforehand.
+    $this->container->get('module_handler')->disable(array('forum'));
+    $this->container->get('module_handler')->uninstall(array('forum'));
+  }
+
+}
-- 
GitLab