c80688186c3202084d89aa04a17b46ca7d22c7e3
[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     public function testImportSimpleFromFile()
41     {
42         $importer = new Calendar_Import_Ical(array(
43             'container_id' => $this->_getTestCalendar()->getId(),
44         ));
45         
46         $importer->importFile(dirname(__FILE__) . '/files/simple.ics');
47         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
48             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId())
49         )), NULL);
50         
51         $this->assertEquals(6, $events->count(), 'events where not imported');
52         
53         $startbucks = $events->find('uid', '3632597');
54         $this->assertEquals('Calendar_Model_Event', get_class($startbucks));
55         $this->assertEquals('2008-11-05 15:00:00', $startbucks->dtstart->format(Tinebase_Record_Abstract::ISO8601LONG));
56     }
57     
58     public function testImportRecur()
59     {
60         $importer = new Calendar_Import_Ical(array(
61             'container_id' => $this->_getTestCalendar()->getId(),
62         ));
63         
64         $importer->importFile(dirname(__FILE__) . '/files/XMAS_DE.ics');
65         
66         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
67             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId()),
68             array('field' => 'period', 'operator' => 'within', 'value' => array(
69                 'from'  => '2015-12-23 22:00:00',
70                 'until' => '2015-12-26 22:00:00'
71             )),
72         )), NULL);
73         
74         $this->assertEquals(3, $events->count(), 'events where not imported');
75     }
76     
77     public function testImportHorde()
78     {
79         $importer = new Calendar_Import_Ical(array(
80             'container_id' => $this->_getTestCalendar()->getId(),
81         ));
82         
83         $importer->importFile(dirname(__FILE__) . '/files/horde.ics');
84         $this->_checkImport();
85     }
86     
87     /**
88      * asserts succesful horde import
89      * 
90      * @param string $failMessage
91      * @param integer $assertNumber
92      */
93     protected function _checkImport($failMessage = '', $assertNumber = 1)
94     {
95         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
96             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId())
97         )), NULL);
98         
99         $this->assertEquals($assertNumber, $events->count(), 'events where not imported ' . $failMessage);
100     }
101     
102     /**
103      * test for graceful shutdown if ical is malformatted
104      */
105     public function testImportHordeBroken()
106     {
107         $importer = new Calendar_Import_Ical(array(
108             'container_id' => $this->_getTestCalendar()->getId(),
109         ));
110         
111         try {
112             $importer->importFile(dirname(__FILE__) . '/files/horde_broken.ics');
113             $this->fail('expected Calendar_Exception_IcalParser');
114         } catch (Calendar_Exception_IcalParser $ceip) {
115             $this->assertEquals('Sabre\VObject\EofException', get_class($ceip->getParseError()));
116         }
117     }
118     
119     public function testImportOutlook12()
120     {
121         $importer = new Calendar_Import_Ical(array(
122             'container_id' => $this->_getTestCalendar()->getId(),
123         ));
124         
125         $importer->importFile(dirname(__FILE__) . '/files/outlook12.ics');
126         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
127             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId())
128         )), NULL);
129         
130         $this->assertEquals(1, $events->count(), 'events where not imported');
131     }
132     
133     /**
134      * test import from tine ical export
135      */
136     public function testTineCliImport()
137     {
138         $this->_testNeedsTransaction();
139         
140         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
141             'plugin=Calendar_Import_Ical container_id=' . $this->_getTestCalendar()->getId() .
142             ' ' . dirname(__FILE__) . '/files/tine.ics';
143         
144         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
145         
146         exec($cmd, $output);
147         $failMessage = print_r($output, TRUE);
148         $this->_checkImport($failMessage, 2);
149     }
150     
151     /**
152      * test ical cli import
153      * 
154      * @see 0007104: Calender Import Crashes
155      */
156     public function testCliImport()
157     {
158         $this->_testNeedsTransaction();
159         
160         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
161             'plugin=Calendar_Import_Ical container_id=' . $this->_getTestCalendar()->getId() .
162             ' ' . dirname(__FILE__) . '/files/horde.ics';
163         
164         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
165         
166         exec($cmd, $output);
167         $failMessage = print_r($output, TRUE);
168         $this->_checkImport($failMessage);
169     }
170     
171     /**
172      * testImportTwice (forceUpdateExisting)
173      * 
174      * @see 0008652: Import von .ics-Dateien in Kalender schlägt fehl
175      */
176     public function testImportTwice()
177     {
178         $this->_testNeedsTransaction();
179         
180         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
181             'plugin=Calendar_Import_Ical forceUpdateExisting=1 container_id=' . $this->_getTestCalendar()->getId() .
182             ' ' . dirname(__FILE__) . '/files/termine.ics';
183         
184         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
185         
186         exec($cmd, $output);
187         $failMessage = print_r($output, TRUE);
188         $this->_checkImport($failMessage);
189         
190         // second time
191         exec($cmd, $output);
192         $failMessage = print_r($output, TRUE);
193         $this->_checkImport($failMessage);
194     }
195     
196     /**
197      * testImportRruleNormalize
198      * 
199      * @see 0009856: ics import: recurring events one day earlier
200      */
201     public function testImportRruleNormalize()
202     {
203         $importer = new Calendar_Import_Ical(array(
204             'container_id' => $this->_getTestCalendar()->getId(),
205         ));
206         
207         $importer->importFile(dirname(__FILE__) . '/files/ni-zsk.ics');
208         
209         // fetch first of may in 2014
210         $from = new Tinebase_DateTime('2014-04-23 22:00:00');
211         $until = new Tinebase_DateTime('2014-05-23 22:00:00');
212         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
213             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId()),
214             array('field' => 'period', 'operator' => 'within', 'value' => array(
215                 'from'  => $from->toString(),
216                 'until' => $until->toString()
217             )),
218         )), NULL);
219         Calendar_Model_Rrule::mergeRecurrenceSet($events, $from, $until);
220         $firstOfMay2014 = $events[1];
221         
222         $this->assertEquals('2014-04-30 22:00:00', $firstOfMay2014->dtstart);
223     }
224 }