org.jasig.schedassist.impl.SchedulingAssistantServiceImplTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.schedassist.impl.SchedulingAssistantServiceImplTest.java

Source

/**
 * 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;

import java.sql.SQLException;

import junit.framework.Assert;
import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.Attendee;

import org.easymock.EasyMock;
import org.jasig.schedassist.ICalendarDataDao;
import org.jasig.schedassist.NullAffiliationSourceImpl;
import org.jasig.schedassist.SchedulingException;
import org.jasig.schedassist.impl.owner.AvailableScheduleDao;
import org.jasig.schedassist.impl.owner.DefaultScheduleOwnerImpl;
import org.jasig.schedassist.impl.visitor.DefaultScheduleVisitorImpl;
import org.jasig.schedassist.model.AppointmentRole;
import org.jasig.schedassist.model.AvailableBlock;
import org.jasig.schedassist.model.AvailableBlockBuilder;
import org.jasig.schedassist.model.CommonDateOperations;
import org.jasig.schedassist.model.DefaultEventUtilsImpl;
import org.jasig.schedassist.model.mock.MockCalendarAccount;
import org.junit.Test;
import org.springframework.jdbc.CannotGetJdbcConnectionException;

/**
 * Test bench for {@link SchedulingAssistantServiceImpl}.
 *  
 * @author Nicholas Blair, nblair@doit.wisc.edu
 * @version $Id: AvailableServiceImplTest.java 1914 2010-04-14 21:17:42Z npblair $
 */
public class SchedulingAssistantServiceImplTest {

    /**
     * Expect a OracleCalendarDataAccessException to bubble up.
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentCalendarDaoUnavailable() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("user2");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 1);

        // create mock CalendarDao and AvailableScheduleDao
        ICalendarDataDao mockCalendarDao = EasyMock.createMock(ICalendarDataDao.class);
        mockCalendarDao.checkForConflicts(owner, targetBlock);
        EasyMock.expectLastCall().andThrow(new RuntimeException());
        AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner,
                CommonDateOperations.parseDateTimePhrase("20091111-1330"))).andReturn(targetBlock);
        EasyMock.replay(mockCalendarDao, mockScheduleDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setAvailableScheduleDao(mockScheduleDao);
        serviceImpl.setCalendarDataDao(mockCalendarDao);

        try {
            serviceImpl.scheduleAppointment(visitor, owner, targetBlock, "description");
            Assert.fail("expected RuntimeException not thrown");
        } catch (RuntimeException e) {
            // success
        }

        EasyMock.verify(mockCalendarDao, mockScheduleDao);
    }

    /**
     * Expect a DataAccessException to bubble up.
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentAvailableScheduleDaoUnavailable() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("user2");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 1);

        AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner, targetBlock.getStartTime()))
                .andThrow(new CannotGetJdbcConnectionException("database unavailable", new SQLException()));
        EasyMock.replay(mockScheduleDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setAvailableScheduleDao(mockScheduleDao);

        try {
            serviceImpl.scheduleAppointment(visitor, owner, targetBlock, "description");
            Assert.fail("expected CannotGetJdbcConnectionException not thrown");
        } catch (CannotGetJdbcConnectionException e) {
            // success
        }

        EasyMock.verify(mockScheduleDao);
    }

    /**
     * Expect {@link AvailableServiceImpl#scheduleAppointment(ScheduleVisitor, ScheduleOwner, AvailableBlock, String)}
     * to return null for {@link ScheduleOwner#isSamePerson(ScheduleVisitor)} returning true.
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentOwnerVisitorSamePerson() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor from same person
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(ownerAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 1);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        Assert.assertNull(serviceImpl.scheduleAppointment(visitor, owner, targetBlock, "description"));
    }

    /**
     * Expect a SchedulingException
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentNotInSchedule() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("user2");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 1);

        AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner, targetBlock.getStartTime())).andReturn(null);
        EasyMock.replay(mockScheduleDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setAvailableScheduleDao(mockScheduleDao);

        try {
            serviceImpl.scheduleAppointment(visitor, owner, targetBlock, "description");
            Assert.fail("expected SchedulingException not thrown");
        } catch (SchedulingException e) {
            // success
        }

        EasyMock.verify(mockScheduleDao);
    }

    /**
     * Expect a SchedulingException
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentVisitorLimitExceeded() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        ownerAccount.setEmailAddress("owner@domain.com");
        ownerAccount.setDisplayName("OWNER OWNER");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("v1");
        visitorAccount.setEmailAddress("v1@doit.wisc.edu");
        visitorAccount.setDisplayName("VISITOR ONE");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);
        // construct 2nd visitor
        MockCalendarAccount visitor2Account = new MockCalendarAccount();
        visitor2Account.setUsername("v2");
        visitor2Account.setEmailAddress("v2@doit.wisc.edu");
        visitor2Account.setDisplayName("VISITOR TWO");
        DefaultScheduleVisitorImpl visitor2 = new DefaultScheduleVisitorImpl(visitor2Account);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 2);

        DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl(new NullAffiliationSourceImpl());
        // construct expected VEvent
        VEvent expectedEvent = eventUtils.constructAvailableAppointment(targetBlock, owner, visitor, "description");
        expectedEvent.getProperties().add(eventUtils
                .constructSchedulingAssistantAttendee(visitor2.getCalendarAccount(), AppointmentRole.VISITOR));

        // create mock CalendarDao and AvailableScheduleDao
        ICalendarDataDao mockCalendarDao = EasyMock.createMock(ICalendarDataDao.class);
        EasyMock.expect(mockCalendarDao.getExistingAppointment(owner, targetBlock)).andReturn(expectedEvent);

        AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner,
                CommonDateOperations.parseDateTimePhrase("20091111-1330"))).andReturn(targetBlock);
        EasyMock.replay(mockCalendarDao, mockScheduleDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setAvailableScheduleDao(mockScheduleDao);
        serviceImpl.setCalendarDataDao(mockCalendarDao);
        serviceImpl.setEventUtils(new DefaultEventUtilsImpl(new NullAffiliationSourceImpl()));

        // construct 3rd visitor
        MockCalendarAccount visitor3Account = new MockCalendarAccount();
        visitor3Account.setUsername("v3");
        visitor3Account.setEmailAddress("v3@doit.wisc.edu");
        visitor3Account.setDisplayName("VISITOR THREE");
        DefaultScheduleVisitorImpl visitor3 = new DefaultScheduleVisitorImpl(visitor3Account);

        try {
            serviceImpl.scheduleAppointment(visitor3, owner, targetBlock, "description");
            Assert.fail("expected SchedulingException not thrown");
        } catch (SchedulingException e) {
            // success
        }

        EasyMock.verify(mockCalendarDao, mockScheduleDao);
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentControl() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        ownerAccount.setEmailAddress("owner@domain.com");
        ownerAccount.setDisplayName("OWNER OWNER");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("v1");
        visitorAccount.setEmailAddress("v1@doit.wisc.edu");
        visitorAccount.setDisplayName("VISITOR ONE");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 1);

        // construct successfull VEvent
        VEvent expectedEvent = new VEvent();

        // create mock CalendarDao and AvailableScheduleDao
        ICalendarDataDao mockCalendarDao = EasyMock.createMock(ICalendarDataDao.class);
        mockCalendarDao.checkForConflicts(owner, targetBlock);
        EasyMock.expectLastCall();
        EasyMock.expect(mockCalendarDao.createAppointment(visitor, owner, targetBlock, "description"))
                .andReturn(expectedEvent);
        AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner,
                CommonDateOperations.parseDateTimePhrase("20091111-1330"))).andReturn(targetBlock);
        EasyMock.replay(mockCalendarDao, mockScheduleDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setAvailableScheduleDao(mockScheduleDao);
        serviceImpl.setCalendarDataDao(mockCalendarDao);

        VEvent event = serviceImpl.scheduleAppointment(visitor, owner, targetBlock, "description");
        Assert.assertEquals(expectedEvent, event);

        EasyMock.verify(mockCalendarDao, mockScheduleDao);
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentMultipleVisitorsCreate() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        ownerAccount.setEmailAddress("owner@domain.com");
        ownerAccount.setDisplayName("OWNER OWNER");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("v1");
        visitorAccount.setEmailAddress("v1@doit.wisc.edu");
        visitorAccount.setDisplayName("VISITOR ONE");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 2);

        // construct expected VEvent
        VEvent expectedEvent = new VEvent();

        // create mock CalendarDao and AvailableScheduleDao
        ICalendarDataDao mockCalendarDao = EasyMock.createMock(ICalendarDataDao.class);
        EasyMock.expect(mockCalendarDao.getExistingAppointment(owner, targetBlock)).andReturn(null);
        mockCalendarDao.checkForConflicts(owner, targetBlock);
        EasyMock.expectLastCall();
        EasyMock.expect(mockCalendarDao.createAppointment(visitor, owner, targetBlock, "description"))
                .andReturn(expectedEvent);
        AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner,
                CommonDateOperations.parseDateTimePhrase("20091111-1330"))).andReturn(targetBlock);
        EasyMock.replay(mockCalendarDao, mockScheduleDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setAvailableScheduleDao(mockScheduleDao);
        serviceImpl.setCalendarDataDao(mockCalendarDao);

        VEvent event = serviceImpl.scheduleAppointment(visitor, owner, targetBlock, "description");
        Assert.assertEquals(expectedEvent, event);

        EasyMock.verify(mockCalendarDao, mockScheduleDao);
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testScheduleAppointmentMultipleVisitorsJoin() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        ownerAccount.setEmailAddress("owner@domain.com");
        ownerAccount.setDisplayName("OWNER OWNER");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("v1");
        visitorAccount.setEmailAddress("v1@doit.wisc.edu");
        visitorAccount.setDisplayName("VISITOR ONE");
        DefaultScheduleVisitorImpl alreadyAcceptedVisitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 2);

        DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl(new NullAffiliationSourceImpl());
        // construct existing VEvent
        VEvent existingEvent = eventUtils.constructAvailableAppointment(targetBlock, owner, alreadyAcceptedVisitor,
                null);

        // construct 2nd visitor
        MockCalendarAccount visitor2Account = new MockCalendarAccount();
        visitor2Account.setUsername("v2");
        visitor2Account.setEmailAddress("v2@doit.wisc.edu");
        visitor2Account.setDisplayName("VISITOR TWO");
        DefaultScheduleVisitorImpl newVisitor = new DefaultScheduleVisitorImpl(visitor2Account);

        // construct expected result event
        VEvent expectedEvent = new VEvent(new PropertyList(existingEvent.getProperties()));
        Attendee newAttendee = eventUtils.constructSchedulingAssistantAttendee(newVisitor.getCalendarAccount(),
                AppointmentRole.VISITOR);
        expectedEvent.getProperties().add(newAttendee);

        // create mock CalendarDao and AvailableScheduleDao
        ICalendarDataDao mockCalendarDao = EasyMock.createMock(ICalendarDataDao.class);
        EasyMock.expect(mockCalendarDao.getExistingAppointment(owner, targetBlock)).andReturn(existingEvent);
        EasyMock.expect(mockCalendarDao.joinAppointment(newVisitor, owner, existingEvent)).andReturn(expectedEvent);
        AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner,
                CommonDateOperations.parseDateTimePhrase("20091111-1330"))).andReturn(targetBlock);
        EasyMock.replay(mockCalendarDao, mockScheduleDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setAvailableScheduleDao(mockScheduleDao);
        serviceImpl.setCalendarDataDao(mockCalendarDao);
        serviceImpl.setEventUtils(new DefaultEventUtilsImpl(new NullAffiliationSourceImpl()));

        VEvent event = serviceImpl.scheduleAppointment(newVisitor, owner, targetBlock, null);
        Assert.assertEquals(expectedEvent, event);

        EasyMock.verify(mockCalendarDao, mockScheduleDao);
    }

    /**
     * Expect {@link AvailableServiceImpl#cancelAppointment(ScheduleVisitor, ScheduleOwner, VEvent)}
     * to return immediately for {@link ScheduleOwner#isSamePerson(ScheduleVisitor)} returning true.
     * @throws Exception
     */
    @Test
    public void testCancelAppointmentOwnerVisitorSamePerson() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor from same person
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(ownerAccount);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        // this call will throw exception due to missing daos if owner.isSamePerson(visitor) equals false
        serviceImpl.cancelAppointment(visitor, owner, null, null, "cancel reason");
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testCancelAppointmentMultipleVisitorsLeave() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        ownerAccount.setEmailAddress("owner@domain.com");
        ownerAccount.setDisplayName("OWNER OWNER");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("v1");
        visitorAccount.setEmailAddress("v1@doit.wisc.edu");
        visitorAccount.setDisplayName("VISITOR ONE");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 2);

        DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl(new NullAffiliationSourceImpl());
        // construct existing VEvent
        VEvent existingEvent = eventUtils.constructAvailableAppointment(targetBlock, owner, visitor,
                "event description");
        Attendee newAttendee = eventUtils.constructSchedulingAssistantAttendee(visitor.getCalendarAccount(),
                AppointmentRole.VISITOR);
        existingEvent.getProperties().add(newAttendee);

        // construct expected result
        VEvent expectedEvent = new VEvent(new PropertyList(existingEvent.getProperties()));
        expectedEvent.getProperties().remove(newAttendee);

        // create mock CalendarDao and AvailableScheduleDao
        ICalendarDataDao mockCalendarDao = EasyMock.createMock(ICalendarDataDao.class);
        EasyMock.expect(mockCalendarDao.getExistingAppointment(owner, targetBlock)).andReturn(existingEvent);
        EasyMock.expect(mockCalendarDao.leaveAppointment(visitor, owner, existingEvent)).andReturn(expectedEvent);
        //AvailableScheduleDao mockScheduleDao = EasyMock.createMock(AvailableScheduleDao.class);
        //EasyMock.expect(mockScheduleDao.retrieveTargetBlock(owner, CommonDateOperations.parseDateTimePhrase("20091111-1330"))).andReturn(targetBlock);
        EasyMock.replay(mockCalendarDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        //serviceImpl.setAvailableScheduleDao(mockScheduleDao);
        serviceImpl.setCalendarDataDao(mockCalendarDao);
        serviceImpl.setEventUtils(new DefaultEventUtilsImpl(new NullAffiliationSourceImpl()));

        serviceImpl.cancelAppointment(visitor, owner, existingEvent, targetBlock, "cancel reason");

        EasyMock.verify(mockCalendarDao);
    }

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testCancelAppointmentControl() throws Exception {
        // construct a schedule owner
        MockCalendarAccount ownerAccount = new MockCalendarAccount();
        ownerAccount.setUsername("user1");
        ownerAccount.setEmailAddress("owner@domain.com");
        ownerAccount.setDisplayName("OWNER OWNER");
        DefaultScheduleOwnerImpl owner = new DefaultScheduleOwnerImpl(ownerAccount, 1);

        // construct a schedule visitor
        MockCalendarAccount visitorAccount = new MockCalendarAccount();
        visitorAccount.setUsername("v1");
        visitorAccount.setEmailAddress("v1@doit.wisc.edu");
        visitorAccount.setDisplayName("VISITOR ONE");
        DefaultScheduleVisitorImpl visitor = new DefaultScheduleVisitorImpl(visitorAccount);

        // construct target availableblock for appointment
        AvailableBlock targetBlock = AvailableBlockBuilder.createBlock("20091111-1330", "20091111-1400", 1);

        DefaultEventUtilsImpl eventUtils = new DefaultEventUtilsImpl(new NullAffiliationSourceImpl());
        // construct successfull VEvent
        VEvent expectedEvent = eventUtils.constructAvailableAppointment(targetBlock, owner, visitor, "description");

        // create mock CalendarDao and AvailableScheduleDao
        ICalendarDataDao mockCalendarDao = EasyMock.createMock(ICalendarDataDao.class);
        EasyMock.expect(mockCalendarDao.getExistingAppointment(owner, targetBlock)).andReturn(expectedEvent);
        mockCalendarDao.cancelAppointment(visitor, owner, expectedEvent);
        EasyMock.expectLastCall();
        EasyMock.replay(mockCalendarDao);

        SchedulingAssistantServiceImpl serviceImpl = new SchedulingAssistantServiceImpl();
        serviceImpl.setCalendarDataDao(mockCalendarDao);
        serviceImpl.setEventUtils(new DefaultEventUtilsImpl(new NullAffiliationSourceImpl()));

        serviceImpl.cancelAppointment(visitor, owner, expectedEvent, targetBlock, "cancel reason");

        EasyMock.verify(mockCalendarDao);
    }
}