Merge branch '2013.10'
[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 helper
13  */
14 require_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'TestHelper.php';
15
16 /**
17  * Test class for Calendar_Backend_Sql
18  * 
19  * @package     Calendar
20  */
21 abstract class Calendar_TestCase extends TestCase
22 {
23     /**
24      * @var Calendar_Backend_Sql SQL Backend in test
25      */
26     protected $_backend;
27     
28     /**
29      * @var Tinebase_Model_Container
30      */
31     protected $_testCalendar = NULL;
32     
33     /**
34      * @var Tinebase_Record_RecordSet test calendars to be deleted on tearDown
35      */
36     protected $_testCalendars = NULL;
37     
38     /**
39      * @var Tinebase_Model_FullUser
40      */
41     protected $_testUser = NULL;
42     
43     /**
44      * @var Addressbook_Model_Contact
45      */
46     protected $_testUserContact = NULL;
47     
48     /**
49      * personas
50      *
51      * @var array
52      */
53     protected $_personas = NULL;
54     
55     /**
56      * personas contacts
57      * @var array
58      */
59     protected $_personasContacts = array();
60     
61     /**
62      * persona calendars
63      *
64      * @var array
65      */
66     protected $_personasDefaultCals = array();
67     
68     /**
69      * set up tests
70      */
71     public function setUp()
72     {
73         parent::setUp();
74         
75         $this->_backend = new Calendar_Backend_Sql();
76         $this->_testUser = Tinebase_Core::getUser();
77     }
78     
79     /**
80      * tear down tests
81      */
82     public function tearDown()
83     {
84         parent::tearDown();
85         
86         Calendar_Controller_Event::getInstance()->sendNotifications(false);
87         
88         if (! $this->_transactionId && $this->_testCalendar !== NULL) {
89             $events = $this->_backend->search(new Calendar_Model_EventFilter(array(
90                 array('field' => 'container_id', 'operator' => 'in', 'value' => $this->_testCalendars->getId()),
91             )), new Tinebase_Model_Pagination(array()));
92             
93             // delete alarms
94             Tinebase_Alarm::getInstance()->deleteAlarmsOfRecord('Calendar_Model_Event', $events->getArrayOfIds());
95             
96             foreach ($events as $event) {
97                 $this->_backend->delete($event->getId());
98             }
99             
100             foreach ($this->_testCalendars as $cal) {
101                 Tinebase_Container::getInstance()->deleteContainer($cal, true);
102             }
103         }
104         // do NOT unset _testUser,the tear down of Calendar_Frontend_WebDAV_EventTest still requires _testUser
105         $this->_testUserContact = NULL;
106         $this->_testCalendar = NULL;
107         $this->_testCalendars = NULL;
108         $this->_personas = NULL;
109         $this->_personasContacts = array();
110         $this->_personasDefaultCals = array();
111     }
112     
113     /**
114      * returns test persons contacts
115      * 
116      * @param string $loginName
117      * @return Addressbook_Model_Contact
118      */
119     protected function _getPersonasContacts($loginName)
120     {
121         if (!isset($this->_personasContacts[$loginName])) {
122             $user = $this->_getPersona($loginName);
123             $this->_personasContacts[$loginName] = Addressbook_Controller_Contact::getInstance()->getContactByUserId($user->getId());
124         }
125         return $this->_personasContacts[$loginName];
126     }
127     
128     /**
129      * returns test persons default calendar
130      * 
131      * @param string $loginName
132      * @return Tinebase_Model_Container
133      */
134     protected function _getPersonasDefaultCals($loginName)
135     {
136         if (!isset($this->_personasDefaultCals[$loginName])) {
137             $user = $this->_getPersona($loginName);
138             $defaultCalendarId = Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::DEFAULTCALENDAR, $user->getId());
139             $this->_personasDefaultCals[$loginName] = Tinebase_Container::getInstance()->getContainerById($defaultCalendarId);
140         }
141         return $this->_personasDefaultCals[$loginName];
142     }
143     
144     /**
145      * returns all test persons default calendar
146      * 
147      * @return array
148      */
149     protected function _getAllPersonasDefaultCals()
150     {
151         foreach ($this->_getPersonas() as $loginName => $user)
152         {
153             $this->_getPersonasDefaultCals($loginName);
154         }
155         return $this->_personasDefaultCals;
156     }
157     
158     /** return a test person
159      * @return 
160      */
161     protected function _getPersona($loginName)
162     {
163         if ($this->_personas === NULL) {
164             $this->_getPersonas();
165         }
166         return $this->_personas[$loginName];
167     }
168     
169     /**
170      * returns an array of test persons
171      * 
172      * @return array
173      */
174     protected function _getPersonas()
175     {
176         if ($this->_personas === NULL) {
177             $this->_personas = Zend_Registry::get('personas');
178         }
179         return $this->_personas;
180     }
181     
182     /**
183      * returns a test user
184      * 
185      * @return Tinebase_Model_FullUser
186      */
187     protected function _getTestUser()
188     {
189         return $this->_testUser;
190     }
191     
192     /**
193      * returns the test users contact
194      * 
195      * @return
196      */
197     protected function _getTestUserContact()
198     {
199         if ($this->_testUserContact === NULL) {
200             $this->_testUserContact = Addressbook_Controller_Contact::getInstance()->getContactByUserId($this->_getTestUser()->getId());
201         }
202         return $this->_testUserContact;
203     }
204     /**
205      * returns a test calendar set
206      * 
207      * @return Tinebase_Record_RecordSet\r
208      */
209     protected function _getTestCalendars()
210     {
211         if ($this->_testCalendars === NULL) {
212             $this->_getTestCalendar();
213         }
214         return $this->_testCalendars;
215     }
216     /**
217      * returns a test calendar
218      * 
219      * @return Tinebase_Model_Container
220      */
221     protected function _getTestCalendar()
222     {
223         if ($this->_testCalendar === NULL) {
224             $this->_testCalendar = Tinebase_Container::getInstance()->addContainer(new Tinebase_Model_Container(array(
225                     'name'           => 'PHPUnit test calendar',
226                     'type'           => Tinebase_Model_Container::TYPE_PERSONAL,
227                     'owner_id'       => Tinebase_Core::getUser(),
228                     'backend'        => $this->_backend->getType(),
229                     'application_id' => Tinebase_Application::getInstance()->getApplicationByName('Calendar')->getId()
230             ), true));
231             
232             $this->_testCalendars = new Tinebase_Record_RecordSet('Tinebase_Model_Container');
233             $this->_testCalendars->addRecord($this->_testCalendar);
234         }
235         return $this->_testCalendar;
236     }
237     
238     /**
239      * returns a simple event
240      * 
241      * @param bool $now
242      * @return Calendar_Model_Event
243      */
244     protected function _getEvent($now = FALSE)
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             Tinebase_Model_Grants::GRANT_READ    => true,
258             Tinebase_Model_Grants::GRANT_EDIT    => true,
259             Tinebase_Model_Grants::GRANT_DELETE  => true,
260         ));
261         
262         if ($now) {
263             $event->dtstart = Tinebase_DateTime::now();
264             $event->dtend = Tinebase_DateTime::now()->addMinute(15);
265         }
266         
267         return $event;
268     }
269
270     /**
271      * returns a simple event
272      *
273      * @param bool $now use date of now
274      * @return Calendar_Model_Event
275      */
276     protected function _getEventWithAlarm($now = FALSE)
277     {
278         $event = $this->_getEvent($now);
279         $event->alarms = new Tinebase_Record_RecordSet('Tinebase_Model_Alarm', array(
280             array(
281                 'minutes_before'    => 0
282             ),
283         ), TRUE);
284         
285         return $event;
286     }
287     
288     /**
289      * get test attendee
290      *
291      * @return Tinebase_Record_RecordSet
292      */
293     protected function _getAttendee()
294     {
295         return new Tinebase_Record_RecordSet('Calendar_Model_Attender', array(
296             array(
297                 'user_id'        => $this->_getTestUserContact()->getId(),
298                 'user_type'      => Calendar_Model_Attender::USERTYPE_USER,
299                 'role'           => Calendar_Model_Attender::ROLE_REQUIRED,
300                 'status_authkey' => Tinebase_Record_Abstract::generateUID(),
301             ),
302             array(
303                 'user_id'        => $this->_GetPersonasContacts('sclever')->getId(),
304                 'user_type'      => Calendar_Model_Attender::USERTYPE_USER,
305                 'role'           => Calendar_Model_Attender::ROLE_REQUIRED,
306                 'status_authkey' => Tinebase_Record_Abstract::generateUID(),
307             ),
308             /* no group suppoert yet
309             array(
310                 'user_id'        => Tinebase_Core::getUser()->accountPrimaryGroup,
311                 'user_type'      => Calendar_Model_Attender::USERTYPE_GROUP,
312                 'status_authkey' => Tinebase_Record_Abstract::generateUID(),
313             )
314             */
315         ));
316     }
317     
318     /**
319      * get all calendar grants
320      * 
321      * @param Tinebase_Model_User $user
322      * @return array
323      */
324     protected function _getAllCalendarGrants($user = null)
325     {
326         return array(
327             'account_id'    => $user ? $user->getId() : Tinebase_Core::getUser()->getId(),
328             'account_type'  => 'user',
329             Tinebase_Model_Grants::GRANT_READ     => true,
330             Tinebase_Model_Grants::GRANT_ADD      => true,
331             Tinebase_Model_Grants::GRANT_EDIT     => true,
332             Tinebase_Model_Grants::GRANT_DELETE   => true,
333             Tinebase_Model_Grants::GRANT_PRIVATE  => true,
334             Tinebase_Model_Grants::GRANT_ADMIN    => true,
335             Tinebase_Model_Grants::GRANT_FREEBUSY => true,
336         );
337     }
338 }