catch errors when trying to get "other app etags"
[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             'importContainerId' => $this->_testCalendar->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             'importContainerId' => $this->_testCalendar->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             'importContainerId' => $this->_testCalendar->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             'importContainerId' => $this->_testCalendar->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             'importContainerId' => $this->_testCalendar->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             'importContainerId' => $this->_testCalendar->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 ical cli import
135      * 
136      * @see 0007104: Calender Import Crashes
137      */
138     public function testCliImport()
139     {
140         $this->_testNeedsTransaction();
141         
142         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
143             'plugin=Calendar_Import_Ical importContainerId=' . $this->_testCalendar->getId() .
144             ' ' . dirname(__FILE__) . '/files/horde.ics';
145         
146         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
147         
148         exec($cmd, $output);
149         $failMessage = print_r($output, TRUE);
150         $this->_checkImport($failMessage);
151     }
152     
153     /**
154      * testImportTwice (forceUpdateExisting)
155      * 
156      * @see 0008652: Import von .ics-Dateien in Kalender schlägt fehl
157      */
158     public function testImportTwice()
159     {
160         $this->_testNeedsTransaction();
161         
162         $cmd = realpath(__DIR__ . "/../../../../tine20/tine20.php") . ' --method Calendar.import ' .
163             'plugin=Calendar_Import_Ical forceUpdateExisting=1 importContainerId=' . $this->_testCalendar->getId() .
164             ' ' . dirname(__FILE__) . '/files/termine.ics';
165         
166         $cmd = TestServer::assembleCliCommand($cmd, TRUE);
167         
168         exec($cmd, $output);
169         $failMessage = print_r($output, TRUE);
170         $this->_checkImport($failMessage);
171         
172         // second time
173         exec($cmd, $output);
174         $failMessage = print_r($output, TRUE);
175         $this->_checkImport($failMessage);
176     }
177     
178     /**
179      * testImportRruleNormalize
180      * 
181      * @see 0009856: ics import: recurring events one day earlier
182      */
183     public function testImportRruleNormalize()
184     {
185         $importer = new Calendar_Import_Ical(array(
186             'importContainerId' => $this->_testCalendar->getId(),
187         ));
188         
189         $importer->importFile(dirname(__FILE__) . '/files/ni-zsk.ics');
190         
191         // fetch first of may in 2014
192         $from = new Tinebase_DateTime('2014-04-23 22:00:00');
193         $until = new Tinebase_DateTime('2014-05-23 22:00:00');
194         $events = Calendar_Controller_Event::getInstance()->search(new Calendar_Model_EventFilter(array(
195             array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId()),
196             array('field' => 'period', 'operator' => 'within', 'value' => array(
197                 'from'  => $from->toString(),
198                 'until' => $until->toString()
199             )),
200         )), NULL);
201         Calendar_Model_Rrule::mergeRecurrenceSet($events, $from, $until);
202         $firstOfMay2014 = $events[1];
203         
204         $this->assertEquals('2014-04-30 22:00:00', $firstOfMay2014->dtstart);
205     }
206 }