package com.jboss.dvd.seam.test; import java.util.ArrayList; import java.util.List; import javax.el.ELException; import javax.faces.model.DataModel; import org.jboss.seam.core.Conversation; import org.jboss.seam.mock.SeamTest; import org.jboss.seam.security.NotLoggedInException; import org.testng.annotations.Test; import com.jboss.dvd.seam.Order; import com.jboss.dvd.seam.Product; import com.jboss.dvd.seam.ShoppingCart; import com.jboss.dvd.seam.User; import com.jboss.dvd.seam.Order.Status; public class OrderTest extends SeamTest { @Test public void selectDvd() throws Exception { new FacesRequest("/dvd.xhtml") { @Override protected void beforeRequest() { setParameter("id", "41"); } @Override protected void renderResponse() throws Exception { Product dvd = (Product) getValue("#{dvd}"); assert dvd != null; assert dvd.getProductId() == 41; } }.run(); } @Test public void addToCart() throws Exception { String id = new FacesRequest("/dvd.xhtml") { @Override protected void beforeRequest() { setParameter("id", "41"); } }.run(); new FacesRequest("/dvd.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{search.addToCart}"); } @Override protected void renderResponse() throws Exception { ShoppingCart cart = (ShoppingCart) getValue("#{cart}"); assert cart != null; assert cart.getCart().size() == 1; } }.run(); new FacesRequest("/dvd.xhtml", id) { @Override protected void beforeRequest() { setParameter("id", "42"); } }.run(); new FacesRequest("/dvd.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{search.addToCart}"); } @Override protected void renderResponse() throws Exception { ShoppingCart cart = (ShoppingCart) getValue("#{cart}"); assert cart != null; assert cart.getCart().size() == 2; } }.run(); new FacesRequest("/dvd.xhtml", id) { @Override protected void beforeRequest() { setParameter("id", "41"); } }.run(); new FacesRequest("/dvd.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{search.addToCart}"); } @Override protected void renderResponse() throws Exception { ShoppingCart cart = (ShoppingCart) getValue("#{cart}"); assert cart != null; assert cart.getCart().size() == 2; } }.run(); new FacesRequest("/dvd.xhtml", id) { @Override protected void beforeRequest() { setParameter("id", "43"); } }.run(); new FacesRequest("/dvd.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{search.addToCart}"); } @Override protected void renderResponse() throws Exception { ShoppingCart cart = (ShoppingCart) getValue("#{cart}"); assert cart != null; assert cart.getCart().size() == 3; } }.run(); } @Test public void checkoutNotLoggedIn() throws Exception { String id = new FacesRequest("/dvd.xhtml") { @Override protected void beforeRequest() { setParameter("id", "41"); } }.run(); id = new FacesRequest("/dvd.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{search.addToCart}"); } }.run(); id = new FacesRequest("/checkout.xhtml", id) { }.run(); id = new FacesRequest("/checkout.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{checkout.createOrder}"); } @Override protected void renderResponse() throws Exception { Order order = (Order) getValue("#{order}"); assert order != null; } }.run(); id = new FacesRequest("/checkout.xhtml", id) { @Override protected void invokeApplication() throws Exception { try { invokeAction("#{checkout.submitOrder}"); assert false; // should fail } catch (ELException e) { assert e.getCause() instanceof NotLoggedInException; } } @Override protected void renderResponse() throws Exception { Order order = (Order) getValue("#{order}"); assert order != null; } }.run(); id = new FacesRequest("/checkout.xhtml", id) { @Override protected void applyRequestValues() throws Exception { setValue("#{identity.username}", "user1"); setValue("#{identity.password}", "password"); } protected void invokeApplication() throws Exception { invokeAction("#{identity.login}"); } @Override protected void renderResponse() throws Exception { assert getValue("#{identity.loggedIn}").equals(Boolean.TRUE); User currentUser = (User) getValue("#{currentUser}"); assert currentUser.getUserName().equals("user1"); } }.run(); } public long makeOrder() throws Exception { String id = new FacesRequest("/dvd.xhtml") { @Override protected void beforeRequest() { setParameter("id", "41"); } }.run(); id = new FacesRequest("/dvd.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{search.addToCart}"); } }.run(); id = new NonFacesRequest("/checkout.xhtml", id) { }.run(); id = new FacesRequest("/checkout.xhtml", id) { @Override protected void applyRequestValues() throws Exception { setValue("#{identity.username}", "user1"); setValue("#{identity.password}", "password"); } protected void invokeApplication() throws Exception { invokeAction("#{identity.login}"); } @Override protected void renderResponse() throws Exception { assert getValue("#{identity.loggedIn}").equals(Boolean.TRUE); User currentUser = (User) getValue("#{currentUser}"); assert currentUser.getUserName().equals("user1"); } }.run(); id = new FacesRequest("/checkout.xhtml", id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{checkout.createOrder}"); Order order = (Order) getValue("#{currentOrder}"); assert order!=null; } }.run(); id = new NonFacesRequest("/confirm.xhtml", id) { }.run(); final Wrapper<Long> orderId = new Wrapper<Long>(); id = new FacesRequest("/confirm.xhtml", id) { protected void invokeApplication() throws Exception { invokeAction("#{checkout.submitOrder}"); } @Override protected void renderResponse() throws Exception { Order order = (Order) getValue("#{completedOrder}"); assert order!=null; assert order.getCustomer().getUserName().equals("user1"); assert order.getStatus().equals(Status.OPEN); orderId.setValue(order.getOrderId()); } }.run(); return orderId.getValue(); } @Test public void checkout() throws Exception { makeOrder(); } @Test public void showOrders() throws Exception { final long order1 = makeOrder(); final long order2 = makeOrder(); final long order3 = makeOrder(); new NonFacesRequest("/showOrders.xhtml") { @SuppressWarnings("unchecked") @Override protected void renderResponse() throws Exception { DataModel model = (DataModel) getValue("#{orders}"); List<Long> orders = new ArrayList<Long>(); for (Order order: (List<Order>) model.getWrappedData()) { orders.add(order.getOrderId()); } assert orders.contains(order1); assert orders.contains(order2); assert orders.contains(order3); } }.run(); } @Test public void cancelOrder() throws Exception { final long order1 = makeOrder(); String id = new NonFacesRequest("/showorders.xhtml") { @SuppressWarnings("unchecked") @Override protected void renderResponse() throws Exception { DataModel model = (DataModel) getValue("#{orders}"); assert model!=null; assert Conversation.instance().isLongRunning(); } }.run(); id = new FacesRequest("/showorders.xhtml",id) { @SuppressWarnings("unchecked") @Override protected void applyRequestValues() throws Exception { DataModel model = (DataModel) getValue("#{orders}"); int index =0; for (Order order: (List<Order>) model.getWrappedData()) { if (order.getOrderId() == order1) { model.setRowIndex(index); break; } index++; } } @Override protected void invokeApplication() throws Exception { invokeAction("#{showorders.detailOrder}"); } @Override protected void renderResponse() throws Exception { assert false; } }.run(); id = new FacesRequest("/showorders.xhtml",id) { @Override protected void renderResponse() throws Exception { Order order = (Order) getValue("#{myorder}"); assert order.getOrderId() == order1; assert order.getStatus() == Status.OPEN; } }.run(); id = new FacesRequest("/showorders.xhtml",id) { @Override protected void invokeApplication() throws Exception { invokeAction("#{showorders.cancelOrder}"); } @Override protected void renderResponse() throws Exception { Order order = (Order) getValue("#{myorder}"); assert order.getOrderId() == order1; assert order.getStatus() == Status.CANCELLED; assert false; } }.run(); } static class Wrapper<T> { T value; public void setValue(T value) { this.value = value; } public T getValue() { return value; } } }