package org.jboss.seam.test.integration; import java.util.ArrayList; import java.util.List; import javax.faces.model.SelectItem; 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.core.ConversationEntries; import org.jboss.seam.core.ConversationEntry; import org.jboss.seam.core.Manager; import org.jboss.seam.faces.Switcher; import org.jboss.seam.mock.JUnitSeamTest; import org.jboss.shrinkwrap.api.Archive; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(Arquillian.class) public class ConversationTest extends JUnitSeamTest { @Deployment(name="ConversationTest") @OverProtocol("Servlet 3.0") public static Archive<?> createDeployment() { return Deployments.defaultSeamDeployment(); } @Test public void conversationStack() throws Exception { // no conversation, no stack new FacesRequest("/pageWithDescription.xhtml") { @SuppressWarnings("unchecked") @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(0, entries.size()); } }.run(); // no conversation, no stack new FacesRequest("/pageWithoutDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @SuppressWarnings("unchecked") @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(0, entries.size()); } }.run(); // new conversation, stack = 1 String rootId = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @SuppressWarnings("unchecked") @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(1, entries.size()); } }.run(); // nested conversation, stack =2 String nested1 = new FacesRequest("/pageWithDescription.xhtml", rootId) { @Override protected void invokeApplication() throws Exception { Manager.instance().beginNestedConversation(); } @SuppressWarnings("unchecked") @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(2, entries.size()); } }.run(); // nested conversation without description, not added to stack String nested2 = new FacesRequest("/pageWithoutDescription.xhtml", nested1) { @Override protected void invokeApplication() throws Exception { Manager.instance().beginNestedConversation(); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(2, entries.size()); } }.run(); // access a page, now it's on the stack new FacesRequest("/pageWithDescription.xhtml", nested2) { @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(3, entries.size()); } }.run(); // end conversation, stack goes down new FacesRequest("/pageWithDescription.xhtml", nested2) { @Override protected void invokeApplication() throws Exception { Manager.instance().endConversation(false); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(2, entries.size()); } }.run(); // end another one, size is 1 new FacesRequest("/pageWithDescription.xhtml", nested1) { @Override protected void invokeApplication() throws Exception { Manager.instance().endConversation(false); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationStack}"); Assert.assertEquals(1, entries.size()); } }.run(); } @Test public void conversationList() throws Exception { new FacesRequest("/pageWithDescription.xhtml") { @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(0, entries.size()); } }.run(); new FacesRequest("/pageWithoutDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(0, entries.size()); } }.run(); String conv1 = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(1, entries.size()); } }.run(); String conv2 = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(2, entries.size()); } }.run(); String conv3 = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(3, entries.size()); } }.run(); new FacesRequest("/pageWithDescription", conv2) { @Override protected void invokeApplication() throws Exception { Manager.instance().endConversation(true); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(2, entries.size()); } }.run(); new FacesRequest("/pageWithDescription", conv1) { @Override protected void invokeApplication() throws Exception { Manager.instance().endConversation(true); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(1, entries.size()); } }.run(); new FacesRequest("/pageWithDescription", conv3) { @Override protected void invokeApplication() throws Exception { Manager.instance().endConversation(true); } @Override protected void renderResponse() throws Exception { List<ConversationEntry> entries = (List<ConversationEntry>) getValue("#{conversationList}"); Assert.assertEquals(0, entries.size()); } }.run(); } @Test public void switcher() throws Exception { new FacesRequest("/pageWithDescription.xhtml") { @Override protected void renderResponse() throws Exception { Switcher switcher = (Switcher) getValue("#{switcher}"); Assert.assertEquals(0, switcher.getSelectItems().size()); Assert.assertNull(switcher.getConversationIdOrOutcome()); } }.run(); final String conv1 = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { Switcher switcher = (Switcher) getValue("#{switcher}"); Assert.assertEquals(1, switcher.getSelectItems().size()); } }.run(); final String conv2 = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { Switcher switcher = (Switcher) getValue("#{switcher}"); Assert.assertEquals(2, switcher.getSelectItems().size()); } }.run(); final String conv3 = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { Switcher switcher = (Switcher) getValue("#{switcher}"); Assert.assertEquals(3, switcher.getSelectItems().size()); } }.run(); new FacesRequest() { @Override protected void renderResponse() throws Exception { Switcher switcher = (Switcher) getValue("#{switcher}"); Assert.assertEquals(3, switcher.getSelectItems().size()); List<SelectItem> items = switcher.getSelectItems(); List<String> values = new ArrayList<String>(); for (SelectItem item: items) { Assert.assertEquals("page description", item.getLabel()); values.add((String) item.getValue()); } Assert.assertTrue(values.contains(conv1)); Assert.assertTrue(values.contains(conv2)); Assert.assertTrue(values.contains(conv3)); } }.run(); new FacesRequest("/pageWithDescription.xhtml", conv1) { @Override protected void invokeApplication() throws Exception { Manager.instance().endConversation(true); } }.run(); new FacesRequest("/pageWithDescription.xhtml", conv2) { @Override protected void invokeApplication() throws Exception { Manager.instance().endConversation(true); } @Override protected void renderResponse() throws Exception { Switcher switcher = (Switcher) getValue("#{switcher}"); Assert.assertEquals(1, switcher.getSelectItems().size()); Assert.assertEquals("page description", switcher.getSelectItems().get(0).getLabel()); Assert.assertEquals(conv3, switcher.getSelectItems().get(0).getValue()); } }.run(); new FacesRequest("/pageWithAnotherDescription.xhtml", conv3) { @Override protected void renderResponse() throws Exception { Switcher switcher = (Switcher) getValue("#{switcher}"); Assert.assertEquals(1,switcher.getSelectItems().size()); Assert.assertEquals("another page description", switcher.getSelectItems().get(0).getLabel()); Assert.assertEquals(conv3, switcher.getSelectItems().get(0).getValue()); } }.run(); } @Test public void killAllOthers() throws Exception { new FacesRequest("/pageWithAnotherDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { Assert.assertEquals(1,ConversationEntries.instance().size()); } }.run(); new FacesRequest("/pageWithoutDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { Assert.assertEquals(2,ConversationEntries.instance().size()); } }.run(); new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); Manager.instance().killAllOtherConversations(); } @Override protected void renderResponse() throws Exception { Assert.assertEquals(1,ConversationEntries.instance().size()); } }.run(); } @Test public void nestedKillAllOthers() throws Exception { final String unrelated = new FacesRequest("/pageWithoutDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { Assert.assertEquals(1,ConversationEntries.instance().size()); } }.run(); String root = new FacesRequest("/pageWithDescription.xhtml") { @Override protected void invokeApplication() throws Exception { Manager.instance().beginConversation(); } @Override protected void renderResponse() throws Exception { Assert.assertEquals(2,ConversationEntries.instance().size()); } }.run(); // nested conversation new FacesRequest("/pageWithDescription.xhtml", root) { @Override protected void invokeApplication() throws Exception { Manager.instance().beginNestedConversation(); } @Override protected void renderResponse() throws Exception { Assert.assertEquals(3,ConversationEntries.instance().size()); Manager.instance().killAllOtherConversations(); Assert.assertEquals(2,ConversationEntries.instance().size()); Assert.assertEquals(true,ConversationEntries.instance().getConversationIds() .contains(unrelated) == false); } }.run(); } }