package org.jboss.seam.test.unit;
import javax.faces.context.FacesContext;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.contexts.FacesLifecycle;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.core.ConversationEntries;
import org.jboss.seam.core.Events;
import org.jboss.seam.core.Manager;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.navigation.Pages;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* Tests that validate the ConversationControl component as initialized for a Page instance.
*
* @author Jacob Orshalick
*/
public class PageConversationControlTest extends AbstractPageTest
{
/**
* Override the base setup to add the required conversation components included in testing.
*/
@BeforeMethod
@Override
public void setup()
{
super.setup();
installComponent(Contexts.getApplicationContext(), ConversationEntries.class);
installComponent(Contexts.getApplicationContext(), Conversation.class);
installComponent(Contexts.getApplicationContext(), FacesMessages.class);
installComponent(Contexts.getApplicationContext(), Manager.class);
installComponent(Contexts.getApplicationContext(), Events.class);
Manager.instance().initializeTemporaryConversation();
FacesLifecycle.resumeConversation(FacesContext.getCurrentInstance().getExternalContext());
}
/**
* Tests that when a nested conversation encounters an end-conversation tag the nested conversation is
* demoted to temporary.
*/
@Test
public void testBeginNestedAndEndConversation() {
Manager.instance().beginConversation();
Manager.instance().beginNestedConversation();
assert Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getViewRoot().setViewId("/end-conversation-test.xhtml");
Pages.instance().preRender(facesContext);
// nested conversation should be demoted to temporary
assert !Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
}
/**
* Tests that when a non-nested conversation encounters an end-conversation tag specifying that the root
* should be ended the current conversation is simply demoted to temporary.
*/
@Test
public void testBeginAndEndRootConversation() {
Manager.instance().beginConversation();
assert Manager.instance().isLongRunningConversation();
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getViewRoot().setViewId("/end-root-conversation-test.xhtml");
Pages.instance().preRender(facesContext);
assert !Manager.instance().isLongRunningConversation();
}
/**
* Tests that when a nested conversation encounters an end-conversation tag specifying that the root
* should be ended the root is ended thereby destroying the conversation stack.
*/
@Test
public void testBeginNestedAndEndRootConversation() {
Manager.instance().beginConversation();
String rootConversationId = Manager.instance().getCurrentConversationId();
Manager.instance().beginNestedConversation();
assert !Manager.instance().getCurrentConversationId().equals(rootConversationId);
assert Manager.instance().isLongRunningConversation();
assert Manager.instance().isNestedConversation();
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getViewRoot().setViewId("/end-root-conversation-test.xhtml");
Pages.instance().preRender(facesContext);
assert Manager.instance().getCurrentConversationId().equals(rootConversationId);
assert !Manager.instance().isLongRunningConversation();
assert !Manager.instance().isNestedConversation();
}
}