/**
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jasig.schedassist.impl.caldav;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.DateTime;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.component.VTimeZone;
import net.fortuna.ical4j.model.property.Uid;
import org.apache.commons.lang.time.DateUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.protocol.HttpContext;
import org.jasig.schedassist.model.DefaultEventUtilsImpl;
import org.jasig.schedassist.model.ICalendarAccount;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
/**
* Tests for {@link CaldavCalendarDataDaoImpl}.
*
* @author Nicholas Blair
*/
public class CaldavCalendarDataDaoImplTest {
@Test
public void testMergeEmpty() {
Calendar left = new Calendar();
Calendar right = new Calendar();
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.merge(left, right);
Assert.assertNotNull(result);
Assert.assertEquals(0, result.getComponents().size());
}
@Test
public void testMergeControl() {
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
VEvent event1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "event 1");
event1.getProperties().add(new Uid("abcde12345"));
Calendar left = eventUtils.wrapEventInCalendar(event1);
VEvent event2 = new VEvent(new DateTime(DateUtils.addHours(now, 1)), new DateTime(DateUtils.addHours(now, 2)), "event 2");
event2.getProperties().add(new Uid("abcde12346"));
Calendar right = eventUtils.wrapEventInCalendar(event2);
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.merge(left, right);
Assert.assertNotNull(result);
Assert.assertEquals(2, result.getComponents().size());
}
@Test
public void testMergeWithTimezones() {
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone _timeZone = registry.getTimeZone("America/Chicago");
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
VEvent event1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "event 1");
event1.getProperties().add(new Uid("abcde12345"));
Calendar left = eventUtils.wrapEventInCalendar(event1);
left.getComponents().add(_timeZone.getVTimeZone());
VEvent event2 = new VEvent(new DateTime(DateUtils.addHours(now, 1)), new DateTime(DateUtils.addHours(now, 2)), "event 2");
event2.getProperties().add(new Uid("abcde12346"));
Calendar right = eventUtils.wrapEventInCalendar(event2);
right.getComponents().add(_timeZone.getVTimeZone());
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.merge(left, right);
Assert.assertNotNull(result);
Assert.assertEquals(3, result.getComponents().size());
Assert.assertEquals(2, result.getComponents(VEvent.VEVENT).size());
Assert.assertEquals(1, result.getComponents(VTimeZone.VTIMEZONE).size());
}
@Test
public void testMergeThreeCalendarsWithTimezones() {
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone _timeZone = registry.getTimeZone("America/Chicago");
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
VEvent target1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "target");
target1.getProperties().add(new Uid("abcde12344"));
Calendar target = eventUtils.wrapEventInCalendar(target1);
target.getComponents().add(_timeZone.getVTimeZone());
VEvent event1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "event 1");
event1.getProperties().add(new Uid("abcde12345"));
Calendar left = eventUtils.wrapEventInCalendar(event1);
left.getComponents().add(_timeZone.getVTimeZone());
VEvent event2 = new VEvent(new DateTime(DateUtils.addHours(now, 1)), new DateTime(DateUtils.addHours(now, 2)), "event 2");
event2.getProperties().add(new Uid("abcde12346"));
Calendar right = eventUtils.wrapEventInCalendar(event2);
right.getComponents().add(_timeZone.getVTimeZone());
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
calendarDataDao.merge(target, left, right);
Assert.assertEquals(4, target.getComponents().size());
Assert.assertEquals(3, target.getComponents(VEvent.VEVENT).size());
Assert.assertEquals(1, target.getComponents(VTimeZone.VTIMEZONE).size());
}
@Test
public void testConsolidateFourCalendarsWithTimezones() {
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone _timeZone = registry.getTimeZone("America/Chicago");
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
VEvent target1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "target");
target1.getProperties().add(new Uid("abcde12344"));
Calendar calendar1 = eventUtils.wrapEventInCalendar(target1);
calendar1.getComponents().add(_timeZone.getVTimeZone());
VEvent event1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "event 1");
event1.getProperties().add(new Uid("abcde12345"));
Calendar calendar2 = eventUtils.wrapEventInCalendar(event1);
calendar2.getComponents().add(_timeZone.getVTimeZone());
VEvent event2 = new VEvent(new DateTime(DateUtils.addHours(now, 1)), new DateTime(DateUtils.addHours(now, 2)), "event 2");
event2.getProperties().add(new Uid("abcde12346"));
Calendar calendar3 = eventUtils.wrapEventInCalendar(event2);
calendar3.getComponents().add(_timeZone.getVTimeZone());
VEvent event3 = new VEvent(new DateTime(DateUtils.addHours(now, 2)), new DateTime(DateUtils.addHours(now, 3)), "event 3");
event3.getProperties().add(new Uid("abcde12347"));
Calendar calendar4 = eventUtils.wrapEventInCalendar(event3);
calendar4.getComponents().add(_timeZone.getVTimeZone());
List<CalendarWithURI> calendars = new ArrayList<CalendarWithURI>();
calendars.add(new CalendarWithURI(calendar1, null));
calendars.add(new CalendarWithURI(calendar2, null));
calendars.add(new CalendarWithURI(calendar3, null));
calendars.add(new CalendarWithURI(calendar4, null));
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(calendars);
Assert.assertEquals(5, result.getComponents().size());
Assert.assertEquals(4, result.getComponents(VEvent.VEVENT).size());
Assert.assertEquals(1, result.getComponents(VTimeZone.VTIMEZONE).size());
}
@Test
public void testMergeWithDifferentTimezones() {
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone _timeZone1 = registry.getTimeZone("America/Chicago");
TimeZone _timeZone2 = registry.getTimeZone("America/New_York");
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
VEvent event1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "event 1");
event1.getProperties().add(new Uid("abcde12345"));
Calendar left = eventUtils.wrapEventInCalendar(event1);
left.getComponents().add(_timeZone1.getVTimeZone());
VEvent event2 = new VEvent(new DateTime(DateUtils.addHours(now, 1)), new DateTime(DateUtils.addHours(now, 2)), "event 2");
event2.getProperties().add(new Uid("abcde12346"));
Calendar right = eventUtils.wrapEventInCalendar(event2);
right.getComponents().add(_timeZone2.getVTimeZone());
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.merge(left, right);
Assert.assertNotNull(result);
Assert.assertEquals(4, result.getComponents().size());
Assert.assertEquals(2, result.getComponents(VEvent.VEVENT).size());
Assert.assertEquals(2, result.getComponents(VTimeZone.VTIMEZONE).size());
}
@Test
public void testConsolidateFourCalendarsWithDifferentTimezones() {
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone _timeZone = registry.getTimeZone("America/Chicago");
TimeZone _timeZone2 = registry.getTimeZone("America/Los_Angeles");
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
VEvent target1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "target");
target1.getProperties().add(new Uid("abcde12344"));
Calendar calendar1 = eventUtils.wrapEventInCalendar(target1);
calendar1.getComponents().add(_timeZone.getVTimeZone());
VEvent event1 = new VEvent(new DateTime(now), new DateTime(DateUtils.addHours(now, 1)), "event 1");
event1.getProperties().add(new Uid("abcde12345"));
Calendar calendar2 = eventUtils.wrapEventInCalendar(event1);
calendar2.getComponents().add(_timeZone.getVTimeZone());
VEvent event2 = new VEvent(new DateTime(DateUtils.addHours(now, 1)), new DateTime(DateUtils.addHours(now, 2)), "event 2");
event2.getProperties().add(new Uid("abcde12346"));
Calendar calendar3 = eventUtils.wrapEventInCalendar(event2);
calendar3.getComponents().add(_timeZone.getVTimeZone());
VEvent event3 = new VEvent(new DateTime(DateUtils.addHours(now, 2)), new DateTime(DateUtils.addHours(now, 3)), "event 3");
event3.getProperties().add(new Uid("abcde12347"));
Calendar calendar4 = eventUtils.wrapEventInCalendar(event3);
calendar4.getComponents().add(_timeZone2.getVTimeZone());
List<CalendarWithURI> calendars = new ArrayList<CalendarWithURI>();
calendars.add(new CalendarWithURI(calendar1, null));
calendars.add(new CalendarWithURI(calendar2, null));
calendars.add(new CalendarWithURI(calendar3, null));
calendars.add(new CalendarWithURI(calendar4, null));
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(calendars);
Assert.assertEquals(6, result.getComponents().size());
Assert.assertEquals(4, result.getComponents(VEvent.VEVENT).size());
Assert.assertEquals(2, result.getComponents(VTimeZone.VTIMEZONE).size());
}
@Test
public void testConsolidateEmpty() {
List<CalendarWithURI> list = Collections.emptyList();
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(list);
Assert.assertNotNull(result);
Assert.assertEquals(0, result.getComponents().size());
}
@Test
public void testConsolidateSize1List() {
List<CalendarWithURI> list = new ArrayList<CalendarWithURI>();
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
VEvent event = new VEvent(new DateTime(DateUtils.addHours(now, 1)), new DateTime(DateUtils.addHours(now, 2)), "event 2");
event.getProperties().add(new Uid("abcde12345"));
Calendar cal = eventUtils.wrapEventInCalendar(event);
CalendarWithURI withUri = new CalendarWithURI(cal, "/path/to/abcde12345");
list.add(withUri);
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(list);
Assert.assertNotNull(result);
Assert.assertEquals(1, result.getComponents().size());
}
@Test
public void testConsolidateSize2List() {
List<CalendarWithURI> list = new ArrayList<CalendarWithURI>();
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
for(int i = 0; i < 2; i++) {
VEvent event = new VEvent(new DateTime(DateUtils.addHours(now, i)), new DateTime(DateUtils.addHours(now, i + 1)), "event 2");
event.getProperties().add(new Uid("abcde1234" + i));
Calendar cal = eventUtils.wrapEventInCalendar(event);
CalendarWithURI withUri = new CalendarWithURI(cal, "/path/to/abcde1234" + i);
list.add(withUri);
}
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(list);
Assert.assertNotNull(result);
Assert.assertEquals(2, result.getComponents().size());
}
@Test
public void testConsolidateSize3List() {
List<CalendarWithURI> list = new ArrayList<CalendarWithURI>();
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
for(int i = 0; i < 3; i++) {
VEvent event = new VEvent(new DateTime(DateUtils.addHours(now, i)), new DateTime(DateUtils.addHours(now, i + 1)), "event 2");
event.getProperties().add(new Uid("abcde1234" + i));
Calendar cal = eventUtils.wrapEventInCalendar(event);
CalendarWithURI withUri = new CalendarWithURI(cal, "/path/to/abcde1234" + i);
list.add(withUri);
}
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(list);
Assert.assertNotNull(result);
Assert.assertEquals(3, result.getComponents().size());
}
@Test
public void testConsolidateEvenSizeList() {
List<CalendarWithURI> list = new ArrayList<CalendarWithURI>();
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
for(int i = 0; i < 10; i++) {
VEvent event = new VEvent(new DateTime(DateUtils.addHours(now, i)), new DateTime(DateUtils.addHours(now, i + 1)), "event 2");
event.getProperties().add(new Uid("abcde1234" + i));
Calendar cal = eventUtils.wrapEventInCalendar(event);
CalendarWithURI withUri = new CalendarWithURI(cal, "/path/to/abcde1234" + i);
list.add(withUri);
}
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(list);
Assert.assertNotNull(result);
Assert.assertEquals(10, result.getComponents().size());
}
@Test
public void testConsolidateOddSizeList() {
List<CalendarWithURI> list = new ArrayList<CalendarWithURI>();
java.util.Date now = new java.util.Date();
DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl();
for(int i = 0; i < 11; i++) {
VEvent event = new VEvent(new DateTime(DateUtils.addHours(now, i)), new DateTime(DateUtils.addHours(now, i + 1)), "event 2");
event.getProperties().add(new Uid("abcde1234" + i));
Calendar cal = eventUtils.wrapEventInCalendar(event);
CalendarWithURI withUri = new CalendarWithURI(cal, "/path/to/abcde1234" + i);
list.add(withUri);
}
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
Calendar result = calendarDataDao.consolidate(list);
Assert.assertNotNull(result);
Assert.assertEquals(11, result.getComponents().size());
}
@Test
public void testGetCalendarProblem1() throws ClientProtocolException, IOException {
java.util.Date now = new java.util.Date();
java.util.Date later = DateUtils.addDays(now, 1);
CaldavCalendarDataDaoImpl calendarDataDao = new CaldavCalendarDataDaoImpl();
ICalendarAccount calendarAccount = mock(ICalendarAccount.class);
when(calendarAccount.getAttributeValue("uid")).thenReturn("username");
when(calendarAccount.getEmailAddress()).thenReturn("username@server.edu");
DefaultCaldavDialectImpl dialect = new DefaultCaldavDialectImpl();
dialect.setCaldavHost(URI.create("http://localhost:8080/"));
calendarDataDao.setCaldavDialect(dialect);
DefaultCredentialsProviderFactoryImpl credentialsProviderFactory = new DefaultCredentialsProviderFactoryImpl();
credentialsProviderFactory.setCaldavAdminUsername("username");
credentialsProviderFactory.setCaldavAdminPassword("password");
calendarDataDao.setCredentialsProviderFactory(credentialsProviderFactory);
Resource problemResponse1 = new ClassPathResource("caldav-examples/report-response-problem1.xml");
HttpResponse response = mock(HttpResponse.class);
HttpEntity entity = mock(HttpEntity.class);
when(entity.getContent()).thenReturn(problemResponse1.getInputStream());
StatusLine statusLine = mock(StatusLine.class);
when(statusLine.getStatusCode()).thenReturn(207);
when(response.getStatusLine()).thenReturn(statusLine);
when(response.getEntity()).thenReturn(entity);
HttpClient httpClient = mock(HttpClient.class);
when(httpClient.execute((HttpHost) eq(null), isA(HttpRequest.class), isA(HttpContext.class))).thenReturn(response);
calendarDataDao.setHttpClient(httpClient);
Calendar calendar = calendarDataDao.getCalendar(calendarAccount, now, later);
Assert.assertNotNull(calendar);
}
}