//$Id: BookingTest.java 6896 2007-12-04 15:45:49Z pmuir $
package org.jboss.seam.example.booking.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.seam.contexts.Contexts;
import org.jboss.seam.core.Manager;
import org.jboss.seam.example.booking.Booking;
import org.jboss.seam.example.booking.Hotel;
import org.jboss.seam.example.booking.HotelBooking;
import org.jboss.seam.example.booking.User;
import org.jboss.seam.mock.SeamTest;
import org.testng.annotations.Test;
public class BookingTest extends SeamTest
{
@Test
public void testBookHotel() throws Exception
{
new FacesRequest() {
@Override
protected void invokeApplication()
{
Contexts.getSessionContext().set("user", new User("Gavin King", "foobar", "gavin"));
setValue("#{identity.username}", "gavin");
setValue("#{identity.password}", "foobar");
invokeMethod("#{identity.login}");
}
}.run();
new FacesRequest("/main.xhtml") {
@Override
protected void updateModelValues()
{
setValue("#{hotelSearch.searchString}", "Union Square");
}
@Override
protected void invokeApplication()
{
assert invokeMethod("#{hotelSearch.find}")==null;
}
@Override
protected void renderResponse()
{
DataModel hotels = (DataModel) Contexts.getSessionContext().get("hotels");
assert hotels.getRowCount()==1;
assert ( (Hotel) hotels.getRowData() ).getCity().equals("NY");
assert getValue("#{hotelSearch.searchString}").equals("Union Square");
assert !Manager.instance().isLongRunningConversation();
}
}.run();
final String id = new FacesRequest("/main.xhtml") {
@Override
protected void invokeApplication()
{
HotelBooking hotelBooking = (HotelBooking) getInstance("hotelBooking");
DataModel hotels = (DataModel) Contexts.getSessionContext().get("hotels");
assert hotels.getRowCount()==1;
hotelBooking.selectHotel( (Hotel) hotels.getRowData() );
}
@Override
protected void renderResponse()
{
Hotel hotel = (Hotel) Contexts.getConversationContext().get("hotel");
assert hotel.getCity().equals("NY");
assert hotel.getZip().equals("10011");
assert Manager.instance().isLongRunningConversation();
}
}.run();
new FacesRequest("/hotel.xhtml", id) {
@Override
protected void invokeApplication()
{
invokeMethod("#{hotelBooking.bookHotel}");
}
@Override
protected void renderResponse()
{
assert getValue("#{booking.user}")!=null;
assert getValue("#{booking.hotel}")!=null;
assert getValue("#{booking.creditCard}")==null;
assert getValue("#{booking.creditCardName}")==null;
Booking booking = (Booking) Contexts.getConversationContext().get("booking");
assert booking.getHotel()==Contexts.getConversationContext().get("hotel");
assert booking.getUser()==Contexts.getSessionContext().get("user");
assert Manager.instance().isLongRunningConversation();
}
}.run();
new FacesRequest("/book.xhtml", id) {
@Override @SuppressWarnings("deprecation")
protected void updateModelValues()
{
Date now = new Date();
setValue("#{booking.checkinDate}", now);
setValue("#{booking.checkoutDate}", now);
}
@Override
protected void invokeApplication()
{
assert invokeMethod("#{hotelBooking.setBookingDates}")==null;
}
@Override
protected void renderResponse()
{
Iterator messages = FacesContext.getCurrentInstance().getMessages();
assert messages.hasNext();
FacesMessage message = (FacesMessage) messages.next();
assert message.getSummary().equals("Check out date must be later than check in date");
assert !messages.hasNext();
assert Manager.instance().isLongRunningConversation();
}
}.run();
new FacesRequest("/book.xhtml", id) {
@Override @SuppressWarnings("deprecation")
protected void updateModelValues()
{
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 2);
setValue("#{booking.checkoutDate}", cal.getTime() );
}
@Override
protected void invokeApplication()
{
assert "rooms".equals(invokeMethod("#{hotelBooking.setBookingDates}"));
}
@Override
protected void renderResponse()
{
assert Manager.instance().isLongRunningConversation();
}
}.run();
new FacesRequest("/rooms.xhtml", id)
{
@Override
protected void renderResponse()
{
assert getValue("#{booking.user}")!=null;
assert getValue("#{booking.hotel}")!=null;
assert getValue("#{booking.checkinDate}")!=null;
assert getValue("#{booking.checkoutDate}")!=null;
assert getValue("#{booking.roomPreference}").equals(getValue("#{hotel.standardRoom}"));
assert getValue("#{booking.creditCard}")==null;
assert getValue("#{booking.creditCardName}")==null;
assert getValue("#{availableRooms.rowCount}").equals(new Integer(2));
DataModel availableRooms = (DataModel) getValue("#{availableRooms}");
availableRooms.setRowIndex(0);
assert "Cozy Room".equals(getValue("#{availableRooms.rowData.name}"));
availableRooms.setRowIndex(1);
assert "Spectacular Room".equals(getValue("#{availableRooms.rowData.name}"));
}
}.run();
final String nestedId = new FacesRequest("/rooms.xhtml", id)
{
@Override
protected void applyRequestValues()
{
DataModel availableRooms = (DataModel) getValue("#{availableRooms}");
availableRooms.setRowIndex(0);
}
@Override
protected void invokeApplication()
{
assert getValue("#{booking.roomPreference}")!=null;
assert "Cozy Room".equals(getValue("#{booking.roomPreference.name}"));
assert "payment".equals(invokeAction("#{roomPreference.selectPreference}"));
System.out.println("here");
}
@Override
protected void renderResponse()
{
assert Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
}
}.run();
System.out.println(id + "/" + nestedId);
// Hmm, need this to move to the new, nested, conversation
// TODO This is probably a bug in SeamTest, not sure where
new NonFacesRequest("/payment.xhtml", nestedId)
{
@Override
protected void renderResponse()
{
System.out.println("here");
assert Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
assert getValue("#{booking.user}")!=null;
assert getValue("#{booking.hotel}")!=null;
assert getValue("#{booking.checkinDate}")!=null;
assert getValue("#{booking.checkoutDate}")!=null;
assert getValue("#{booking.roomPreference}")!=null;
assert getValue("#{booking.creditCard}")==null;
assert getValue("#{booking.creditCardName}")==null;
}
}.run();
new FacesRequest("/payment.xhtml", nestedId)
{
@Override
protected void processValidations()
{
validateValue("#{booking.creditCard}", "123");
assert isValidationFailure();
}
@Override
protected void renderResponse()
{
Iterator messages = FacesContext.getCurrentInstance().getMessages();
assert messages.hasNext();
assert ( (FacesMessage) messages.next() ).getSummary().equals("Credit card number must 16 digits long");
assert !messages.hasNext();
assert Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
}
}.run();
new FacesRequest("/payment.xhtml", nestedId)
{
@Override
protected void processValidations()
{
validateValue("#{booking.creditCardName}", "");
assert isValidationFailure();
}
@Override
protected void renderResponse()
{
Iterator messages = FacesContext.getCurrentInstance().getMessages();
assert messages.hasNext();
assert ( (FacesMessage) messages.next() ).getSummary().equals("Credit card name is required");
assert !messages.hasNext();
assert Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
}
}.run();
new FacesRequest("/payment.xhtml", nestedId)
{
@Override
protected void updateModelValues()
{
setValue("#{booking.creditCard}", "1234567891021234");
setValue("#{booking.creditCardName}", "GAVIN KING");
}
@Override
protected void invokeApplication()
{
assert "confirm".equals(invokeAction("#{roomPreference.requestConfirmation}"));
}
@Override
protected void renderResponse()
{
assert Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
}
}.run();
new FacesRequest("/confirm.xhtml", nestedId) {
@Override
protected void invokeApplication()
{
invokeMethod("#{hotelBooking.confirm}");
}
}.run();
new NonFacesRequest("/main.xhtml") {
@Override
protected void renderResponse()
{
ListDataModel bookings = (ListDataModel) getInstance("bookings");
assert bookings.getRowCount()==1;
bookings.setRowIndex(0);
Booking booking = (Booking) bookings.getRowData();
assert booking.getHotel().getCity().equals("NY");
assert booking.getUser().getUsername().equals("gavin");
assert !Manager.instance().isLongRunningConversation();
}
}.run();
new FacesRequest("/main.xhtml") {
@Override
protected void invokeApplication()
{
ListDataModel bookings = (ListDataModel) Contexts.getSessionContext().get("bookings");
bookings.setRowIndex(0);
invokeMethod("#{bookingList.cancel}");
}
@Override
protected void renderResponse()
{
ListDataModel bookings = (ListDataModel) Contexts.getSessionContext().get("bookings");
assert bookings.getRowCount()==0;
assert !Manager.instance().isLongRunningConversation();
}
}.run();
}
}