package jfxtras.icalendarfx.itip; import static org.junit.Assert.assertEquals; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import jfxtras.icalendarfx.ICalendarStaticComponents; import jfxtras.icalendarfx.VCalendar; import jfxtras.icalendarfx.components.VEvent; import jfxtras.icalendarfx.properties.calendar.Version; public class SimpleCancelTest { @Test // new DTSTART and SUMMARY public void canProcessCancelIndividual() { String mainContent = "BEGIN:VCALENDAR" + System.lineSeparator() + "VERSION:2.0" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "ORGANIZER:mailto:a@example.com" + System.lineSeparator() + "DTSTART:19970705T200000Z" + System.lineSeparator() + "DTSTAMP:19970611T190000Z" + System.lineSeparator() + "SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES" + System.lineSeparator() + "UID:0981234-1234234-23@example.com" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; VCalendar main = VCalendar.parse(mainContent); String publish = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:CANCEL" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:2.0" + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "ORGANIZER:mailto:a@example.com" + System.lineSeparator() + "COMMENT:DUKES forfeit the game" + System.lineSeparator() + "SEQUENCE:2" + System.lineSeparator() + "UID:0981234-1234234-23@example.com" + System.lineSeparator() + "DTSTAMP:19970611T190000Z" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; VCalendar inputVCalendar = VCalendar.parse(publish); List<String> log = main.processITIPMessage(inputVCalendar); String expectedContent = "BEGIN:VCALENDAR" + System.lineSeparator() + "VERSION:2.0" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "END:VCALENDAR"; assertEquals(expectedContent, main.toString()); } @Test // use CANCEL for recurrence instance public void canDeleteOneInstance() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:CANCEL" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "STATUS:CANCELLED" + System.lineSeparator() + "RECURRENCE-ID:20160516T100000" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); VEvent vComponentExpected = ICalendarStaticComponents.getDaily1() .withExceptionDates(LocalDateTime.of(2016, 5, 16, 10, 0)) .withSequence(1); assertEquals(1, vComponents.size()); assertEquals(vComponentExpected, vComponents.get(0)); } @Test (expected = RuntimeException.class) public void canDetectTooLowSequence() { VCalendar mainVCalendar = new VCalendar(); final List<VEvent> vComponents = mainVCalendar.getVEvents(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1() .withSequence(2); vComponents.add(vComponentOriginal); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:CANCEL" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "STATUS:CANCELLED" + System.lineSeparator() + "RECURRENCE-ID:20160516T100000" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); // throws exception } @Test // use REQUEST with new EXDATE public void canDeleteOneInstance2() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20151109T100000" + System.lineSeparator() + "DTEND:20151109T110000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "EXDATE:20160516T100000" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); VEvent vComponentExpected = ICalendarStaticComponents.getDaily1() .withExceptionDates(LocalDateTime.of(2016, 5, 16, 10, 0)) .withSequence(1); assertEquals(1, vComponents.size()); assertEquals(vComponentExpected, vComponents.get(0)); } @Test // use CANCEL to delete a second recurrence public void canDeleteAnotherInstance() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1() .withExceptionDates(LocalDateTime.of(2016, 5, 16, 10, 0)) .withSequence(1); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:CANCEL" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "STATUS:CANCELLED" + System.lineSeparator() + "RECURRENCE-ID:20160515T100000" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); VEvent vComponentExpected = ICalendarStaticComponents.getDaily1() .withExceptionDates(LocalDateTime.of(2016, 5, 15, 10, 0), LocalDateTime.of(2016, 5, 16, 10, 0)) .withSequence(2); assertEquals(1, vComponents.size()); assertEquals(vComponentExpected, vComponents.get(0)); } @Test public void canDeleteRepeatableAll() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:CANCEL" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20151109T100000" + System.lineSeparator() + "DTEND:20151109T110000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "STATUS:CANCELLED" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); assertEquals(0, vComponents.size()); } @Test public void canDeleteThisAndFuture() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getWeeklyZoned(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:CANCEL" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "DTSTAMP:20151110T080000Z" + System.lineSeparator() + "DESCRIPTION:WeeklyZoned Description" + System.lineSeparator() + "SUMMARY:WeeklyZoned Summary" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "UID:20150110T080000-003@jfxtras.org" + System.lineSeparator() + "STATUS:CANCELLED" + System.lineSeparator() + "RECURRENCE-ID;TZID=America/Los_Angeles;RANGE=THISANDFUTURE:20160516T100000" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); VEvent vComponentExpected = ICalendarStaticComponents.getWeeklyZoned() .withSequence(1); vComponentExpected.getRecurrenceRule().getValue().setUntil("20160513T170000Z"); assertEquals(vComponentExpected, vComponents.get(0)); assertEquals(1, vComponents.size()); } @Test // use request message public void canDeleteThisAndFuture2() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getWeeklyZoned(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); assertEquals(1, vComponents.size()); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "DTEND;TZID=America/Los_Angeles:20151109T104500" + System.lineSeparator() + "DTSTAMP:20151110T080000Z" + System.lineSeparator() + "DTSTART;TZID=America/Los_Angeles:20151109T100000" + System.lineSeparator() + "DESCRIPTION:WeeklyZoned Description" + System.lineSeparator() + "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20160513T170000Z" + System.lineSeparator() + "SUMMARY:WeeklyZoned Summary" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "UID:20150110T080000-003@jfxtras.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); VEvent vComponentExpected = ICalendarStaticComponents.getWeeklyZoned() .withSequence(1); vComponentExpected.getRecurrenceRule().getValue().setUntil("20160513T170000Z"); assertEquals(vComponentExpected, vComponents.get(0)); assertEquals(1, vComponents.size()); } }