package org.osaf.caldav4j.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import net.fortuna.ical4j.data.CalendarBuilder;
import net.fortuna.ical4j.data.ParserException;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.Component;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.component.VToDo;
import net.fortuna.ical4j.model.property.Uid;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.osaf.caldav4j.BaseTestCase;
import org.osaf.caldav4j.methods.PutGetTest;
public class ICalendarUtilTest extends BaseTestCase{
private static final Log log = LogFactory.getLog(PutGetTest.class);
// list of different components
private List<String> calendarList = new ArrayList<String>();
@Before
@Override
public void setUp() throws Exception {
log.trace("setUp");
calendarList.add("icalendar/DAY-VTODO-123123.ics");
calendarList.add(ICS_GOOGLE_NORMAL_PACIFIC_1PM_PATH);
}
@After
public void tearDown() throws Exception {}
//
// methods
//
/**
* update a master event or a recurring one
*
* user story: google does it this way:
* - pick an event on calendar by the 3-ple (UID, DTSTART, DTEND)
* - if the event is recurring one then asks you whether:
* - change the master
* - change the recurrence identified by the 3-ple
* - change the events subsequent
*/
@Test
@Ignore
public void testUpdateMasterComponent () throws Exception {
// TODO writeme
}
/**
* as testSetCalendarUid, but should throw exception,
* as .ics is not a valid caldav one
* @throws Exception
*/
@Test
@Ignore
public void testSetIcsUid() throws Exception {
// test variable
Component component = null;
// create a mixed VEVENT VTODO Calendar
Calendar mixedCalendar = this.parseICS(calendarList.get(0));
Calendar tmp = this.parseICS(calendarList.get(1));
mixedCalendar.getComponents().add(ICalendarUtils.getFirstComponent(tmp));
log.debug(mixedCalendar.toString());
assertNotNull(mixedCalendar);
// check that getFirstComponent rejects those kind of calendar
try {
component = ICalendarUtils.getFirstComponent(mixedCalendar);
} catch (Exception e) {
log.debug(e.getMessage());
}
assertNull(component);
}
@Test
public void testParseStrangeICs() throws Exception {
// CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_UNFOLDING, false);
//CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING, true);
//CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_OUTLOOK_COMPATIBILITY, true);
//CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_VALIDATION, true);
Calendar strangeIcs = this.parseICS("icalendar/Recurrent_with_timezone.ics");
log.info(strangeIcs);
}
/**
* retrieve a component from a calendar with timezone
* @throws ParserException
* @throws IOException
*/
@Test
public void testGetComponentFromCalendarWithTimezone()
throws Exception{
// get a calendar from file
// or create one
for (String resource : this.calendarList) {
log.info("testing with: " + resource);
Calendar cal = this.parseICS(resource);
// get first component
Component firstComponent = ICalendarUtils.getFirstComponent(cal);
// print it | test if matches
log.debug(cal);
log.debug(firstComponent.toString());
}
}
/**
* retrieve a component from a calendar without timezone
*/
@Test
@Ignore
public void testGetComponentFromCalendar(){
// get a calendar from file
// or create one
// get first component
// print it | test if matches
}
/**
* append an uid to a Component from an one-component calendar
*/
@Test
@Ignore
public void testSetCalendarUid() throws Exception {
// get a calendar from file
// or create one
String resource = "icalendar/Google_NOUID_Daily_NY_5pm.ics";
String newUid = "newUid";
log.info("testing with: " + resource);
Calendar cal = this.parseICS(resource);
// get first component
Component firstComponent = ICalendarUtils.getFirstComponent(cal);
// check that UID is not present
String uid = ICalendarUtils.getUIDValue(cal);
log.trace("uid=" + uid);
if ("".equals(uid)) {
uid = null;
}
assertNull(uid);
// create one, add then retrieve from calendar
ICalendarUtils.addOrReplaceProperty(firstComponent, new Uid(newUid));
uid = ICalendarUtils.getUIDValue(cal);
log.trace("uid=" + uid);
if ("".equals(uid)) {
uid = null;
}
// print it | test if matches
assertEquals(newUid, uid);
log.debug(cal.toString());
}
/**
* replace an uid to a Component from an one-component calendar
*/
@Test
public void testReplaceCalendarUid() throws Exception{
// get a calendar from file
// or create one
String resource = "icalendar/Google_Daily_NY_5pm.ics";
String newUid = "newUid";
log.info("testing with: " + resource);
Calendar cal = this.parseICS(resource);
// check that UID is present
String uid = ICalendarUtils.getUIDValue(cal);
log.trace("uid=" + uid);
if ("".equals(uid)) {
uid = null;
}
assertNotNull(uid);
// create one, replace, then retrieve from calendar
ICalendarUtils.setUIDValue(cal, newUid);
uid = ICalendarUtils.getUIDValue(cal);
log.trace("uid=" + uid);
if ("".equals(uid)) {
uid = null;
}
// print it | test if matches
assertEquals(newUid, uid);
log.debug(cal.toString());
}
//
// private
//
private Calendar parseICS(String resource)
throws Exception {
InputStream stream = this.getClass().getClassLoader()
.getResourceAsStream(resource);
CalendarBuilder cb = new CalendarBuilder();
Calendar cal = cb.build(stream);
// a bit of more testing
// XXX
Component firstComponent =ICalendarUtils.getFirstComponent(cal);
if (firstComponent instanceof VToDo) {
VToDo new_name = (VToDo) firstComponent;
log.info("resource type of is: VTODO");
} else if (firstComponent instanceof VEvent) {
VEvent new_name = (VEvent) firstComponent;
log.info("resource is: VEVENT");
}
return cal;
}
}