//$Id: BookingTest.java 6505 2007-10-12 11:24:54Z pmuir $
package org.jboss.seam.example.jpa.test;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.seam.Component;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Manager;
import org.jboss.seam.example.jpa.Booking;
import org.jboss.seam.example.jpa.Hotel;
import org.jboss.seam.example.jpa.HotelBookingAction;
import org.jboss.seam.example.jpa.User;
import org.jboss.seam.mock.JUnitSeamTest;
import org.jboss.seam.mock.SeamTest;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class BookingTest extends JUnitSeamTest
{
@Deployment(name="BookingTest")
@OverProtocol("Servlet 3.0")
public static Archive<?> createDeployment()
{
WebArchive web = Deployments.jpaDeployment();
web.addClasses(BookingTest.class);
return web;
}
@Test
public void testBookHotel() throws Exception
{
new FacesRequest() {
@Override
protected void invokeApplication() throws Exception
{
Contexts.getSessionContext().set("user", new User("Gavin King", "foobar", "gavin"));
setValue("#{identity.username}", "gavin");
setValue("#{identity.password}", "foobar");
invokeAction("#{identity.login}");
}
}.run();
new FacesRequest("/main.xhtml") {
@Override
protected void updateModelValues() throws Exception
{
setValue("#{hotelSearch.searchString}", "Union Square");
}
@Override
protected void invokeApplication()
{
Assert.assertNull(invokeAction("#{hotelSearch.find}"));
}
@Override
protected void renderResponse()
{
DataModel hotels = (DataModel) Contexts.getSessionContext().get("hotels");
Assert.assertEquals(1, hotels.getRowCount());
Assert.assertEquals("NY",( (Hotel) hotels.getRowData() ).getCity() );
Assert.assertEquals("Union Square", getValue("#{hotelSearch.searchString}"));
Assert.assertTrue(!Manager.instance().isLongRunningConversation());
}
}.run();
String id = new FacesRequest("/main.xhtml") {
@Override
protected void invokeApplication() throws Exception {
HotelBookingAction hotelBooking = (HotelBookingAction) getInstance("hotelBooking");
DataModel hotels = (DataModel) Contexts.getSessionContext().get("hotels");
Assert.assertEquals(1, hotels.getRowCount());
hotelBooking.selectHotel( (Hotel) hotels.getRowData() );
}
@Override
protected void renderResponse()
{
Hotel hotel = (Hotel) Contexts.getConversationContext().get("hotel");
Assert.assertEquals("NY",hotel.getCity() );
Assert.assertEquals("10011",hotel.getZip() );
Assert.assertTrue(Manager.instance().isLongRunningConversation());
}
}.run();
id = new FacesRequest("/hotel.xhtml", id) {
@Override
protected void invokeApplication()
{
invokeAction("#{hotelBooking.bookHotel}");
}
@Override
protected void renderResponse()
{
Assert.assertNotNull(getValue("#{booking.user}"));
Assert.assertNotNull(getValue("#{booking.hotel}"));
Assert.assertNull(getValue("#{booking.creditCard}"));
Assert.assertNull(getValue("#{booking.creditCardName}"));
Booking booking = (Booking) Contexts.getConversationContext().get("booking");
Assert.assertTrue(booking.getHotel()==Contexts.getConversationContext().get("hotel"));
Assert.assertTrue(booking.getUser()==Contexts.getConversationContext().get("user"));
Assert.assertTrue(Manager.instance().isLongRunningConversation());
}
}.run();
new FacesRequest("/book.xhtml", id) {
@Override
protected void processValidations() throws Exception
{
validateValue("#{booking.creditCard}", "123");
Assert.assertTrue(isValidationFailure());
}
@Override
protected void renderResponse()
{
Iterator messages = FacesContext.getCurrentInstance().getMessages();
Assert.assertTrue(messages.hasNext());
Assert.assertEquals("Credit card number must 16 digits long", ( (FacesMessage) messages.next() ).getSummary());
Assert.assertFalse(messages.hasNext());
Assert.assertTrue(Manager.instance().isLongRunningConversation());
}
@Override
protected void afterRequest()
{
Assert.assertTrue(!isInvokeApplicationBegun());
}
}.run();
new FacesRequest("/book.xhtml", id) {
@Override
protected void processValidations() throws Exception
{
validateValue("#{booking.creditCardName}", "");
Assert.assertTrue(isValidationFailure());
}
@Override
protected void renderResponse()
{
Iterator messages = FacesContext.getCurrentInstance().getMessages();
Assert.assertTrue(messages.hasNext());
Assert.assertEquals("Credit card name is required", ( (FacesMessage) messages.next() ).getSummary());
Assert.assertFalse(messages.hasNext());
Assert.assertTrue(Manager.instance().isLongRunningConversation());
}
@Override
protected void afterRequest()
{
Assert.assertFalse(isInvokeApplicationBegun());
}
}.run();
new FacesRequest("/book.xhtml", id) {
@Override @SuppressWarnings("deprecation")
protected void updateModelValues() throws Exception
{
setValue("#{booking.creditCard}", "1234567891021234");
setValue("#{booking.creditCardName}", "GAVIN KING");
setValue("#{booking.beds}", 2);
Date now = new Date();
setValue("#{booking.checkinDate}", now);
setValue("#{booking.checkoutDate}", now);
}
@Override
protected void invokeApplication()
{
assert invokeAction("#{hotelBooking.setBookingDetails}")==null;
}
@Override
protected void renderResponse()
{
Iterator messages = FacesContext.getCurrentInstance().getMessages();
Assert.assertTrue(Manager.instance().isLongRunningConversation());
Assert.assertTrue(messages.hasNext());
FacesMessage message = (FacesMessage) messages.next();
Assert.assertEquals("Check out date must be later than check in date",message.getSummary());
Assert.assertFalse(messages.hasNext());
Assert.assertTrue(Manager.instance().isLongRunningConversation());
}
@Override
protected void afterRequest()
{
assert isInvokeApplicationComplete();
}
}.run();
new FacesRequest("/book.xhtml", id) {
@Override @SuppressWarnings("deprecation")
protected void updateModelValues() throws Exception
{
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 2);
setValue("#{booking.checkoutDate}", cal.getTime() );
}
@Override
protected void invokeApplication()
{
invokeAction("#{hotelBooking.setBookingDetails}");
}
@Override
protected void renderResponse()
{
Assert.assertTrue(Manager.instance().isLongRunningConversation());
}
@Override
protected void afterRequest()
{
Assert.assertTrue( isInvokeApplicationComplete() );
}
}.run();
new FacesRequest("/confirm.xhtml", id) {
@Override
protected void invokeApplication()
{
invokeAction("#{hotelBooking.confirm}");
}
@Override
protected void afterRequest()
{
Assert.assertTrue( isInvokeApplicationComplete() );
}
}.run();
new NonFacesRequest("/main.xhtml") {
@Override
protected void renderResponse()
{
ListDataModel bookings = (ListDataModel) getInstance("bookings");
Assert.assertEquals(1, bookings.getRowCount());
bookings.setRowIndex(0);
Booking booking = (Booking) bookings.getRowData();
Assert.assertEquals("NY", booking.getHotel().getCity());
Assert.assertEquals("gavin", booking.getUser().getUsername());
Assert.assertFalse(Manager.instance().isLongRunningConversation());
}
}.run();
new FacesRequest("/main.xhtml") {
@Override
protected void invokeApplication()
{
ListDataModel bookings = (ListDataModel) Contexts.getSessionContext().get("bookings");
bookings.setRowIndex(0);
invokeAction("#{bookingList.cancel}");
}
@Override
protected void renderResponse()
{
ListDataModel bookings = (ListDataModel) Contexts.getSessionContext().get("bookings");
Assert.assertEquals(0, bookings.getRowCount());
Assert.assertFalse(Manager.instance().isLongRunningConversation());
}
}.run();
}
}