From 7b11bd27e26eb6e79591b78f5886ed83c622bd25 Mon Sep 17 00:00:00 2001 From: Sunil Pawar Date: Fri, 27 Nov 2020 13:38:39 +0530 Subject: [PATCH] added test case, ts for help text in setting file, changed static variable logic --- CRM/Core/BAO/Country.php | 34 +++++++-------- CRM/Core/Config/MagicMerge.php | 1 + settings/Localization.setting.php | 2 +- tests/phpunit/CRM/Core/BAO/AddressTest.php | 49 ++++++++++++++++++++++ 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/CRM/Core/BAO/Country.php b/CRM/Core/BAO/Country.php index 159959780c..d81958f09d 100644 --- a/CRM/Core/BAO/Country.php +++ b/CRM/Core/BAO/Country.php @@ -101,19 +101,21 @@ class CRM_Core_BAO_Country extends CRM_Core_DAO_Country { * @return array */ public static function pinnedContactCountries($availableCountries) { - static $cachedPinnedContactCountries = []; - $pinnedContactCountries = Civi::settings()->get('pinnedContactCountries'); - - if (!empty($pinnedContactCountries) && !$cachedPinnedContactCountries) { + if (!isset(Civi::$statics[__CLASS__]['cachedPinnedContactCountries'])) { + $pinnedContactCountries = Civi::settings()->get('pinnedContactCountries'); $pinnedCountries = []; - foreach($pinnedContactCountries as $pinnedContactCountry) { - if (array_key_exists($pinnedContactCountry, $availableCountries)) { - $pinnedCountries[$pinnedContactCountry] = $availableCountries[$pinnedContactCountry]; + if (!empty($pinnedContactCountries)) { + foreach ($pinnedContactCountries as $pinnedContactCountry) { + // pinned country must exist in available country list. + if (array_key_exists($pinnedContactCountry, $availableCountries)) { + $pinnedCountries[$pinnedContactCountry] = $availableCountries[$pinnedContactCountry]; + } } } - $cachedPinnedContactCountries = $pinnedCountries; + Civi::$statics[__CLASS__]['cachedPinnedContactCountries'] = $pinnedCountries; } - return $cachedPinnedContactCountries; + + return Civi::$statics[__CLASS__]['cachedPinnedContactCountries']; } /** @@ -134,17 +136,13 @@ class CRM_Core_BAO_Country extends CRM_Core_DAO_Country { $availableCountries = CRM_Utils_Array::asort($availableCountries); } $pinnedContactCountries = CRM_Core_BAO_Country::pinnedContactCountries($availableCountries); - // if default country is set, percolate it to the top - if ($defaultContactCountry = CRM_Core_BAO_Country::defaultContactCountry()) { - $countryIsoCodes = CRM_Core_PseudoConstant::countryIsoCode(); - $defaultID = array_search($defaultContactCountry, $countryIsoCodes); - if ($defaultID !== FALSE) { - $default = []; - $default[$defaultID] = $availableCountries[$defaultID] ?? NULL; - $availableCountries = $default + $pinnedContactCountries + $availableCountries; - } + // if default country is set, percolate it to the top, then pinned countries and then remaining available countries. + if ($defaultContactCountry = Civi::settings()->get('defaultContactCountry')) { + $default = [$defaultContactCountry => $availableCountries[$defaultContactCountry] ?? NULL]; + $availableCountries = $default + $pinnedContactCountries + $availableCountries; } elseif (!empty($pinnedContactCountries)) { + // if default country is missing then use only pinned countries at the top then rest of the countries. $availableCountries = $pinnedContactCountries + $availableCountries; } diff --git a/CRM/Core/Config/MagicMerge.php b/CRM/Core/Config/MagicMerge.php index 6050c22a2d..ab9ef82867 100644 --- a/CRM/Core/Config/MagicMerge.php +++ b/CRM/Core/Config/MagicMerge.php @@ -120,6 +120,7 @@ class CRM_Core_Config_MagicMerge { // renamed. 'debug' => ['setting', 'debug_enabled'], 'defaultContactCountry' => ['setting'], + 'pinnedContactCountries' => ['setting'], 'defaultContactStateProvince' => ['setting'], 'defaultCurrency' => ['setting'], 'defaultSearchProfileID' => ['setting'], diff --git a/settings/Localization.setting.php b/settings/Localization.setting.php index c48417fd92..6854b52259 100644 --- a/settings/Localization.setting.php +++ b/settings/Localization.setting.php @@ -546,7 +546,7 @@ return [ 'is_domain' => 1, 'is_contact' => 0, 'description' => ts('Appear in Top section of select list'), - 'help_text' => 'Selected countries will appear in top section of country list', + 'help_text' => ts('Selected countries will appear in top section of country list'), 'pseudoconstant' => [ 'callback' => 'CRM_Admin_Form_Setting_Localization::getAvailableCountries', ], diff --git a/tests/phpunit/CRM/Core/BAO/AddressTest.php b/tests/phpunit/CRM/Core/BAO/AddressTest.php index 707df1e148..4236dcff92 100644 --- a/tests/phpunit/CRM/Core/BAO/AddressTest.php +++ b/tests/phpunit/CRM/Core/BAO/AddressTest.php @@ -644,4 +644,53 @@ class CRM_Core_BAO_AddressTest extends CiviUnitTestCase { } + /** + * Pinned countries with Default country + */ + public function testPinnedCountriesWithDefaultCountry() { + // Guyana, Netherlands, United States + $pinnedCountries = ['1093', '1152', '1228']; + + // set default country to Netherlands + $this->callAPISuccess('Setting', 'create', ['defaultContactCountry' => 1152, 'pinnedContactCountries' => $pinnedCountries]); + // get the list of country + $availableCountries = CRM_Core_PseudoConstant::country(FALSE, FALSE); + // get the order of country id using their keys + $availableCountries = array_keys($availableCountries); + + // default country is set, so first country should be Netherlands, then rest from pinned countries. + + // Netherlands + $this->assertEquals(1152, $availableCountries[0]); + // Guyana + $this->assertEquals(1093, $availableCountries[1]); + // United States + $this->assertEquals(1228, $availableCountries[2]); + } + + /** + * Pinned countries with out Default country + */ + public function testPinnedCountriesWithOutDefaultCountry() { + // Guyana, Netherlands, United States + $pinnedCountries = ['1093', '1152', '1228']; + + // unset default country + $this->callAPISuccess('Setting', 'create', ['defaultContactCountry' => NULL, 'pinnedContactCountries' => $pinnedCountries]); + + // get the list of country + $availableCountries = CRM_Core_PseudoConstant::country(FALSE, FALSE); + // get the order of country id using their keys + $availableCountries = array_keys($availableCountries); + + // no default country, so sequnece should be present as per pinned countries. + + // Guyana + $this->assertEquals(1093, $availableCountries[0]); + // Netherlands + $this->assertEquals(1152, $availableCountries[1]); + // United States + $this->assertEquals(1228, $availableCountries[2]); + } + } -- 2.25.1