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