/*
* Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de)
*
* Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://creativecommons.org/licenses/by-nc-sa/3.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 de.knurt.fam.test.unit.db.ibatis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Calendar;
import java.util.List;
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.config.FacilityBookable;
import de.knurt.fam.core.model.persist.FacilityAvailability;
import de.knurt.fam.core.model.persist.booking.Booking;
import de.knurt.fam.core.model.persist.booking.TimeBooking;
import de.knurt.fam.core.persistence.dao.FamDaoProxy;
import de.knurt.fam.test.utils.FamIBatisTezt;
import de.knurt.fam.test.utils.TeztBeanSimpleFactory;
import de.knurt.heinzelmann.util.time.SimpleTimeFrame;
import de.knurt.heinzelmann.util.time.TimeFrame;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/test-dependencies.xml" })
public class FacilityAvailabilityBookingsTest extends FamIBatisTezt {
/**
*
*/
@Test
public void facilityAvailabilityNotice() {
this.clearDatabase();
String testNotice = "foo";
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.setNotice(testNotice);
assertEquals(testNotice, da.getNotice());
da.insert();
FacilityAvailability daBack = FamDaoProxy.facilityDao().getAll().get(0);
assertEquals(testNotice, daBack.getNotice());
}
/**
*
*/
@Test
public void facilityAvailabilityHasNotice() {
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
assertFalse(da.hasNotice());
da.setNotice(" ");
assertFalse(da.hasNotice());
da.setNotice(" foo bar!");
assertTrue(da.hasNotice());
}
/**
*
*/
@Test
public void insertGetAndDelete() {
this.clearDatabase();
// insert
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.insert();
long testid = da.getFacilityAvailabilityId();
// selftest
List<FacilityAvailability> das = FamDaoProxy.facilityDao().getAll();
assertNotNull(das);
assertEquals(1, das.size());
assertEquals(testid, das.get(0).getFacilityAvailabilityId());
// get example
FacilityAvailability example = new FacilityAvailability();
example.setFacilityAvailabilityId(testid);
FacilityAvailability got = FamDaoProxy.facilityDao().getOneLike(example);
// selftest
assertEquals(example.getFacilityAvailabilityId(), got.getFacilityAvailabilityId());
// delete
got.delete();
// nothing there anymoe
das = FamDaoProxy.facilityDao().getAll();
assertEquals(0, das.size());
}
@Test
public void cancelOverlappingBookings() {
this.clearDatabase();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
TimeBooking b_a = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
b_a.setApplied();
b_a.insert();
List<Booking> bookings = FamDaoProxy.bookingDao().getUncanceledBookingsAndApplicationsIn(bd, b_a);
assertEquals(1, bookings.size());
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.setBasePeriodOfTime(b_a);
da.setFacilityKey(bd.getKey());
da.setNotAvailableBecauseOfMaintenance();
da.insert(); // assert this kills the application above
bookings = FamDaoProxy.bookingDao().getUncanceledBookingsAndApplicationsIn(bd, b_a);
assertEquals(0, bookings.size());
}
@Test
public void mustNotStartHere_daEqualsTimeStart() {
this.clearDatabase();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
TimeBooking b_a = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.setBasePeriodOfTime(b_a);
da.setFacilityKey(bd.getKey());
da.setMustNotStartHere();
da.insert();
assertEquals(b_a.getCalendarStart(), da.getBasePeriodOfTime().getCalendarStart());
b_a.setBooked();
assertFalse(b_a.isAvailableForInsertion());
}
@Test
public void mustNotStartHere_daBeforeTimeStart() {
this.clearDatabase();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
TimeBooking b_a = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
TimeFrame minutesBefore = new SimpleTimeFrame(b_a.getCalendarStart(), b_a.getCalendarEnd());
minutesBefore.add(Calendar.MINUTE, -2);
assertTrue(minutesBefore.getDuration() > 2 * 60 * 1000);
assertTrue(b_a.getDuration() > 2 * 60 * 1000);
assertTrue(minutesBefore.getCalendarStart().before(b_a.getCalendarStart()));
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.setBasePeriodOfTime(minutesBefore);
da.setFacilityKey(bd.getKey());
da.setMustNotStartHere();
da.insert();
b_a.setBooked();
assertFalse(b_a.isAvailableForInsertion());
}
@Test
public void mustNotStartHere_daAfterTimeStart() {
this.clearDatabase();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
TimeBooking b_a = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
TimeFrame minutesAfter = new SimpleTimeFrame(b_a.getCalendarStart(), b_a.getCalendarEnd());
minutesAfter.add(Calendar.MINUTE, 2);
assertTrue(minutesAfter.getDuration() > 2 * 60 * 1000);
assertTrue(b_a.getDuration() > 2 * 60 * 1000);
assertTrue(minutesAfter.getCalendarStart().after(b_a.getCalendarStart()));
FacilityAvailability da = TeztBeanSimpleFactory.getValidFacilityAvailability();
da.setBasePeriodOfTime(minutesAfter);
da.setFacilityKey(bd.getKey());
da.setMustNotStartHere();
da.insert();
b_a.setBooked();
assertTrue(b_a.isAvailableForInsertion());
}
}