Fix option group caching issue.
authoreileen <emcnaughton@wikimedia.org>
Sun, 12 Aug 2018 07:16:12 +0000 (19:16 +1200)
committereileen <emcnaughton@wikimedia.org>
Sun, 12 Aug 2018 08:36:09 +0000 (20:36 +1200)
Per https://lab.civicrm.org/dev/core/issues/304 in some cases the api
cache has already been built so adding a new option_group
is not picked up causing a crash

api/v3/OptionGroup.php
tests/phpunit/CRM/Core/BAO/OptionGroupTest.php [new file with mode: 0644]

index 24822c85205e0b63b1072471d4cba37cab7a0448..f86c3a21bbb90f013ed75d283b1ad2e2b142e90c 100644 (file)
@@ -53,7 +53,9 @@ function civicrm_api3_option_group_get($params) {
  * @return array
  */
 function civicrm_api3_option_group_create($params) {
-  return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params, 'OptionGroup');
+  $result = _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params, 'OptionGroup');
+  civicrm_api('option_value', 'getfields', array('version' => 3, 'cache_clear' => 1));
+  return $result;
 }
 
 /**
diff --git a/tests/phpunit/CRM/Core/BAO/OptionGroupTest.php b/tests/phpunit/CRM/Core/BAO/OptionGroupTest.php
new file mode 100644 (file)
index 0000000..d4c9894
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5                                                  |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2018                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Class CRM_Core_BAO_SchemaHandlerTest.
+ *
+ * These tests create and drop indexes on the civicrm_uf_join table. The indexes
+ * being added and dropped we assume will never exist.
+ * @group headless
+ */
+class CRM_Core_BAO_OptionGroupTest extends CiviUnitTestCase {
+
+  /**
+   * Test setup for every test.
+   */
+  public function setUp() {
+    parent::setUp();
+    $this->useTransaction(TRUE);
+  }
+
+  /**
+   * Ensure only one option value exists after calling ensureOptionValueExists.
+   */
+  public function testEnsureOptionGroupExistsExistingValue() {
+    CRM_Core_BAO_OptionGroup::ensureOptionGroupExists(array('name' => 'contribution_status'));
+    $this->callAPISuccessGetSingle('OptionGroup', array('name' => 'contribution_status'));
+  }
+
+  /**
+   * Ensure only one option value exists adds a new value.
+   */
+  public function testEnsureOptionGroupExistsNewValue() {
+    CRM_Core_BAO_OptionGroup::ensureOptionGroupExists(array('name' => 'Bombed'));
+    $optionGroups = $this->callAPISuccess('OptionValue', 'getoptions', array('field' => 'option_group_id'))['values'];
+    $this->assertTrue(in_array('Bombed', $optionGroups));
+
+    CRM_Core_BAO_OptionGroup::ensureOptionGroupExists(array('name' => 'Bombed Again'));
+    $optionGroups = $this->callAPISuccess('OptionValue', 'getoptions', array('field' => 'option_group_id'))['values'];
+    $this->assertTrue(in_array('Bombed Again', $optionGroups));
+  }
+
+}