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