package org.jboss.seam.test.integration.faces; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.net.URL; 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.Name; import org.jboss.seam.annotations.Out; import org.jboss.seam.annotations.Scope; import org.jboss.seam.test.integration.Deployments; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.junit.Test; import org.junit.runner.RunWith; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; /** * Test for JBSEAM-4966 */ @RunWith(Arquillian.class) @RunAsClient public class SessionScopedOutjectionOverwriteTest { private final WebClient client = new WebClient(); @ArquillianResource URL contextPath; @Deployment(name="SessionScopedOutjectionOverwriteTest", testable=false) @OverProtocol("Servlet 3.0") public static Archive<?> createDeployment() { // This is a client test, use a real (non-mocked) Seam deployment return Deployments.realSeamDeployment() .addClasses(Foo.class, Bar.class) .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:ui=\"http://java.sun.com/jsf/facelets\">" + "<h:head></h:head>" + "<h:body>" + "<h:form id='form'>" + "<h:outputText value='Output: #{output}.'/>" + "<h:commandButton id='foo' action='#{faces.foo.foo}' value='foo' />" + "<h:commandButton id='bar' action='#{faces.bar.bar}' value='bar' />" + "<h:commandButton id='nop' action='test' value='nop' />" + "</h:form>" + "</h:body>" + "</html>"), "test.xhtml"); } @Test public void testJBSEAM4966() throws Exception { HtmlPage page = client.getPage(contextPath + "test.seam"); page = page.getElementById("form:foo").click(); assertTrue(page.getBody().getTextContent().contains("Output: foo")); page = page.getElementById("form:bar").click(); assertTrue(page.getBody().getTextContent().contains("Output: bar")); page = page.getElementById("form:nop").click(); assertFalse("Output should stay 'bar' after a 'nop' operation.", page.getBody().getTextContent().contains("Output: foo")); assertTrue(page.getBody().getTextContent().contains("Output: bar")); } @Scope(ScopeType.SESSION) @Name("faces.foo") public static class Foo { @Out(scope=ScopeType.SESSION) private String output; public void foo() { output = "foo"; } } @Scope(ScopeType.EVENT) @Name("faces.bar") public static class Bar { @Out(scope=ScopeType.SESSION) private String output; public void bar() { output = "bar"; } } }