Merge branch 'pu/2013.10-caldav' into 2014.09
[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             Tinebase_TransactionManager::getInstance()->rollBack();
104         }
105         
106         Addressbook_Controller_Contact::getInstance()->setGeoDataForContacts(true);
107         
108         Tinebase_Core::set(Tinebase_Core::USER, $this->_originalTestUser);
109     }
110     
111     /**
112      * test needs transaction
113      */
114     protected function _testNeedsTransaction()
115     {
116         if ($this->_transactionId) {
117             Tinebase_TransactionManager::getInstance()->commitTransaction($this->_transactionId);
118             $this->_transactionId = null;
119         }
120     }
121     
122     /**
123      * get tag
124      *
125      * @param string $tagType
126      * @param string $tagName
127      * @param array $contexts
128      * @return Tinebase_Model_Tag
129      */
130     protected function _getTag($tagType = Tinebase_Model_Tag::TYPE_SHARED, $tagName = NULL, $contexts = NULL)
131     {
132         if ($tagName) {
133             try {
134                 $tag = Tinebase_Tags::getInstance()->getTagByName($tagName);
135                 return $tag;
136             } catch (Tinebase_Exception_NotFound $tenf) {
137             }
138         } else {
139             $tagName = Tinebase_Record_Abstract::generateUID();
140         }
141     
142         $targ = array(
143             'type'          => $tagType,
144             'name'          => $tagName,
145             'description'   => 'testTagDescription',
146             'color'         => '#009B31',
147         );
148     
149         if ($contexts) {
150             $targ['contexts'] = $contexts;
151         }
152     
153         return new Tinebase_Model_Tag($targ);
154     }
155     
156     /**
157      * delete groups and their members
158      * 
159      * - also deletes groups and users in sync backends
160      */
161     protected function _deleteGroups()
162     {
163         foreach ($this->_groupIdsToDelete as $groupId) {
164             if ($this->_removeGroupMembers) {
165                 foreach (Tinebase_Group::getInstance()->getGroupMembers($groupId) as $userId) {
166                     try {
167                         Tinebase_User::getInstance()->deleteUser($userId);
168                     } catch (Exception $e) {
169                         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
170                             . ' error while deleting user: ' . $e->getMessage());
171                     }
172                 }
173             }
174             try {
175                 Tinebase_Group::getInstance()->deleteGroups($groupId);
176             } catch (Exception $e) {
177                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
178                     . ' error while deleting group: ' . $e->getMessage());
179             }
180         }
181     }
182     
183     /**
184      * delete users
185      */
186     protected function _deleteUsers()
187     {
188         foreach ($this->_usernamesToDelete as $username) {
189             try {
190                 Tinebase_User::getInstance()->deleteUser(Tinebase_User::getInstance()->getUserByLoginName($username));
191             } catch (Exception $e) {
192                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
193                     . ' error while deleting user: ' . $e->getMessage());
194             }
195         }
196     }
197
198     /**
199      * get personal container
200      * 
201      * @param string $applicationName
202      * @param Tinebase_Model_User $user
203      * @return Tinebase_Model_Container
204      */
205     protected function _getPersonalContainer($applicationName, $user = null)
206     {
207         if ($user === null) {
208             $user = Tinebase_Core::getUser();
209         }
210         
211         return Tinebase_Container::getInstance()->getPersonalContainer(
212             $user,
213             $applicationName, 
214             $user,
215             Tinebase_Model_Grants::GRANT_EDIT
216         )->getFirstRecord();
217     }
218     
219     /**
220      * get test container
221      * 
222      * @param string $applicationName
223      */
224     protected function _getTestContainer($applicationName)
225     {
226         return Tinebase_Container::getInstance()->addContainer(new Tinebase_Model_Container(array(
227             'name'           => 'PHPUnit test container',
228             'type'           => Tinebase_Model_Container::TYPE_PERSONAL,
229             'owner_id'       => Tinebase_Core::getUser(),
230             'backend'        => 'Sql',
231             'application_id' => Tinebase_Application::getInstance()->getApplicationByName($applicationName)->getId()
232         ), true));
233     }
234     
235     /**
236      * get test mail domain
237      * 
238      * @return string
239      */
240     protected function _getMailDomain()
241     {
242         $testconfig = Zend_Registry::get('testConfig');
243         return ($testconfig && isset($testconfig->maildomain)) ? $testconfig->maildomain : 'tine20.org';
244     }
245     
246     /**
247      * get test user email address
248      * 
249      * @return test user email address
250      */
251     protected function _getEmailAddress()
252     {
253         $testConfig = Zend_Registry::get('testConfig');
254         return ($testConfig->email) ? $testConfig->email : Tinebase_Core::getUser()->accountEmailAddress;
255     }
256     
257     /**
258      * lazy init of uit
259      * 
260      * @return Object
261      * 
262      * @todo fix ide object class detection for completions
263      */
264     protected function _getUit()
265     {
266         if ($this->_uit === null) {
267             $uitClass = preg_replace('/Tests{0,1}$/', '', get_class($this));
268             if (@method_exists($uitClass, 'getInstance')) {
269                 $this->_uit = call_user_func($uitClass . '::getInstance');
270             } else if (@class_exists($uitClass)) {
271                 $this->_uit = new $uitClass();
272             } else {
273                 throw new Exception('could not find class ' . $uitClass);
274             }
275         }
276         
277         return $this->_uit;
278     }
279     
280     /**
281      * get messages
282      * 
283      * @return array
284      */
285     public static function getMessages()
286     {
287         // make sure messages are sent if queue is activated
288         if (isset(Tinebase_Core::getConfig()->actionqueue)) {
289             Tinebase_ActionQueue::getInstance()->processQueue(100);
290         }
291         
292         return self::getMailer()->getMessages();
293     }
294     
295     /**
296      * get mailer
297      * 
298      * @return Zend_Mail_Transport_Abstract
299      */
300     public static function getMailer()
301     {
302         if (! self::$_mailer) {
303             self::$_mailer = Tinebase_Smtp::getDefaultTransport();
304         }
305         
306         return self::$_mailer;
307     }
308     
309     /**
310      * flush mailer (send all remaining mails first)
311      */
312     public static function flushMailer()
313     {
314         // make sure all messages are sent if queue is activated
315         if (isset(Tinebase_Core::getConfig()->actionqueue)) {
316             Tinebase_ActionQueue::getInstance()->processQueue(10000);
317         }
318         
319         self::getMailer()->flush();
320     }
321     
322     /**
323      * returns the content.xml of an ods document
324      * 
325      * @param string $filename
326      * @return SimpleXMLElement
327      */
328     protected function _getContentXML($filename)
329     {
330         $zipHandler = zip_open($filename);
331         
332         do {
333             $entry = zip_read($zipHandler);
334         } while ($entry && zip_entry_name($entry) != "content.xml");
335         
336         // open entry
337         zip_entry_open($zipHandler, $entry, "r");
338         
339         // read entry
340         $entryContent = zip_entry_read($entry, zip_entry_filesize($entry));
341         
342         $xml = simplexml_load_string($entryContent);
343         zip_close($zipHandler);
344         
345         return $xml;
346     }
347     
348     /**
349      * get test temp file
350      * 
351      * @return Tinebase_TempFile
352      */
353     protected function _getTempFile()
354     {
355         $tempFileBackend = new Tinebase_TempFile();
356         $tempFile = $tempFileBackend->createTempFile(dirname(__FILE__) . '/Filemanager/files/test.txt');
357         return $tempFile;
358     }
359 }