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