Merge branch '2015.11-develop' into 2016.11
[tine20] / tests / tine20 / Calendar / TestCase.php
1 <?php
2 /**
3  * Tine 2.0 - http://www.tine20.org
4  * 
5  * @package     Calendar
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
8  * @author      Cornelius Weiss <c.weiss@metaways.de>
9  */
10
11 /**
12  * Test class for Calendar_Backend_Sql
13  * 
14  * @package     Calendar
15  */
16 abstract class Calendar_TestCase extends TestCase
17 {
18     /**
19      * @var Calendar_Backend_Sql SQL Backend in test
20      */
21     protected $_backend;
22     
23     /**
24      * @var Tinebase_Model_Container
25      */
26     protected $_testCalendar = NULL;
27     
28     /**
29      * @var Tinebase_Record_RecordSet test calendars to be deleted on tearDown
30      */
31     protected $_testCalendars = NULL;
32     
33     /**
34      * @var Addressbook_Model_Contact
35      */
36     protected $_testUserContact = NULL;
37     
38     /**
39      * personas
40      *
41      * @var array
42      */
43     protected $_personas = NULL;
44     
45     /**
46      * personas contacts
47      * @var array
48      */
49     protected $_personasContacts = array();
50     
51     /**
52      * persona calendars
53      *
54      * @var array
55      */
56     protected $_personasDefaultCals = array();
57     
58     /**
59      * set up tests
60      */
61     public function setUp()
62     {
63         parent::setUp();
64         
65         $this->_backend = new Calendar_Backend_Sql();
66         
67         $this->_personas = Zend_Registry::get('personas');
68         foreach ($this->_personas as $loginName => $user) {
69             $defaultCalendarId = Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::DEFAULTCALENDAR, $user->getId());
70             $this->_personasContacts[$loginName] = Addressbook_Controller_Contact::getInstance()->getContactByUserId($user->getId());
71             $this->_personasDefaultCals[$loginName] = Tinebase_Container::getInstance()->getContainerById($defaultCalendarId);
72         }
73         
74         $this->_testUserContact = Addressbook_Controller_Contact::getInstance()->getContactByUserId($this->_originalTestUser->getId());
75         $this->_testCalendar = $this->_getTestContainer('Calendar');
76         
77         $this->_testCalendars = new Tinebase_Record_RecordSet('Tinebase_Model_Container');
78         $this->_testCalendars->addRecord($this->_testCalendar);
79     }
80     
81     /**
82      * tear down tests
83      */
84     public function tearDown()
85     {
86         parent::tearDown();
87         
88         Calendar_Controller_Event::getInstance()->sendNotifications(false);
89         
90         Tinebase_Acl_Roles::getInstance()->resetClassCache();
91         
92         if (! $this->_transactionId) {
93             if ($this->_backend != NULL) {
94                 $events = $this->_backend->search(new Calendar_Model_EventFilter(array(
95                     array('field' => 'container_id', 'operator' => 'in', 'value' => $this->_testCalendars->getId()),
96                 )), new Tinebase_Model_Pagination(array()));
97                 
98                 // delete alarms
99                 Tinebase_Alarm::getInstance()->deleteAlarmsOfRecord('Calendar_Model_Event', $events->getArrayOfIds());
100                 
101                 foreach ($events as $event) {
102                     $this->_backend->delete($event->getId());
103                 }
104             }
105             foreach ($this->_testCalendars as $cal) {
106                 Tinebase_Container::getInstance()->deleteContainer($cal, true);
107             }
108         }
109         
110         $this->_testUserContact = NULL;
111         $this->_testCalendar = NULL;
112         $this->_testCalendars = NULL;
113         $this->_personas = NULL;
114         $this->_personasContacts = array();
115         $this->_personasDefaultCals = array();
116     }
117     
118     /**
119      * returns test persons contacts
120      * 
121      * @param string $loginName
122      * @return Addressbook_Model_Contact
123      */
124     protected function _getPersonasContacts($loginName)
125     {
126         if (!isset($this->_personasContacts[$loginName])) {
127             $user = $this->_getPersona($loginName);
128             $this->_personasContacts[$loginName] = Addressbook_Controller_Contact::getInstance()->getContactByUserId($user->getId());
129         }
130         return $this->_personasContacts[$loginName];
131     }
132     
133     /**
134      * returns test persons default calendar
135      * 
136      * @param string $loginName
137      * @return Tinebase_Model_Container
138      */
139     protected function _getPersonasDefaultCals($loginName)
140     {
141         if (!isset($this->_personasDefaultCals[$loginName])) {
142             $user = $this->_getPersona($loginName);
143             $defaultCalendarId = Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::DEFAULTCALENDAR, $user->getId());
144             $this->_personasDefaultCals[$loginName] = Tinebase_Container::getInstance()->getContainerById($defaultCalendarId);
145         }
146         return $this->_personasDefaultCals[$loginName];
147     }
148     
149     /**
150      * returns all test persons default calendar
151      * 
152      * @return array
153      */
154     protected function _getAllPersonasDefaultCals()
155     {
156         foreach ($this->_getPersonas() as $loginName => $user)
157         {
158             $this->_getPersonasDefaultCals($loginName);
159         }
160         return $this->_personasDefaultCals;
161     }
162     
163     /** return a test person
164      * @return 
165      */
166     protected function _getPersona($loginName)
167     {
168         if ($this->_personas === NULL) {
169             $this->_getPersonas();
170         }
171         return $this->_personas[$loginName];
172     }
173     
174     /**
175      * returns an array of test persons
176      * 
177      * @return array
178      */
179     protected function _getPersonas()
180     {
181         if ($this->_personas === NULL) {
182             $this->_personas = Zend_Registry::get('personas');
183         }
184         return $this->_personas;
185     }
186     
187     /**
188      * returns a test user
189      * 
190      * @return Tinebase_Model_FullUser
191      */
192     protected function _getTestUser()
193     {
194         return $this->_originalTestUser;
195     }
196     
197     /**
198      * returns the test users contact
199      * 
200      * @return
201      */
202     protected function _getTestUserContact()
203     {
204         if ($this->_testUserContact === NULL) {
205             $this->_testUserContact = Addressbook_Controller_Contact::getInstance()->getContactByUserId($this->_getTestUser()->getId());
206         }
207         return $this->_testUserContact;
208     }
209     /**
210      * returns a test calendar set
211      * 
212      * @return Tinebase_Record_RecordSet
213      */
214     protected function _getTestCalendars()
215     {
216         if ($this->_testCalendars === NULL) {
217             $this->_getTestCalendar();
218         }
219         return $this->_testCalendars;
220     }
221     /**
222      * returns a test calendar
223      * 
224      * @return Tinebase_Model_Container
225      */
226     protected function _getTestCalendar()
227     {
228         if ($this->_testCalendar === NULL) {
229             $this->_testCalendar = $this->_getTestContainer('Calendar');
230             
231             $this->_testCalendars = new Tinebase_Record_RecordSet('Tinebase_Model_Container');
232             $this->_testCalendars->addRecord($this->_testCalendar);
233         }
234         return $this->_testCalendar;
235     }
236     
237     /**
238      * returns a simple event
239      * 
240      * @param bool $now
241      * @param bool $mute
242      * @return Calendar_Model_Event
243      */
244     protected function _getEvent($now = FALSE, $mute = NULL)
245     {
246         $event = new Calendar_Model_Event(array(
247             'summary'     => 'Wakeup',
248             'dtstart'     => '2009-03-25 06:00:00',
249             'dtend'       => '2009-03-25 06:15:00',
250             'description' => 'Early to bed and early to rise, makes a men healthy, wealthy and wise',
251             'attendee'    => $this->_getAttendee(),
252         
253             'container_id' => $this->_getTestCalendar()->getId(),
254             'organizer'    => $this->_getTestUserContact()->getId(),
255             'uid'          => Calendar_Model_Event::generateUID(),
256
257             'mute'         => $mute,
258         
259             Tinebase_Model_Grants::GRANT_READ    => true,
260             Tinebase_Model_Grants::GRANT_EDIT    => true,
261             Tinebase_Model_Grants::GRANT_DELETE  => true,
262         ));
263         
264         if ($now) {
265             $event->dtstart = Tinebase_DateTime::now();
266             $event->dtend = Tinebase_DateTime::now()->addMinute(15);
267         }
268         
269         return $event;
270     }
271
272     /**
273      * returns a simple event
274      *
275      * @param bool $now use date of now
276      * @return Calendar_Model_Event
277      */
278     protected function _getEventWithAlarm($now = FALSE)
279     {
280         $event = $this->_getEvent($now);
281         $event->alarms = new Tinebase_Record_RecordSet('Tinebase_Model_Alarm', array(
282             array(
283                 'minutes_before'    => 0
284             ),
285         ), TRUE);
286         
287         return $event;
288     }
289     
290     /**
291      * get test attendee
292      *
293      * @return Tinebase_Record_RecordSet
294      */
295     protected function _getAttendee()
296     {
297         return new Tinebase_Record_RecordSet('Calendar_Model_Attender', array(
298             $this->_createAttender($this->_getTestUserContact()->getId())->toArray(),
299             $this->_createAttender($this->_GetPersonasContacts('sclever')->getId())->toArray(),
300         ));
301     }
302     
303
304     /**
305      * create new attender
306      *
307      * @param string $userId
308      * @param string $type
309      * @return Calendar_Model_Attender
310      */
311     protected function _createAttender($userId, $type = Calendar_Model_Attender::USERTYPE_USER)
312     {
313         return new Calendar_Model_Attender(array(
314             'user_id'        => $userId,
315             'user_type'      => $type,
316             'role'           => Calendar_Model_Attender::ROLE_REQUIRED,
317             'status_authkey' => Tinebase_Record_Abstract::generateUID(),
318         ));
319     }
320     
321     /**
322      * get resource
323      * 
324      * @return Calendar_Model_Resource
325      */
326     protected function _getResource()
327     {
328         return new Calendar_Model_Resource(array(
329             'name'                 => 'Meeting Room',
330             'description'          => 'Our main meeting room',
331             'email'                => 'room@example.com',
332             'is_location'          => TRUE,
333         ));
334     }
335
336     /**
337      * get all calendar grants
338      * 
339      * @param Tinebase_Model_User $user
340      * @return array
341      */
342     protected function _getAllCalendarGrants($user = null)
343     {
344         return array(
345             'account_id'    => $user ? $user->getId() : Tinebase_Core::getUser()->getId(),
346             'account_type'  => 'user',
347             Tinebase_Model_Grants::GRANT_READ     => true,
348             Tinebase_Model_Grants::GRANT_ADD      => true,
349             Tinebase_Model_Grants::GRANT_EDIT     => true,
350             Tinebase_Model_Grants::GRANT_DELETE   => true,
351             Tinebase_Model_Grants::GRANT_PRIVATE  => true,
352             Tinebase_Model_Grants::GRANT_ADMIN    => true,
353             Tinebase_Model_Grants::GRANT_FREEBUSY => true,
354         );
355     }
356     
357     /**
358      * helper function for getting attender (current user or persona) from attendee set
359      * 
360      * @param Tinebase_Record_RecordSet $attendee
361      * @param string $persona
362      * @return Calendar_Model_Attender
363      */
364     protected function _getAttenderFromAttendeeSet($attendee, $persona = null)
365     {
366         $contactId = $persona ? $this->_getPersonasContacts($persona)->getId() : Tinebase_Core::getUser()->contact_id;
367         $attender = new Calendar_Model_Attender(array(
368             'user_id'        => $contactId,
369             'user_type'      => Calendar_Model_Attender::USERTYPE_USER,
370         ));
371         
372         return Calendar_Model_Attender::getAttendee($attendee, $attender);
373     }
374 }