/**
  * testXMozSnooze
  * 
  * @see 0007682: CalDav - Tine - Thunderbird - Palm Pre
  */
 public function testXMozSnooze()
 {
     $vcalendarStream = Calendar_Frontend_WebDAV_EventTest::getVCalendar(dirname(__FILE__) . '/../../../Import/files/lightning_snooze.ics');
     $converter = Tasks_Convert_Task_VCalendar_Factory::factory(Tasks_Convert_Task_VCalendar_Factory::CLIENT_THUNDERBIRD);
     $event = $converter->toTine20Model($vcalendarStream);
     $this->assertTrue(isset($event->attendee[0]->alarm_snooze_time));
     $this->assertEquals('2013-04-12 06:24:46', $event->attendee[0]->alarm_snooze_time->toString());
 }
 /**
  * test converting vtodo without trigger valarm
  */
 public function testConvertToTine20Model()
 {
     $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_valarm.ics', 'r');
     $converter = Tasks_Convert_Task_VCalendar_Factory::factory(Tasks_Convert_Task_VCalendar_Factory::CLIENT_MACOSX);
     $task = $converter->toTine20Model($vcalendarStream);
     $this->assertEquals('Stundenaufstellung Heinz Walter', $task->summary, print_r($task->toArray(), true));
     $this->assertEquals(1, count($task->alarms), print_r($task->toArray(), true));
     $this->assertEquals('2014-09-12 06:00:00', $task->alarms->getFirstRecord()->alarm_time->toString(), print_r($task->toArray(), true));
 }
 /**
  * this function creates a Tasks_Model_Task and stores it in the database
  * 
  * @param  Tinebase_Model_Container  $container
  * @param  stream|string             $vobjectData
  */
 public static function create(Tinebase_Model_Container $container, $name, $vobjectData, $onlyCurrentUserOrganizer = 'unused')
 {
     if (is_resource($vobjectData)) {
         $vobjectData = stream_get_contents($vobjectData);
     }
     // Converting to UTF-8, if needed
     $vobjectData = Sabre\DAV\StringUtil::ensureUTF8($vobjectData);
     #Sabre_CalDAV_ICalendarUtil::validateICalendarObject($vobjectData, array('VTODO', 'VFREEBUSY'));
     list($backend, $version) = Tasks_Convert_Task_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']);
     try {
         $task = Tasks_Convert_Task_VCalendar_Factory::factory($backend, $version)->toTine20Model($vobjectData);
     } catch (Exception $e) {
         Tinebase_Core::getLogger()->err(__METHOD__ . '::' . __LINE__ . ' ' . $e);
         Tinebase_Core::getLogger()->err(__METHOD__ . '::' . __LINE__ . " " . $vobjectData);
         throw new Sabre\DAV\Exception\PreconditionFailed($e->getMessage());
     }
     $task->container_id = $container->getId();
     $id = ($pos = strpos($name, '.')) === false ? $name : substr($name, 0, $pos);
     $task->setId($id);
     self::enforceEventParameters($task);
     // check if there is already an existing task with this ID
     // this can happen when the invitation email is faster then the caldav update or
     // or when an task gets moved to another container
     $filter = new Tasks_Model_TaskFilter(array(array('field' => 'is_deleted', 'operator' => 'equals', 'value' => Tinebase_Model_Filter_Bool::VALUE_NOTSET), array('condition' => 'OR', 'filters' => array(array('field' => 'id', 'operator' => 'equals', 'value' => $id), array('field' => 'uid', 'operator' => 'equals', 'value' => $id)))));
     $existingEvent = Tasks_Controller_Task::getInstance()->search($filter, null, false, false, 'sync')->getFirstRecord();
     if ($existingEvent === null) {
         try {
             $task = Tasks_Controller_Task::getInstance()->create($task);
         } catch (Exception $e) {
             Tinebase_Core::getLogger()->err(__METHOD__ . '::' . __LINE__ . ' ' . $e);
             Tinebase_Core::getLogger()->err(__METHOD__ . '::' . __LINE__ . " " . $vobjectData);
             Tinebase_Core::getLogger()->err(__METHOD__ . '::' . __LINE__ . " " . print_r($task->toArray(), true));
             throw new Sabre\DAV\Exception\PreconditionFailed($e->getMessage());
         }
         $vevent = new self($container, $task);
     } else {
         if ($existingEvent->is_deleted) {
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                 Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' recovering already deleted task');
             }
             // @TODO have a undelete/recover workflow beginning in controller
             $existingEvent->is_deleted = 0;
             $existingEvent->deleted_by = NULL;
             $existingEvent->deleted_time = NULL;
             $be = new Tasks_Backend_Sql();
             $be->updateMultiple($existingEvent->getId(), array('is_deleted' => 0, 'deleted_by' => NULL, 'deleted_time' => NULL));
         }
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' update existing task with id: ' . $existingEvent->getId());
         }
         $vevent = new self($container, $existingEvent);
         $vevent->put($vobjectData);
     }
     return $vevent;
 }
 public function testConvertToTine20ModelWithCustomAlarm()
 {
     $this->markTestSkipped();
     $vcalendar = Tasks_Frontend_WebDAV_TaskTest::getVCalendar(dirname(__FILE__) . '/../../../Import/files/event_with_custom_alarm.ics');
     $converter = Tasks_Convert_Task_VCalendar_Factory::factory(Tasks_Convert_Task_VCalendar_Factory::CLIENT_GENERIC);
     $task = $converter->toTine20Model($vcalendar);
     $this->assertTrue($task->alarms instanceof Tinebase_Record_RecordSet);
     $this->assertEquals(1, count($task->alarms));
     $alarm = $task->alarms->getFirstRecord();
     $this->assertEquals(Tinebase_Model_Alarm::OPTION_CUSTOM, $alarm->minutes_before);
     $this->assertEquals('2012-02-14 17:00:00', $alarm->alarm_time->toString());
 }
 /**
  * @depends testConvertToTine20Model
  */
 public function testConvertFromTine20Model()
 {
     $task = $this->testConvertToTine20Model();
     $task->creation_time = new Tinebase_DateTime('2011-11-11 11:11', 'UTC');
     $task->last_modified_time = new Tinebase_DateTime('2011-11-11 12:12', 'UTC');
     $task->attendee = new Tinebase_Record_RecordSet('Calendar_Model_Attender');
     $converter = Tasks_Convert_Task_VCalendar_Factory::factory(Tasks_Convert_Task_VCalendar_Factory::CLIENT_EMCLIENT);
     $vcalendar = $converter->fromTine20Model($task)->serialize();
     // var_dump($vcalendar);
     // required fields
     $this->assertContains('VERSION:2.0', $vcalendar, $vcalendar);
     $this->assertContains('PRODID:-//tine20.com//Tine 2.0 Tasks V', $vcalendar, $vcalendar);
     $this->assertContains('CREATED:20111111T111100Z', $vcalendar, $vcalendar);
     $this->assertContains('LAST-MODIFIED:20111111T121200Z', $vcalendar, $vcalendar);
     $this->assertContains('DTSTAMP:', $vcalendar, $vcalendar);
     $this->assertContains('TZID:Europe/Berlin', $vcalendar, $vcalendar);
     $this->assertContains('UID:' . $task->uid, $vcalendar, $vcalendar);
     $this->assertContains('LOCATION:' . $task->location, $vcalendar, $vcalendar);
     $this->assertContains('CLASS:PUBLIC', $vcalendar, $vcalendar);
     $this->assertContains('TZOFFSETFROM:+0100', $vcalendar, $vcalendar);
     $this->assertContains('TZOFFSETTO:+0200', $vcalendar, $vcalendar);
     $this->assertContains('TZNAME:CEST', $vcalendar, $vcalendar);
     $this->assertContains('TZOFFSETFROM:+0200', $vcalendar, $vcalendar);
     $this->assertContains('TZOFFSETTO:+0100', $vcalendar, $vcalendar);
     $this->assertContains('TZNAME:CET', $vcalendar, $vcalendar);
 }
 /**
  * test factory with useragent string from thunderbird 
  */
 public function testUserAgentIceowl()
 {
     list($backend, $version) = Tasks_Convert_Task_VCalendar_Factory::parseUserAgent('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Iceowl/1.0b1 Icedove/3.0.11');
     $this->assertEquals(Tasks_Convert_Task_VCalendar_Factory::CLIENT_THUNDERBIRD, $backend);
     $this->assertEquals('1.0b1', $version);
 }