package org.jboss.seam.test.integration.faces; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import java.io.Serializable; import java.net.URL; import java.util.Deque; import java.util.LinkedList; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.OverProtocol; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.test.integration.Deployments; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlTextInput; /** * Test accessing conversation scoped component from a restore view phase (by a JSF validator attribute) * Related to JBSEAM-4976 */ @RunWith(Arquillian.class) @RunAsClient public class RestoreViewComponentAccessTest { private final WebClient client = new WebClient(); @ArquillianResource URL contextPath; @Deployment(name="RestoreViewComponentAccessTest") @OverProtocol("Servlet 3.0") public static WebArchive createDeployment() { // This is a client test, use a real (non-mocked) Seam deployment WebArchive war = Deployments.realSeamDeployment() .addClasses(SequenceAction.class); war.delete("WEB-INF/pages.xml"); war.delete("WEB-INF/components.xml"); war.addAsWebResource(new StringAsset( "<html xmlns=\"http://www.w3.org/1999/xhtml\"" + " xmlns:h=\"http://java.sun.com/jsf/html\"" + " xmlns:f=\"http://java.sun.com/jsf/core\"" + " xmlns:s=\"http://jboss.org/schema/seam/taglib\"" + " xmlns:ui=\"http://java.sun.com/jsf/facelets\">" + "<h:head></h:head>" + "<h:body>" + "<h:form id='form'>" + "<h:messages/>" + "<h:outputText id='output' value='Sequence: #{sequence.output}'/>" + "<h:inputText id='input' value='#{sequence.input}'>" + "<f:validateLongRange minimum='#{sequence.minimum}' />" + "</h:inputText>" + "<h:commandButton id='append' value='Append' action='#{sequence.append}'/>" + "</h:form>" + "</h:body>" + "</html>"), "test.xhtml"); war.addAsWebInfResource(new StringAsset( "<pages xmlns=\"http://jboss.org/schema/seam/pages\""+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + "<page view-id='/test.xhtml'>" + "<begin-conversation join='true'/>" + "<navigation><redirect view-id='/test.xhtml'/></navigation>" + "</page></pages>"), "pages.xml"); return war; } @Ignore // JBSEAM-4976 @Test public void testConversationWithValidator() throws Exception { HtmlPage page = client.getPage(contextPath + "test.seam"); assertTrue(page.getBody().getTextContent().contains("Sequence: ")); ((HtmlTextInput)page.getElementById("form:input")).setText("1"); page = page.getElementById("form:append").click(); assertTrue(page.getBody().getTextContent().contains("Sequence: 1")); ((HtmlTextInput)page.getElementById("form:input")).setText("2"); page = page.getElementById("form:append").click(); assertTrue(page.getBody().getTextContent().contains("Sequence: 1, 2")); ((HtmlTextInput)page.getElementById("form:input")).setText("1"); page = page.getElementById("form:append").click(); assertFalse(page.getBody().getTextContent().contains("Sequence: 1, 2, 1")); assertTrue(page.getBody().getTextContent().contains("value must be greater than or equal to 2")); } @Name("sequence") @Scope(ScopeType.CONVERSATION) public static class SequenceAction implements Serializable { private static final long serialVersionUID = 1L; private Deque<Long> sequence; private Long input; @Create public void create() { sequence = new LinkedList<Long>(); } public String getOutput() { StringBuilder sb = new StringBuilder(); for (Long n : sequence) { sb.append(n); sb.append(", "); } return sb.toString(); } public void append() { sequence.add(input); } public Long getInput() { return input; } public void setInput(Long input) { this.input = input; } public Long getMinimum() { if (sequence.isEmpty()) { return 0L; } return sequence.getLast(); } } }