60b2ba8b8587b85d83f784d1121970bec00e0ad8
[tine20] / tests / tine20 / Tinebase / ConfigTest.php
1 <?php
2 /**
3  * Tine 2.0 - http://www.tine20.org
4  * 
5  * @package     Tinebase
6  * @license     http://www.gnu.org/licenses/agpl.html
7  * @copyright   Copyright (c) 2008-2015 Metaways Infosystems GmbH (http://www.metaways.de)
8  * @author      Philipp Schüle <p.schuele@metaways.de>
9  */
10
11 /**
12  * Test helper
13  */
14 require_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'TestHelper.php';
15
16 /**
17  * Test class for Tinebase_Config
18  */
19 class Tinebase_ConfigTest extends PHPUnit_Framework_TestCase
20 {
21     /**
22      * unit under test (UIT)
23      *
24      * @var Tinebase_Config
25      */
26     protected $_instance;
27
28     /**
29      * @var array test objects
30      */
31     protected $objects = array();
32
33     protected $_filenamesToDelete = array();
34
35     /**
36      * Sets up the fixture.
37      * This method is called before a test is executed.
38      *
39      * @access protected
40      */
41     protected function setUp()
42     {
43         $this->_instance = Tinebase_Config::getInstance();
44     }
45
46     /**
47      * Tears down the fixture
48      * This method is called after a test is executed.
49      *
50      * @access protected
51      */
52     protected function tearDown()
53     {
54         foreach ($this->_filenamesToDelete as $filename) {
55             unlink($filename);
56         }
57
58         Tinebase_Config::getInstance()->clearCache();
59     }
60
61     /**
62      * test instance retrival
63      *
64      */
65     public function testConfigInstance()
66     {
67         $this->assertTrue($this->_instance === Tinebase_Core::getConfig(), 'Tinebase_Core::getConfig() is wrong instance');
68     }
69
70     /**
71      * test basic config getting/setting/deleting cycle
72      */
73     public function testSetDeleteConfig()
74     {
75         $this->_instance->set(Tinebase_Config::PAGETITLEPOSTFIX, 'phpunit');
76         $this->assertEquals('phpunit', $this->_instance->{Tinebase_Config::PAGETITLEPOSTFIX}, 'could not set config');
77
78         $this->_instance->delete(Tinebase_Config::PAGETITLEPOSTFIX);
79
80         $this->assertEquals('###PHPUNIT-NOTSET###', $this->_instance->get(Tinebase_Config::PAGETITLEPOSTFIX, '###PHPUNIT-NOTSET###'), 'config got not deleted');
81
82         $this->assertFalse(isset($this->_instance->{Tinebase_Config::PAGETITLEPOSTFIX}), '__isset not working');
83     }
84
85     /**
86      * test if config from config.inc.php overwrites config in db
87      *
88      */
89     public function testConfigFromFileOverwrites()
90     {
91         /** @noinspection PhpIncludeInspection */
92         $configData = include('config.inc.php');
93
94         if (!(isset($configData['Overwrite Test']) || array_key_exists('Overwrite Test', $configData))) {
95             $this->markTestSkipped('config.inc.php has no test key "Overwrite Test"');
96             return;
97         }
98
99         $overwrittenValue = Tinebase_Record_Abstract::generateUID();
100         $this->_instance->{'Overwrite Test'} = $overwrittenValue;
101
102         $this->assertEquals($configData['Overwrite Test'], $this->_instance->{'Overwrite Test'});
103
104         $this->_instance->delete('Overwrite Test');
105     }
106
107     /**
108      * test get config from config.inc.php
109      *
110      */
111     public function testGetConfigFromFile()
112     {
113         $dbConfig = $this->_instance->database;
114
115         $this->assertGreaterThan(0, count($dbConfig), 'could not get db config');
116         $this->assertTrue($dbConfig['dbname'] != '', 'could not get dbname');
117     }
118
119     /**
120      * test config value is a struct
121      *
122      */
123     public function testConfigTypeStruct()
124     {
125         $dbConfig = $this->_instance->database;
126
127         $this->assertTrue($dbConfig instanceof Tinebase_Config_Struct, 'db config is not a struct');
128         $this->assertTrue($dbConfig['dbname'] != '', 'could not get dbname via arrayAccess');
129         $this->assertTrue($dbConfig->dbname != '', 'could not get dbname via objectAccess');
130     }
131
132     /**
133      * test client config retrival
134      *
135      */
136     public function testGetClientRegistryConfig()
137     {
138         $clientConfig = $this->_instance->getClientRegistryConfig();
139         $this->assertTrue($clientConfig instanceof Tinebase_Config_Struct, 'clientconfig is not a struct');
140         $this->assertTrue($clientConfig->Calendar instanceof Tinebase_Config_Struct, 'calendar clientconfig is not a struct');
141         $this->assertEquals(Calendar_Config::getInstance()->fixedCalendars, $clientConfig->Calendar->fixedCalendars->value, 'fixed calendar config not correct');
142
143         $this->assertFalse((isset($clientConfig->Tinebase['SMTP']) || array_key_exists('SMTP', $clientConfig->Tinebase)), 'SMTP is not a client config');
144     }
145
146     /**
147      * test if config returns empty array if it's empty
148      */
149     public function testReturnEmptyValue()
150     {
151         // Hold original value for further tests of sieve.
152         $keepOriginalValue = $this->_instance->get("sieve");
153
154         // Ensure  sieve key is null
155         $this->_instance->set("sieve", null);
156
157         // If key is null it throws an exception, so return empty array if it's null.
158         $this->assertTrue($this->_instance->get("sieve") instanceof Tinebase_Config_Struct, 'sieve is: ' . print_r($this->_instance->get("sieve"), true));
159
160         // Check common function of the getFunction
161         $this->assertTrue(is_numeric($this->_instance->get("acceptedTermsVersion")));
162
163         // restore value
164         $this->_instance->set("sieve", $keepOriginalValue);
165     }
166
167     /**
168      * testApplicationDefaultConfig
169      */
170     public function testApplicationDefaultConfig()
171     {
172         $defaultConfigFile = $this->_getExampleApplicationCustomDefaultConfig();
173
174         $this->assertFalse(file_exists($defaultConfigFile), 'test needs to be recoded because Example Application default config exists');
175
176         $exampleString = ExampleApplication_Config::getInstance()->get(ExampleApplication_Config::EXAMPLE_STRING);
177         $this->assertEquals(ExampleApplication_Config::EXAMPLE_STRING, $exampleString);
178
179         copy(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR . 'configtest.inc.php', $defaultConfigFile);
180         $this->_filenamesToDelete[] = $defaultConfigFile;
181
182         ExampleApplication_Config::getInstance()->clearCache();
183
184         $exampleString = ExampleApplication_Config::getInstance()->get(ExampleApplication_Config::EXAMPLE_STRING);
185         $this->assertEquals('something else', $exampleString);
186     }
187
188     protected function _getExampleApplicationCustomDefaultConfig()
189     {
190         return dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'tine20'
191         . DIRECTORY_SEPARATOR . 'ExampleApplication' . DIRECTORY_SEPARATOR . 'config.inc.php';
192     }
193
194     /**
195      * testFeatureEnabled
196      *
197      * @see 0010756: add feature switches for easy enabling/disabling of features
198      */
199     public function testFeatureEnabled()
200     {
201         $customConfigFilename = $this->_getExampleApplicationCustomDefaultConfig();
202
203         $this->assertFalse(file_exists($customConfigFilename), 'test needs to be recoded because Example Application default config exists');
204
205         $exampleFeatureEnabled = ExampleApplication_Config::getInstance()->featureEnabled(ExampleApplication_Config::EXAMPLE_FEATURE);
206
207         $this->assertTrue($exampleFeatureEnabled);
208     }
209
210     /**
211      * testComposeConfigDir
212      *
213      * @see 0010988: load additional config from conf.d
214      */
215     public function testComposeConfigDir()
216     {
217         $confdfolder = Tinebase_Config::getInstance()->get(Tinebase_Config::CONFD_FOLDER);
218         if (empty($confdfolder) || !is_readable($confdfolder)) {
219             $this->markTestSkipped('no confdfolder configured/readable');
220         }
221
222         $configValues = array('config1' => 'value1', 'config2' => 'value2');
223         foreach ($configValues as $configName => $expectedValue) {
224             $configValue = Tinebase_Config::getInstance()->get($configName);
225             $this->assertEquals($expectedValue, $configValue);
226         }
227
228         $cachedConfigFilename = Tinebase_Core::guessTempDir() . DIRECTORY_SEPARATOR . 'cachedConfig.inc.php';
229         $this->assertTrue(file_exists($cachedConfigFilename), 'cached config file does not exist: ' . $cachedConfigFilename);
230     }
231
232     /**
233      * @see 0011456: unable to add new activesync-devices in tine20
234      */
235     public function testDefaultNull()
236     {
237         // TODO maybe we need to remove the current config if is set
238         $defaultPolicy = ActiveSync_Config::getInstance()->get(ActiveSync_Config::DEFAULT_POLICY, null);
239         $this->assertTrue(is_null($defaultPolicy), 'config should be null: ' . var_export($defaultPolicy, true));
240     }
241
242     /**
243      * set + get bool config
244      */
245     public function testBoolConfig()
246     {
247         Tinebase_Config::getInstance()->set(Tinebase_Config::USE_LOGINNAME_AS_FOLDERNAME, true);
248
249         $this->assertEquals(true, Tinebase_Config::getInstance()->get(Tinebase_Config::USE_LOGINNAME_AS_FOLDERNAME));
250     }
251
252     /**
253      * set + get array config
254      */
255     public function testArrayConfig()
256     {
257         Tinebase_Config::getInstance()->set(Tinebase_Config::ALLOWEDJSONORIGINS, array("www.test.de", "www.tine20.net"));
258         $this->assertEquals(array("www.test.de", "www.tine20.net"), Tinebase_Core::getConfig()->get(Tinebase_Config::ALLOWEDJSONORIGINS, array()));
259     }
260
261     public function testConfigStructure()
262     {
263         $exampleConfig = ExampleApplication_Config::getInstance();
264
265         $defaultConfigFile = dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'tine20'
266             . DIRECTORY_SEPARATOR . 'ExampleApplication' . DIRECTORY_SEPARATOR . 'config.inc.php';
267
268         $this->assertFalse(file_exists($defaultConfigFile), 'test needs to be recoded because ExampleApplication default config exists');
269
270         copy(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR . 'configExampleAppTest.inc.php', $defaultConfigFile);
271         $this->_filenamesToDelete[] = $defaultConfigFile;
272
273         $exampleConfig->clearCache();
274
275         $smtpStruct = $exampleConfig->{ExampleApplication_Config::EXAMPLE_MAILCONFIG}->{ExampleApplication_Config::SMTP};
276         $imapStruct = $exampleConfig->{ExampleApplication_Config::EXAMPLE_MAILCONFIG}->{ExampleApplication_Config::IMAP};
277
278         $this->assertTrue($smtpStruct instanceof Tinebase_Config_Struct);
279         $this->assertTrue(is_string($smtpStruct->{ExampleApplication_Config::HOST}) && $smtpStruct->{ExampleApplication_Config::HOST} === 'localhost');
280         $this->assertTrue(is_int($smtpStruct->{ExampleApplication_Config::PORT}) && $smtpStruct->{ExampleApplication_Config::PORT} === 123);
281         $this->assertTrue(is_bool($smtpStruct->{ExampleApplication_Config::SSL}) && $smtpStruct->{ExampleApplication_Config::SSL} === true);
282
283         $this->assertTrue($imapStruct instanceof Tinebase_Config_Struct);
284         $this->assertTrue(is_string($imapStruct->{ExampleApplication_Config::HOST}) && $imapStruct->{ExampleApplication_Config::HOST} === '123');
285         $this->assertTrue(is_int($imapStruct->{ExampleApplication_Config::PORT}) && $imapStruct->{ExampleApplication_Config::PORT} === 999);
286         $this->assertTrue(is_bool($imapStruct->{ExampleApplication_Config::SSL}) && $imapStruct->{ExampleApplication_Config::SSL} === true);
287
288         $this->setExpectedException('Tinebase_Exception_InvalidArgument');
289         $imapStruct->shooo;
290     }
291 }