/*
* Copyright 2002-2008 the original author or authors. * * 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.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Calendar;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.dao.DataIntegrityViolationException;
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.User;
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.BookingDao;
import de.knurt.fam.core.persistence.dao.FamDaoProxy;
import de.knurt.fam.core.persistence.dao.ibatis.BookingDao4ibatis;
import de.knurt.fam.core.util.booking.TimeBookingRequest;
import de.knurt.fam.test.utils.AssertSomehowEquals;
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;
/**
* @author Daniel Oltmanns
* @since 0.20090828
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/test-dependencies.xml" })
public class ReadWriteBookingsTest extends FamIBatisTezt {
/**
*
*/
@Test
public void stillAvailable() {
this.clearDatabase();
Booking booking = TeztBeanSimpleFactory.getNewValidBooking();
booking.setBooked();
assertTrue(booking.isAvailableForInsertion());
booking.insert();
assertFalse(booking.isAvailableForInsertion());
}
@Test
public void ticket_348() {
this.clearDatabase();
Booking booking = TeztBeanSimpleFactory.getNewValidBooking();
booking.setBooked();
booking.insert();
assertTrue(booking.getId() > 0);
Booking back = FamDaoProxy.bookingDao().getBookingWithId(booking.getId());
assertNotNull(back);
assertFalse(back.isCanceled());
}
/**
*
*/
@Test
public void constructDao() {
BookingDao bdao = FamDaoProxy.bookingDao();
assertEquals(BookingDao4ibatis.class, bdao.getClass());
}
/**
*
*/
@Test
public void cancelOverlappingBookings_notAllCapacities() {
this.clearDatabase();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
Booking b_a = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
b_a.setApplied();
b_a.insert();
List<Booking> bookings = FamDaoProxy.bookingDao().getUncanceledBookingsAndApplicationsIn(bd, b_a.getSessionTimeFrame());
assertEquals(1, bookings.size());
Booking b_b = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
b_b.setBooked();
b_b.insert();
assertEquals(1, b_b.getFacility().getCapacityUnits());
bookings = FamDaoProxy.bookingDao().getUncanceledBookingsAndApplicationsIn(bd, b_a.getSessionTimeFrame());
assertEquals(1, bookings.size());
AssertSomehowEquals.test(b_b, bookings.get(0));
}
/**
*
*/
@Test
public void id() {
this.clearDatabase();
Booking b_a = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
assertNull(b_a.getId());
b_a.setBooked();
b_a.insert();
assertNotNull(b_a.getId());
assertTrue(b_a.getId() > 0);
int a = b_a.getId();
Booking b_b = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
b_b.getSessionTimeFrame().add(Calendar.YEAR, 1);
b_b.setBooked();
b_b.insert();
int b = b_b.getId();
assertTrue(b + " > " + a, b > a);
}
/**
*
*/
@Test
public void aDebugTest_1() {
this.clearDatabase();
Booking b = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
b.setBooked();
b.insert();
assertFalse(b.isAvailableForInsertion());
TimeFrame tf = b.getSessionTimeFrame().clone();
assertFalse(b.isAvailableForInsertion());
tf.setCalendarEnd(Calendar.DAY_OF_YEAR, tf.getCalendarEnd().get(Calendar.DAY_OF_YEAR) + 2);
assertFalse(b.isAvailableForInsertion());
}
/**
*
*/
@Test
public void userHasToWait() {
this.clearDatabase();
// asserts
Integer verySafeId = 54654;
String veryLalaUsername = "lala";
// prepare
User user = TeztBeanSimpleFactory.getNewValidUser();
user.setRoleId("extern");
user.setUsername(veryLalaUsername);
user.insert();
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setUsername(user.getUsername());
booking.setBooked();
booking.getBookingRule().getSetOfRulesForARole(booking.getUser()).setMaxBookableCapacityUnits(verySafeId);
booking.setCapacityUnits(verySafeId);
try {
booking.insert();
fail("should have been thrown exception because user has to wait 24 h");
} catch (DataIntegrityViolationException e) {
assertTrue(true); // right exception because user has to wait 24 h
}
// get
List<Booking> bs = user.getBookings();
// test
assertEquals(0, bs.size());
}
/**
*
*/
@Test
public void userHasNOTToWait() {
this.clearDatabase();
// asserts
Integer verySafeId = 54654;
String veryLalaUsername = "lala";
// prepare
User user = TeztBeanSimpleFactory.getNewValidUser();
user.setRoleId("intern");
user.setUsername(veryLalaUsername);
user.insert();
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setUsername(user.getUsername());
booking.setBooked();
booking.getBookingRule().getSetOfRulesForARole(booking.getUser()).setMaxBookableCapacityUnits(verySafeId);
booking.setCapacityUnits(verySafeId);
try {
booking.insert();
assertTrue(true);
} catch (DataIntegrityViolationException e) {
fail("should not thrown an exception");
}
// get
List<Booking> bs = user.getBookings();
// test
assertEquals(1, bs.size());
assertEquals(veryLalaUsername, bs.get(0).getUsername());
assertEquals(verySafeId, bs.get(0).getCapacityUnits());
}
/**
*
*/
@Test
public void getBookingsAndApplicationsIn() {
this.clearDatabase();
TimeFrame tf = new SimpleTimeFrame();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
List<Booking> bookings = FamDaoProxy.bookingDao().getUncanceledBookingsAndApplicationsIn(bd, tf);
assertEquals(0, bookings.size());
tf.add(Calendar.DAY_OF_YEAR, 1);
tf.setEnd(tf.getStart() + 5000);
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
booking.getSessionTimeFrame().setEnd(tf.getEnd());
booking.getSessionTimeFrame().setStart(tf.getStart());
booking.insert();
tf.add(Calendar.SECOND, 2);
bookings = FamDaoProxy.bookingDao().getUncanceledBookingsAndApplicationsIn(bd, tf);
assertEquals(1, bookings.size());
}
/**
*
*/
@Test
public void getBookingsWithoutApplicationsIn_withException() {
this.clearDatabase();
TimeFrame tf = new SimpleTimeFrame();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
List<Booking> bookings = FamDaoProxy.bookingDao().getUncanceledBookingsWithoutApplicationsIn(bd, tf);
assertEquals(0, bookings.size());
tf.add(Calendar.DAY_OF_YEAR, 1);
tf.setEnd(tf.getStart() + 5000);
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
booking.getSessionTimeFrame().setEnd(tf.getEnd());
booking.getSessionTimeFrame().setStart(tf.getStart());
booking.insert();
tf.add(Calendar.SECOND, 2);
bookings = FamDaoProxy.bookingDao().getUncanceledBookingsWithoutApplicationsIn(bd, tf);
assertEquals(1, bookings.size());
booking.setApplied();
try {
booking.insert();
fail("should have thrown dataintegrityexception!");
} catch (Exception e) {
assertTrue(true);
}
try {
booking.update();
assertTrue(true);
} catch (Exception e) {
fail("should not have thrown dataintegrityexception!");
}
bookings = FamDaoProxy.bookingDao().getUncanceledBookingsWithoutApplicationsIn(bd, tf);
assertEquals(1, bookings.size());
}
/**
*
*/
@Test
public void getBookingsWithoutApplicationsIn() {
this.clearDatabase();
TimeFrame tf = new SimpleTimeFrame();
FacilityBookable bd = TeztBeanSimpleFactory.getFacilityBookable();
List<Booking> bookings = FamDaoProxy.bookingDao().getUncanceledBookingsWithoutApplicationsIn(bd, tf);
assertEquals(0, bookings.size());
tf.add(Calendar.DAY_OF_YEAR, 1);
tf.setEnd(tf.getStart() + 5000);
Booking application = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
application.setApplied();
application.getSessionTimeFrame().setEnd(tf.getEnd());
application.getSessionTimeFrame().setStart(tf.getStart());
application.insert();
tf.add(Calendar.SECOND, 2);
bookings = FamDaoProxy.bookingDao().getUncanceledBookingsWithoutApplicationsIn(bd, tf);
assertEquals(0, bookings.size());
tf.add(Calendar.SECOND, -2);
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
booking.getSessionTimeFrame().setEnd(tf.getEnd());
booking.getSessionTimeFrame().setStart(tf.getStart());
booking.insert();
tf.add(Calendar.SECOND, 2);
bookings = FamDaoProxy.bookingDao().getUncanceledBookingsWithoutApplicationsIn(bd, tf);
assertEquals(1, bookings.size());
AssertSomehowEquals.test(booking, bookings.get(0));
}
/**
*
*/
@Test
public void getExample() {
this.clearDatabase();
// insert
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
booking.insert();
// selftest
assertEquals(1, FamDaoProxy.bookingDao().getAll().size());
// example
Booking example = TimeBooking.getEmptyExampleBooking();
// test
assertEquals(1, FamDaoProxy.bookingDao().getObjectsLike(example).size());
}
/**
*
*/
@Test
public void saveAndGetBackSaved() {
this.clearDatabase();
assertEquals(0, FamDaoProxy.bookingDao().getAll().size());
TimeBookingRequest br = TeztBeanSimpleFactory.getBookingRequest();
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
booking.insert();
List<Booking> bookings = FamDaoProxy.bookingDao().getAll();
assertEquals(1, bookings.size());
Booking backBooking = bookings.get(0);
assertEquals(TimeBooking.class, backBooking.getClass());
assertEquals(FacilityBookable.class, backBooking.getFacility().getClass());
assertTrue(backBooking.getCapacityUnits() > 0);
assertEquals(br.getBookingRule().getKey(), backBooking.getFacilityKey());
}
/**
*
*/
@Test
public void dataIntegrityOnInsert() {
this.clearDatabase();
// insert a valid first
Booking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
booking.insert();
List<Booking> bookings = FamDaoProxy.bookingDao().getAll();
assertEquals(1, bookings.size());
this.clearDatabase();
// change to wrong booking status
booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setUnset();
try {
booking.insert();
fail("must throw an exception");
} catch (Exception e) {
assertTrue("right exception", true);
}
booking.setBooked();
booking.setCapacityUnits(9999999);
try {
booking.insert();
fail("must throw an exception");
} catch (Exception e) {
assertTrue("right exception", true);
}
booking.setCapacityUnits(1);
// be threadsafe
booking.insert();
Booking booking2 = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking2.setBooked();
try {
booking2.insert();
fail("must throw an exception");
} catch (Exception e) {
assertTrue("right exception", true);
}
}
}