Merge pull request #17144 from lcdservices/dev-core-1716
[civicrm-core.git] / tests / phpunit / Civi / Core / SettingsManagerTest.php
1 <?php
2 namespace Civi\Core;
3
4 class SettingsManagerTest extends \CiviUnitTestCase {
5
6 protected $domainDefaults;
7 protected $contactDefaults;
8 protected $mandates;
9 protected $origSetting;
10
11 protected function setUp() {
12 $this->origSetting = $GLOBALS['civicrm_setting'];
13
14 parent::setUp();
15 $this->useTransaction(TRUE);
16
17 $this->domainDefaults = [
18 'd1' => 'alpha',
19 'd2' => 'beta',
20 'd3' => 'gamma',
21 'myrelpath' => 'foo',
22 'myabspath' => '/tmp/bar',
23 'myrelurl' => 'sites/foo',
24 'myabsurl' => 'http://example.com/bar',
25 ];
26 $this->contactDefaults = [
27 'c1' => 'alpha',
28 'c2' => 'beta',
29 'c3' => 'gamma',
30 ];
31 $this->mandates = [
32 'Mailing Preferences' => [
33 'd3' => 'GAMMA!',
34 ],
35 'contact' => [
36 'c3' => 'GAMMA MAN!',
37 ],
38 ];
39 }
40
41 public function tearDown() {
42 $GLOBALS['civicrm_setting'] = $this->origSetting;
43 parent::tearDown();
44 }
45
46 /**
47 * Test mingled reads/writes of settings for two different domains.
48 */
49 public function testTwoDomains() {
50 $da = \CRM_Core_DAO::createTestObject('CRM_Core_DAO_Domain');
51 $db = \CRM_Core_DAO::createTestObject('CRM_Core_DAO_Domain');
52
53 $manager = $this->createManager()->useDefaults();
54
55 $daSettings = $manager->getBagByDomain($da->id);
56 $daSettings->set('d1', 'un');
57 $this->assertEquals('un', $daSettings->get('d1'));
58 $this->assertEquals('beta', $daSettings->get('d2'));
59 $this->assertEquals('GAMMA!', $daSettings->get('d3'));
60
61 $dbSettings = $manager->getBagByDomain($db->id);
62 $this->assertEquals('alpha', $dbSettings->get('d1'));
63 $this->assertEquals('beta', $dbSettings->get('d2'));
64 $this->assertEquals('GAMMA!', $dbSettings->get('d3'));
65
66 $managerRedux = $this->createManager()->useDefaults();
67
68 $daSettingsRedux = $managerRedux->getBagByDomain($da->id);
69 $this->assertEquals('un', $daSettingsRedux->get('d1'));
70 $this->assertEquals('beta', $daSettingsRedux->get('d2'));
71 $this->assertEquals('GAMMA!', $daSettingsRedux->get('d3'));
72 }
73
74 /**
75 * Test mingled reads/writes of settings for two different contacts.
76 */
77 public function testTwoContacts() {
78 $domain = \CRM_Core_DAO::createTestObject('CRM_Core_DAO_Domain');
79 $ca = \CRM_Core_DAO::createTestObject('CRM_Contact_DAO_Contact');
80 $cb = \CRM_Core_DAO::createTestObject('CRM_Contact_DAO_Contact');
81
82 $manager = $this->createManager()->useDefaults();
83
84 $caSettings = $manager->getBagByContact($domain->id, $ca->id);
85 $caSettings->set('c1', 'un');
86 $this->assertEquals('un', $caSettings->get('c1'));
87 $this->assertEquals('beta', $caSettings->get('c2'));
88 $this->assertEquals('GAMMA MAN!', $caSettings->get('c3'));
89
90 $cbSettings = $manager->getBagByContact($domain->id, $cb->id);
91 $this->assertEquals('alpha', $cbSettings->get('c1'));
92 $this->assertEquals('beta', $cbSettings->get('c2'));
93 $this->assertEquals('GAMMA MAN!', $cbSettings->get('c3'));
94
95 // Read settings from freshly initialized objects.
96 $manager = $this->createManager()->useDefaults();
97
98 $caSettingsRedux = $manager->getBagByContact($domain->id, $ca->id);
99 $this->assertEquals('un', $caSettingsRedux->get('c1'));
100 $this->assertEquals('beta', $caSettingsRedux->get('c2'));
101 $this->assertEquals('GAMMA MAN!', $caSettingsRedux->get('c3'));
102 }
103
104 public function testCrossOver() {
105 $domain = \CRM_Core_DAO::createTestObject('CRM_Core_DAO_Domain');
106 $contact = \CRM_Core_DAO::createTestObject('CRM_Contact_DAO_Contact');
107
108 $manager = $this->createManager()->useDefaults();
109
110 // Store different values for the 'monkeywrench' setting on domain and contact
111
112 $domainSettings = $manager->getBagByDomain($domain->id);
113 $domainSettings->set('monkeywrench', 'from domain');
114 $this->assertEquals('from domain', $domainSettings->get('monkeywrench'));
115
116 $contactSettings = $manager->getBagByContact($domain->id, $contact->id);
117 $contactSettings->set('monkeywrench', 'from contact');
118 $this->assertEquals('from contact', $contactSettings->get('monkeywrench'));
119
120 // Read settings from freshly initialized objects.
121 $manager = $this->createManager()->useDefaults();
122
123 $domainSettings = $manager->getBagByDomain($domain->id);
124 $this->assertEquals('from domain', $domainSettings->get('monkeywrench'));
125
126 $contactSettings = $manager->getBagByContact($domain->id, $contact->id);
127 $this->assertEquals('from contact', $contactSettings->get('monkeywrench'));
128 }
129
130 /**
131 * @return SettingsManager
132 */
133 protected function createManager() {
134 $cache = new \CRM_Utils_Cache_Arraycache([]);
135 $cache->set('defaults_domain', $this->domainDefaults);
136 $cache->set('defaults_contact', $this->contactDefaults);
137 foreach ($this->mandates as $entity => $keyValues) {
138 foreach ($keyValues as $k => $v) {
139 $GLOBALS['civicrm_setting'][$entity][$k] = $v;
140 }
141 }
142 $manager = new SettingsManager($cache);
143 return $manager;
144 }
145
146 /**
147 * Test passing in an array to Civi::settings facade
148 */
149 public function testArraySetting() {
150 $domain = \CRM_Core_DAO::createTestObject('CRM_Core_DAO_Domain');
151
152 $manager = $this->createManager()->useDefaults();
153 $dSettings = $manager->getBagByDomain($domain->id);
154 $dSettings->set('test_setting', ['hello' => 'World']);
155 $test_setting = $dSettings->get('test_setting');
156 $this->assertEquals(['hello' => 'World'], $test_setting);
157 }
158
159 }