package de.knurt.fam.test.unit.bookbehaviour;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.util.Calendar;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import de.knurt.fam.core.model.persist.FacilityAvailability;
import de.knurt.fam.core.util.booking.BookingFinder;
import de.knurt.fam.core.util.booking.TimeBookingRequest;
import de.knurt.fam.test.utils.TeztBeanSimpleFactory;
import de.knurt.heinzelmann.util.time.SimpleTimeFrame;
import de.knurt.heinzelmann.util.time.TimeFrame;
/**
*
* @author Daniel Oltmanns <info@knurt.de>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/test-dependencies.xml" })
public class BookingFinderTest {
@Test
@Ignore // TODO
public void getNextTo_onMaintenance_1hour_validUnits() {
TimeBookingRequest tbr = TeztBeanSimpleFactory.getBookingRequest();
// insert da for same facility
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.setFacilityKey(tbr.getFacility().getKey());
da.setNotAvailableBecauseOfMaintenance();
Calendar start = Calendar.getInstance();
start.set(Calendar.HOUR_OF_DAY, 0);
start.set(Calendar.MINUTE, 0);
start.set(Calendar.SECOND, 0);
start.set(Calendar.MILLISECOND, 0);
start.add(Calendar.DAY_OF_YEAR, 10);
Calendar end = (Calendar) start.clone();
end.add(Calendar.HOUR_OF_DAY, 1);
TimeFrame tfMaintenance = new SimpleTimeFrame(start, end);
da.setBasePeriodOfTime(tfMaintenance);
da.insert();
// create tbr
tbr.getFacility().setCapacityUnits(30);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMinBookableTimeUnits(3 * 96);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMaxBookableTimeUnits(30 * 96);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMinBookableCapacityUnits(3);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMaxBookableCapacityUnits(30);
tbr.getFacility().getBookingRule().setSmallestMinutesBookable(15);
// on same time as maintenance with valid capacity and time units
tbr.setRequestedCapacityUnits(3);
tbr.setRequestedStartTime(start);
tbr.setRequestedTimeUnits(3 * 96);
assertFalse(tbr.isAvailable());
List<TimeBookingRequest> tbrsBack = BookingFinder.getBookingRequestNextTo(tbr);
assertEquals(2, tbrsBack.size());
TimeBookingRequest gotBack = tbrsBack.get(0);
assertTrue(gotBack.isAvailable());
assertEquals(gotBack.getRequestedStartTime().getTimeInMillis(), end.getTimeInMillis());
assertEquals(gotBack.getRequestedCapacityUnits(), tbr.getRequestedCapacityUnits());
assertEquals(gotBack.getRequestedTimeUnits(), tbr.getRequestedTimeUnits());
}
@Test
public void tbr_clone1() {
TimeBookingRequest tbr = TeztBeanSimpleFactory.getBookingRequest(TeztBeanSimpleFactory.getFacilityBookable(TeztBeanSimpleFactory.KEY_FACILITY_BOOKABLE_2));
tbr.getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMaxBookableCapacityUnits(10);
TimeBookingRequest clone = (TimeBookingRequest) tbr.clone();
assertEquals(tbr.getArticleNumber(), clone.getArticleNumber());
tbr.setRequestedCapacityUnits(5);
assertEquals(5, tbr.getRequestedCapacityUnits());
assertEquals(1, clone.getRequestedCapacityUnits());
assertNotSame(tbr.getArticleNumber(), clone.getArticleNumber());
assertFalse(tbr.getArticleNumber().equals(clone.getArticleNumber()));
}
@Test
public void tbr_clone2() {
TimeBookingRequest tbr = TeztBeanSimpleFactory.getBookingRequest();
tbr.getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMaxBookableTimeUnits(10);
TimeBookingRequest clone = (TimeBookingRequest) tbr.clone();
assertEquals(tbr.getArticleNumber(), clone.getArticleNumber());
tbr.setRequestedTimeUnits(5);
assertEquals(5, tbr.getRequestedTimeUnits());
assertEquals(1, clone.getRequestedTimeUnits());
assertNotSame(tbr.getArticleNumber(), clone.getArticleNumber());
assertFalse(tbr.getArticleNumber().equals(clone.getArticleNumber()));
}
@Test
public void getNextTo_onMaintenance_1day_validUnits() {
TimeBookingRequest tbr = TeztBeanSimpleFactory.getBookingRequest();
// insert da for same facility
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.setFacilityKey(tbr.getFacility().getKey());
da.setNotAvailableBecauseOfMaintenance();
Calendar start = Calendar.getInstance();
start.set(Calendar.HOUR_OF_DAY, 0);
start.set(Calendar.MINUTE, 0);
start.set(Calendar.SECOND, 0);
start.set(Calendar.MILLISECOND, 0);
start.add(Calendar.DAY_OF_YEAR, 10);
Calendar end = (Calendar) start.clone();
end.add(Calendar.DAY_OF_YEAR, 1);
TimeFrame tfMaintenance = new SimpleTimeFrame(start, end);
da.setBasePeriodOfTime(tfMaintenance);
da.insert();
// create tbr
tbr.getFacility().setCapacityUnits(30);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMinBookableTimeUnits(3 * 96);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMaxBookableTimeUnits(30 * 96);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMinBookableCapacityUnits(3);
tbr.getFacility().getBookingRule().getSetOfRulesForARole(tbr.getUser()).setMaxBookableCapacityUnits(30);
tbr.getFacility().getBookingRule().setSmallestMinutesBookable(15);
// on same time as maintenance with valid capacity and time units
tbr.setRequestedCapacityUnits(3);
tbr.setRequestedStartTime(start);
tbr.setRequestedTimeUnits(3 * 96);
assertFalse(tbr.isAvailable());
List<TimeBookingRequest> tbrsBack = BookingFinder.getBookingRequestNextTo(tbr);
assertEquals(2, tbrsBack.size());
TimeBookingRequest gotBack = tbrsBack.get(0);
assertEquals(gotBack.getRequestedStartTime().getTimeInMillis(), end.getTimeInMillis());
assertEquals(gotBack.getRequestedCapacityUnits(), tbr.getRequestedCapacityUnits());
assertEquals(gotBack.getRequestedTimeUnits(), tbr.getRequestedTimeUnits());
}
}