extend usage of in-class cache in Tinebase_Container
[tine20] / tests / tine20 / TestCase.php
1 <?php
2 /**
3  * Tine 2.0 - http://www.tine20.org
4  * 
5  * @package     Tests
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @copyright   Copyright (c) 2013-2014 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(__FILE__) . DIRECTORY_SEPARATOR . 'TestHelper.php';
15
16 /**
17  * Test class for Calendar_Backend_Sql
18  * 
19  * @package     Tests
20  */
21 abstract class TestCase extends PHPUnit_Framework_TestCase
22 {
23     /**
24      * transaction id if test is wrapped in an transaction
25      * 
26      * @var string
27      */
28     protected $_transactionId = null;
29     
30     /**
31      * usernames to be deleted (in sync backend)
32      * 
33      * @var string
34      */
35     protected $_usernamesToDelete = array();
36     
37     /**
38      * groups (ID) to be deleted (in sync backend)
39      * 
40      * @var array
41      */
42     protected $_groupIdsToDelete = array();
43     
44     /**
45      * remove group members, too when deleting groups
46      * 
47      * @var boolean
48      */
49     protected $_removeGroupMembers = true;
50     
51     /**
52      * test personas
53      * 
54      * @var array
55      */
56     protected $_personas = array();
57     
58     /**
59      * unit in test
60      *
61      * @var Object
62      */
63     protected $_uit = null;
64     
65     /**
66      * the test user
67      *
68      * @var Tinebase_Model_FullUser
69      */
70     protected $_originalTestUser;
71     
72     /**
73      * the mailer
74      * 
75      * @var Zend_Mail_Transport_Array
76      */
77     protected static $_mailer = null;
78     
79     /**
80      * set up tests
81      */
82     protected function setUp()
83     {
84         $this->_transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());
85         
86         Addressbook_Controller_Contact::getInstance()->setGeoDataForContacts(false);
87         
88         $this->_personas = Zend_Registry::get('personas');
89         
90         $this->_originalTestUser = Tinebase_Core::getUser();
91     }
92     
93     /**
94      * tear down tests
95      */
96     protected function tearDown()
97     {
98         if (Tinebase_User::getConfiguredBackend() === Tinebase_User::LDAP) {
99             $this->_deleteUsers();
100             $this->_deleteGroups();
101         }
102         if ($this->_transactionId) {
103             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG))
104                 Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Rolling back test transaction');
105             Tinebase_TransactionManager::getInstance()->rollBack();
106         }
107         
108         Addressbook_Controller_Contact::getInstance()->setGeoDataForContacts(true);
109         
110         Tinebase_Core::set(Tinebase_Core::USER, $this->_originalTestUser);
111         
112         Tinebase_Cache_PerRequest::getInstance()->resetCache();
113     }
114     
115     /**
116      * test needs transaction
117      */
118     protected function _testNeedsTransaction()
119     {
120         if ($this->_transactionId) {
121             Tinebase_TransactionManager::getInstance()->commitTransaction($this->_transactionId);
122             $this->_transactionId = null;
123         }
124     }
125     
126     /**
127      * delete groups and their members
128      * 
129      * - also deletes groups and users in sync backends
130      */
131     protected function _deleteGroups()
132     {
133         foreach ($this->_groupIdsToDelete as $groupId) {
134             if ($this->_removeGroupMembers) {
135                 foreach (Tinebase_Group::getInstance()->getGroupMembers($groupId) as $userId) {
136                     try {
137                         Tinebase_User::getInstance()->deleteUser($userId);
138                     } catch (Exception $e) {
139                         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
140                             . ' error while deleting user: ' . $e->getMessage());
141                     }
142                 }
143             }
144             try {
145                 Tinebase_Group::getInstance()->deleteGroups($groupId);
146             } catch (Exception $e) {
147                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
148                     . ' error while deleting group: ' . $e->getMessage());
149             }
150         }
151     }
152     
153     /**
154      * delete users
155      */
156     protected function _deleteUsers()
157     {
158         foreach ($this->_usernamesToDelete as $username) {
159             try {
160                 Tinebase_User::getInstance()->deleteUser(Tinebase_User::getInstance()->getUserByLoginName($username));
161             } catch (Exception $e) {
162                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
163                     . ' error while deleting user: ' . $e->getMessage());
164             }
165         }
166     }
167
168     /**
169      * get personal container
170      * 
171      * @param string $applicationName
172      * @param Tinebase_Model_User $user
173      * @return Tinebase_Model_Container
174      */
175     protected function _getPersonalContainer($applicationName, $user = null)
176     {
177         if ($user === null) {
178             $user = Tinebase_Core::getUser();
179         }
180         
181         return Tinebase_Container::getInstance()->getPersonalContainer(
182             $user,
183             $applicationName, 
184             $user,
185             Tinebase_Model_Grants::GRANT_EDIT
186         )->getFirstRecord();
187     }
188     
189     /**
190      * get test container
191      * 
192      * @param string $applicationName
193      */
194     protected function _getTestContainer($applicationName)
195     {
196         return Tinebase_Container::getInstance()->addContainer(new Tinebase_Model_Container(array(
197             'name'           => 'PHPUnit test container',
198             'type'           => Tinebase_Model_Container::TYPE_PERSONAL,
199             'owner_id'       => Tinebase_Core::getUser(),
200             'backend'        => 'Sql',
201             'application_id' => Tinebase_Application::getInstance()->getApplicationByName($applicationName)->getId()
202         ), true));
203     }
204     
205     /**
206      * get test mail domain
207      * 
208      * @return string
209      */
210     protected function _getMailDomain()
211     {
212         $testconfig = Zend_Registry::get('testConfig');
213         return ($testconfig && isset($testconfig->maildomain)) ? $testconfig->maildomain : 'tine20.org';
214     }
215     
216     /**
217      * get test user email address
218      * 
219      * @return test user email address
220      */
221     protected function _getEmailAddress()
222     {
223         $testConfig = Zend_Registry::get('testConfig');
224         return ($testConfig->email) ? $testConfig->email : Tinebase_Core::getUser()->accountEmailAddress;
225     }
226     
227     /**
228      * lazy init of uit
229      * 
230      * @return Object
231      * 
232      * @todo fix ide object class detection for completions
233      */
234     protected function _getUit()
235     {
236         if ($this->_uit === null) {
237             $uitClass = preg_replace('/Tests{0,1}$/', '', get_class($this));
238             if (@method_exists($uitClass, 'getInstance')) {
239                 $this->_uit = call_user_func($uitClass . '::getInstance');
240             } else if (@class_exists($uitClass)) {
241                 $this->_uit = new $uitClass();
242             } else {
243                 throw new Exception('could not find class ' . $uitClass);
244             }
245         }
246         
247         return $this->_uit;
248     }
249     
250     /**
251      * get messages
252      * 
253      * @return array
254      */
255     public static function getMessages()
256     {
257         // make sure messages are sent if queue is activated
258         if (isset(Tinebase_Core::getConfig()->actionqueue)) {
259             Tinebase_ActionQueue::getInstance()->processQueue(100);
260         }
261         
262         return self::getMailer()->getMessages();
263     }
264     
265     /**
266      * get mailer
267      * 
268      * @return Zend_Mail_Transport_Abstract
269      */
270     public static function getMailer()
271     {
272         if (! self::$_mailer) {
273             self::$_mailer = Tinebase_Smtp::getDefaultTransport();
274         }
275         
276         return self::$_mailer;
277     }
278     
279     /**
280      * flush mailer (send all remaining mails first)
281      */
282     public static function flushMailer()
283     {
284         // make sure all messages are sent if queue is activated
285         if (isset(Tinebase_Core::getConfig()->actionqueue)) {
286             Tinebase_ActionQueue::getInstance()->processQueue(10000);
287         }
288         
289         self::getMailer()->flush();
290     }
291     
292     /**
293      * returns the content.xml of an ods document
294      * 
295      * @param string $filename
296      * @return SimpleXMLElement
297      */
298     protected function _getContentXML($filename)
299     {
300         $zipHandler = zip_open($filename);
301         
302         do {
303             $entry = zip_read($zipHandler);
304         } while ($entry && zip_entry_name($entry) != "content.xml");
305         
306         // open entry
307         zip_entry_open($zipHandler, $entry, "r");
308         
309         // read entry
310         $entryContent = zip_entry_read($entry, zip_entry_filesize($entry));
311         
312         $xml = simplexml_load_string($entryContent);
313         zip_close($zipHandler);
314         
315         return $xml;
316     }
317     
318     /**
319      * get test temp file
320      * 
321      * @return Tinebase_TempFile
322      */
323     protected function _getTempFile()
324     {
325         $tempFileBackend = new Tinebase_TempFile();
326         $tempFile = $tempFileBackend->createTempFile(dirname(__FILE__) . '/Filemanager/files/test.txt');
327         return $tempFile;
328     }
329 }