Merge branch '2015.11-develop' into 2016.11
[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      * @var Tinebase_Config
24      */
25     protected $_instance;
26
27     /**
28      * @var array test objects
29      */
30     protected $objects = array();
31
32     protected $_filenamesToDelete = array();
33     
34     /**
35      * Sets up the fixture.
36      * This method is called before a test is executed.
37      *
38      * @access protected
39      */
40     protected function setUp()
41     {
42         $this->_instance = Tinebase_Config::getInstance();
43     }
44
45     /**
46      * Tears down the fixture
47      * This method is called after a test is executed.
48      *
49      * @access protected
50      */
51     protected function tearDown()
52     {
53         foreach ($this->_filenamesToDelete as $filename) {
54             unlink($filename);
55         }
56
57         Tinebase_Config::getInstance()->clearCache();
58     }
59     
60     /**
61      * test instance retrival
62      * 
63      */
64     public function testConfigInstance()
65     {
66         $this->assertTrue($this->_instance === Tinebase_Core::getConfig(), 'Tinebase_Core::getConfig() is wrong instance');
67     }
68     
69     /**
70      * test basic config getting/setting/deleting cycle
71      */
72     public function testSetDeleteConfig()
73     {
74         $this->_instance->set(Tinebase_Config::PAGETITLEPOSTFIX, 'phpunit');
75         $this->assertEquals('phpunit', $this->_instance->{Tinebase_Config::PAGETITLEPOSTFIX}, 'could not set config');
76         
77         $this->_instance->delete(Tinebase_Config::PAGETITLEPOSTFIX, 'phpunit');
78         
79         $this->assertEquals('###PHPUNIT-NOTSET###', $this->_instance->get(Tinebase_Config::PAGETITLEPOSTFIX, '###PHPUNIT-NOTSET###'), 'config got not deleted');
80         
81         $this->assertFalse(isset($this->_instance->{Tinebase_Config::PAGETITLEPOSTFIX}), '__isset not working');
82     }
83     
84     /**
85      * test if config from config.inc.php overwrites config in db
86      *
87      */
88     public function testConfigFromFileOverwrites()
89     {
90         $configData = include('config.inc.php');
91         
92         if (! (isset($configData['Overwrite Test']) || array_key_exists('Overwrite Test', $configData))) {
93             $this->markTestSkipped('config.inc.php has no test key "Overwrite Test"');
94             return;
95         }
96         
97         $overwrittenValue = Tinebase_Record_Abstract::generateUID();
98         $this->_instance->{'Overwrite Test'} = $overwrittenValue;
99         
100         $this->assertEquals($configData['Overwrite Test'], $this->_instance->{'Overwrite Test'});
101         
102         $this->_instance->delete('Overwrite Test');
103     }
104     
105     /**
106      * test get config from config.inc.php
107      *
108      */
109     public function testGetConfigFromFile()
110     {
111         $dbConfig = $this->_instance->database;
112         
113         $this->assertGreaterThan(0, count($dbConfig), 'could not get db config');
114         $this->assertTrue($dbConfig['dbname'] != '', 'could not get dbname');
115     }
116     
117     /**
118      * test config value is a struct
119      *
120      */
121     public function testConfigTypeStruct()
122     {
123         $dbConfig = $this->_instance->database;
124         
125         $this->assertTrue($dbConfig instanceof Tinebase_Config_Struct, 'db config is not a struct');
126         $this->assertTrue($dbConfig['dbname'] != '', 'could not get dbname via arrayAccess');
127         $this->assertTrue($dbConfig->dbname != '', 'could not get dbname via objectAccess');
128     }
129     
130     /**
131      * test client config retrival
132      * 
133      */
134     public function testGetClientRegistryConfig()
135     {
136         $clientConfig = $this->_instance->getClientRegistryConfig();
137         $this->assertTrue($clientConfig instanceof Tinebase_Config_Struct, 'clientconfig is not a struct');
138         $this->assertTrue($clientConfig->Calendar instanceof Tinebase_Config_Struct, 'calendar clientconfig is not a struct');
139         $this->assertEquals(Calendar_Config::getInstance()->fixedCalendars, $clientConfig->Calendar->fixedCalendars->value, 'fixed calendar config not correct');
140         
141         $this->assertFalse((isset($clientConfig->Tinebase['SMTP']) || array_key_exists('SMTP', $clientConfig->Tinebase)), 'SMTP is not a client config');
142     }
143     
144     /**
145      * test if config returns empty array if it's empty
146      */
147     public function testReturnEmptyValue()
148     {
149         // Hold original value for further tests of sieve.
150         $keepOriginalValue = $this->_instance->get("sieve");
151         
152         // Ensure  sieve key is null
153         $this->_instance->set("sieve", null);
154         
155         // If key is null it throws an exception, so return empty array if it's null.
156         $this->assertTrue($this->_instance->get("sieve") instanceof Tinebase_Config_Struct);
157         
158         // Check common function of the getFunction
159         $this->assertTrue(is_numeric($this->_instance->get("acceptedTermsVersion")));
160         
161         // restore value
162         $this->_instance->set("sieve", $keepOriginalValue);
163     }
164     
165     /**
166      * testApplicationDefaultConfig
167      */
168     public function testApplicationDefaultConfig()
169     {
170         $defaultConfigFile = $this->_getSalesCustomDefaultConfig();
171         
172         if (file_exists($defaultConfigFile)) {
173             $this->markTestSkipped('ignore test because Sales default config exists');
174         }
175         
176         $ignoreBillablesConfig = Sales_Config::getInstance()->get(Sales_Config::IGNORE_BILLABLES_BEFORE);
177         $this->assertEquals('2000-01-01 22:00:00', $ignoreBillablesConfig);
178         
179         copy(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR . 'configtest.inc.php', $defaultConfigFile);
180         $this->_filenamesToDelete[] = $defaultConfigFile;
181
182         Sales_Config::getInstance()->clearCache();
183         
184         $ignoreBillablesConfigAppDefault = Sales_Config::getInstance()->get(Sales_Config::IGNORE_BILLABLES_BEFORE);
185         $this->assertEquals('1999-10-01 22:00:00', $ignoreBillablesConfigAppDefault);
186     }
187     
188     protected function _getSalesCustomDefaultConfig()
189     {
190         return dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'tine20'
191             . DIRECTORY_SEPARATOR . 'Sales' . 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->_getSalesCustomDefaultConfig();
202         if (file_exists($customConfigFilename)) {
203             $this->markTestSkipped('do not test with existing custom config');
204         }
205         
206         $invoicesFeatureEnabled = Sales_Config::getInstance()->featureEnabled(Sales_Config::FEATURE_INVOICES_MODULE);
207         
208         $this->assertTrue($invoicesFeatureEnabled);
209     }
210
211     /**
212      * testComposeConfigDir
213      *
214      * @see 0010988: load additional config from conf.d
215      */
216     public function testComposeConfigDir()
217     {
218         $confdfolder = Tinebase_Config::getInstance()->get(Tinebase_Config::CONFD_FOLDER);
219         if (empty($confdfolder) || ! is_readable($confdfolder)) {
220             $this->markTestSkipped('no confdfolder configured/readable');
221         }
222
223         $configValues = array('config1' => 'value1', 'config2' => 'value2');
224         foreach ($configValues as $configName => $expectedValue) {
225             $configValue = Tinebase_Config::getInstance()->get($configName);
226             $this->assertEquals($expectedValue, $configValue);
227         }
228
229         $cachedConfigFilename = Tinebase_Core::guessTempDir() . DIRECTORY_SEPARATOR . 'cachedConfig.inc.php';
230         $this->assertTrue(file_exists($cachedConfigFilename), 'cached config file does not exist: ' . $cachedConfigFilename);
231     }
232
233     /**
234      * @see 0011456: unable to add new activesync-devices in tine20
235      */
236     public function testDefaultNull()
237     {
238         // TODO maybe we need to remove the current config if is set
239         $defaultPolicy = ActiveSync_Config::getInstance()->get(ActiveSync_Config::DEFAULT_POLICY, null);
240         $this->assertTrue(is_null($defaultPolicy), 'config should be null: ' . var_export($defaultPolicy, true));
241     }
242 }