0004934: Ensure that container does exists
[tine20] / tests / tine20 / Calendar / Import / ICalTest.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
7  * @copyright   Copyright (c) 2010-2014 Metaways Infosystems GmbH (http://www.metaways.de)
8  * @author      Cornelius Weiss <c.weiss@metaways.de>
9  * 
10  */
11
12 /**
13  * Test class for Calendar_Import_ICal
14  */
15 class Calendar_Import_ICalTest extends Calendar_TestCase
16 {
17     /**
18      * testImportSimpleFromString
19      */
20     public function testImportSimpleFromString()
21     {
22         $importer = new Calendar_Import_Ical(array(
23             'container_id' => $this->_getTestCalendar()->getId(),
24         ));
25
26         $icalData = file_get_contents(dirname(__FILE__) . '/files/simple.ics');
27         $importer->importData($icalData);
28         
29         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
30             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId())
31         )), NULL);
32         
33         $this->assertEquals(6, $events->count(), 'events was not imported');
34         
35         $startbucks = $events->find('uid', '3632597');
36         $this->assertEquals('Calendar_Model_Event', get_class($startbucks));
37         $this->assertEquals('2008-11-05 15:00:00', $startbucks->dtstart->format(Tinebase_Record_Abstract::ISO8601LONG));
38     }
39     
40     /**
41      * test simple import from file into a not existing container
42      * 
43      *  - the calendar should be created
44      */
45     public function testSimpleImportIntoNewContainer()
46     {
47         $importer = new Calendar_Import_Ical(array(
48             'container_id' => 'unittest_not_existing',
49         ));
50
51         $result = $importer->importFile(dirname(__FILE__) . '/files/simple.ics');
52
53         $importedContainerId = Tinebase_Container::getInstance()->getContainerByName(
54                     'Calendar',
55                     'unittest_not_existing',
56                     Tinebase_Model_Container::TYPE_PERSONAL,
57                     Tinebase_Core::getUser()->getId()
58                 )->getId();
59
60         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
61             array('field' => 'container_id', 'operator' => 'equals', 'value' => $importedContainerId)
62         )), NULL);
63         
64         $this->assertEquals($importedContainerId, Tinebase_Container::getInstance()->getContainerById($importedContainerId)->getId());
65         $this->assertEquals(6, $events->count(), 'events was not imported');
66     }
67     
68     public function testImportSimpleFromFile()
69     {
70         $importer = new Calendar_Import_Ical(array(
71             'container_id' => $this->_getTestCalendar()->getId(),
72         ));
73         
74         $importer->importFile(dirname(__FILE__) . '/files/simple.ics');
75         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
76             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId())
77         )), NULL);
78         
79         $this->assertEquals(6, $events->count(), 'events where not imported');
80         
81         $startbucks = $events->find('uid', '3632597');
82         $this->assertEquals('Calendar_Model_Event', get_class($startbucks));
83         $this->assertEquals('2008-11-05 15:00:00', $startbucks->dtstart->format(Tinebase_Record_Abstract::ISO8601LONG));
84     }
85     
86     public function testImportRecur()
87     {
88         $importer = new Calendar_Import_Ical(array(
89             'container_id' => $this->_getTestCalendar()->getId(),
90         ));
91         
92         $importer->importFile(dirname(__FILE__) . '/files/XMAS_DE.ics');
93         
94         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
95             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId()),
96             array('field' => 'period', 'operator' => 'within', 'value' => array(
97                 'from'  => '2015-12-23 22:00:00',
98                 'until' => '2015-12-26 22:00:00'
99             )),
100         )), NULL);
101         
102         $this->assertEquals(3, $events->count(), 'events where not imported');
103     }
104     
105     public function testImportHorde()
106     {
107         $importer = new Calendar_Import_Ical(array(
108             'container_id' => $this->_getTestCalendar()->getId(),
109         ));
110         
111         $importer->importFile(dirname(__FILE__) . '/files/horde.ics');
112         $this->_checkImport();
113     }
114     
115     /**
116      * asserts succesful horde import
117      * 
118      * @param string $failMessage
119      * @param integer $assertNumber
120      */
121     protected function _checkImport($failMessage = '', $assertNumber = 1)
122     {
123         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
124             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId())
125         )), NULL);
126         
127         $this->assertEquals($assertNumber, $events->count(), 'events where not imported ' . $failMessage);
128     }
129     
130     /**
131      * test for graceful shutdown if ical is malformatted
132      */
133     public function testImportHordeBroken()
134     {
135         $importer = new Calendar_Import_Ical(array(
136             'container_id' => $this->_getTestCalendar()->getId(),
137         ));
138         
139         try {
140             $importer->importFile(dirname(__FILE__) . '/files/horde_broken.ics');
141             $this->fail('expected Calendar_Exception_IcalParser');
142         } catch (Calendar_Exception_IcalParser $ceip) {
143             $this->assertEquals('Sabre\VObject\EofException', get_class($ceip->getParseError()));
144         }
145     }
146     
147     public function testImportOutlook12()
148     {
149         $importer = new Calendar_Import_Ical(array(
150             'container_id' => $this->_getTestCalendar()->getId(),
151         ));
152         
153         $importer->importFile(dirname(__FILE__) . '/files/outlook12.ics');
154         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
155             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId())
156         )), NULL);
157         
158         $this->assertEquals(1, $events->count(), 'events where not imported');
159     }
160     
161     /**
162      * test import from tine ical export
163      */
164     public function testTineCliImport()
165     {
166         $this->_testNeedsTransaction();
167         
168         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
169             'plugin=Calendar_Import_Ical container_id=' . $this->_getTestCalendar()->getId() .
170             ' ' . dirname(__FILE__) . '/files/tine.ics';
171         
172         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
173         
174         exec($cmd, $output);
175         $failMessage = print_r($output, TRUE);
176         $this->_checkImport($failMessage, 2);
177     }
178     
179     /**
180      * test ical cli import
181      * 
182      * @see 0007104: Calender Import Crashes
183      */
184     public function testCliImport()
185     {
186         $this->_testNeedsTransaction();
187         
188         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
189             'plugin=Calendar_Import_Ical container_id=' . $this->_getTestCalendar()->getId() .
190             ' ' . dirname(__FILE__) . '/files/horde.ics';
191         
192         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
193         
194         exec($cmd, $output);
195         $failMessage = print_r($output, TRUE);
196         $this->_checkImport($failMessage);
197     }
198     
199     /**
200      * testImportTwice (forceUpdateExisting)
201      * 
202      * @see 0008652: Import von .ics-Dateien in Kalender schlägt fehl
203      */
204     public function testImportTwice()
205     {
206         $this->_testNeedsTransaction();
207         
208         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
209             'plugin=Calendar_Import_Ical forceUpdateExisting=1 container_id=' . $this->_getTestCalendar()->getId() .
210             ' ' . dirname(__FILE__) . '/files/termine.ics';
211         
212         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
213         
214         exec($cmd, $output);
215         $failMessage = print_r($output, TRUE);
216         $this->_checkImport($failMessage);
217         
218         // second time
219         exec($cmd, $output);
220         $failMessage = print_r($output, TRUE);
221         $this->_checkImport($failMessage);
222     }
223     
224     /**
225      * testImportRruleNormalize
226      * 
227      * @see 0009856: ics import: recurring events one day earlier
228      */
229     public function testImportRruleNormalize()
230     {
231         $importer = new Calendar_Import_Ical(array(
232             'container_id' => $this->_getTestCalendar()->getId(),
233         ));
234         
235         $importer->importFile(dirname(__FILE__) . '/files/ni-zsk.ics');
236         
237         // fetch first of may in 2014
238         $from = new Tinebase_DateTime('2014-04-23 22:00:00');
239         $until = new Tinebase_DateTime('2014-05-23 22:00:00');
240         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
241             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId()),
242             array('field' => 'period', 'operator' => 'within', 'value' => array(
243                 'from'  => $from->toString(),
244                 'until' => $until->toString()
245             )),
246         )), NULL);
247         Calendar_Model_Rrule::mergeRecurrenceSet($events, $from, $until);
248         $firstOfMay2014 = $events[1];
249         
250         $this->assertEquals('2014-04-30 22:00:00', $firstOfMay2014->dtstart);
251     }
252 }