package org.springframework.faces.webflow; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import junit.framework.TestCase; import org.easymock.EasyMock; import org.springframework.binding.message.DefaultMessageContext; import org.springframework.binding.message.Message; import org.springframework.binding.message.MessageBuilder; import org.springframework.binding.message.MessageContext; import org.springframework.faces.webflow.FlowFacesContext.FacesMessageSource; import org.springframework.webflow.execution.RequestContext; public class FlowFacesContextTests extends TestCase { JSFMockHelper jsf = new JSFMockHelper(); FacesContext facesContext; RequestContext requestContext; MessageContext messageContext; MessageContext prepopulatedMessageContext; @SuppressWarnings("cast") protected void setUp() throws Exception { this.jsf.setUp(); this.requestContext = (RequestContext) EasyMock.createMock(RequestContext.class); this.facesContext = new FlowFacesContext(this.requestContext, this.jsf.facesContext()); setupMessageContext(); } protected void tearDown() throws Exception { super.tearDown(); this.jsf.tearDown(); } public final void testCurrentInstance() { assertSame(FacesContext.getCurrentInstance(), this.facesContext); } public final void testAddMessage() { this.messageContext = new DefaultMessageContext(); EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); this.facesContext.addMessage("foo", new FacesMessage(FacesMessage.SEVERITY_INFO, "foo", "bar")); assertEquals("Message count is incorrect", 1, this.messageContext.getAllMessages().length); Message message = this.messageContext.getMessagesBySource(new FacesMessageSource("foo"))[0]; assertEquals("foo : bar", message.getText()); } public final void testGetGlobalMessagesOnly() { this.messageContext = new DefaultMessageContext(); EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); this.facesContext.addMessage("foo", new FacesMessage(FacesMessage.SEVERITY_INFO, "foo", "bar")); this.facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "FOO", "BAR")); int iterationCount = 0; Iterator<FacesMessage> i = this.facesContext.getMessages(null); while (i.hasNext()) { FacesMessage message = i.next(); assertNotNull(message); iterationCount++; } assertEquals(1, iterationCount); } public final void testGetAllMessages() { this.messageContext = new DefaultMessageContext(); EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); this.facesContext.addMessage("foo", new FacesMessage(FacesMessage.SEVERITY_INFO, "foo", "bar")); this.facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "FOO", "BAR")); int iterationCount = 0; Iterator<FacesMessage> i = this.facesContext.getMessages(); while (i.hasNext()) { FacesMessage message = i.next(); assertNotNull(message); iterationCount++; } assertEquals(2, iterationCount); } public final void testAddMessages_MultipleNullIds() { this.messageContext = new DefaultMessageContext(); EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); this.facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "foo", "bar")); this.facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "zoo", "zar")); assertEquals("Message count is incorrect", 2, this.messageContext.getAllMessages().length); Message[] messages = this.messageContext.getMessagesBySource(new FacesMessageSource(null)); assertEquals("foo : bar", messages[0].getText()); assertEquals("zoo : zar", messages[1].getText()); } public final void testGetMessages() { this.messageContext = this.prepopulatedMessageContext; EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); int iterationCount = 0; Iterator<FacesMessage> i = this.facesContext.getMessages(); while (i.hasNext()) { assertNotNull(i.next()); iterationCount++; } assertEquals("There should be 6 messages to iterate", 6, iterationCount); } public final void testMutableGetMessages() { this.messageContext = this.prepopulatedMessageContext; EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); this.facesContext.addMessage("TESTID", new FacesMessage("summary1")); FacesMessage soruceMessage = this.facesContext.getMessages("TESTID").next(); soruceMessage.setSummary("summary2"); // check that message sticks around even when the facesContext has been torn down and re-created during the // processing of the current request FacesContext newFacesContext = new FlowFacesContext(this.requestContext, this.jsf.facesContext()); assertSame(FacesContext.getCurrentInstance(), newFacesContext); FacesMessage gotMessage = newFacesContext.getMessages("TESTID").next(); assertEquals("summary2", gotMessage.getSummary()); } public final void testGetMessagesByClientId_ForComponent() { this.messageContext = this.prepopulatedMessageContext; EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); int iterationCount = 0; Iterator<FacesMessage> i = this.facesContext.getMessages("componentId"); while (i.hasNext()) { FacesMessage message = i.next(); assertNotNull(message); assertEquals("componentId_summary" + (iterationCount + 1), message.getSummary()); assertEquals("componentId_detail" + (iterationCount + 1), message.getDetail()); iterationCount++; } assertEquals(2, iterationCount); } public final void testGetMessagesByClientId_ForUserMessage() { this.messageContext = this.prepopulatedMessageContext; EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); int iterationCount = 0; Iterator<FacesMessage> i = this.facesContext.getMessages("userMessage"); while (i.hasNext()) { FacesMessage message = i.next(); assertNotNull(message); assertEquals("userMessage", message.getSummary()); assertEquals("userMessage", message.getDetail()); iterationCount++; } assertEquals(1, iterationCount); } public final void testgetMessagesByClientId_InvalidId() { this.messageContext = this.prepopulatedMessageContext; EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); Iterator<FacesMessage> i = this.facesContext.getMessages("unknown"); assertFalse(i.hasNext()); } public final void testGetClientIdsWithMessages() { this.messageContext = this.prepopulatedMessageContext; EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); List<String> expectedOrderedIds = new ArrayList<String>(); expectedOrderedIds.add(null); expectedOrderedIds.add("componentId"); expectedOrderedIds.add("userMessage"); int iterationCount = 0; Iterator<String> i = this.facesContext.getClientIdsWithMessages(); while (i.hasNext()) { String clientId = i.next(); assertEquals("Client id not expected", expectedOrderedIds.get(iterationCount), clientId); iterationCount++; } assertEquals(3, iterationCount); } public final void testMessagesAreSerializable() throws Exception { DefaultMessageContext messageContext = new DefaultMessageContext(); EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(messageContext); EasyMock.replay(new Object[] { this.requestContext }); this.facesContext.addMessage("TESTID", new FacesMessage("summary1")); FacesMessage sourceMessage = this.facesContext.getMessages("TESTID").next(); sourceMessage.setSummary("summary2"); sourceMessage.setSeverity(FacesMessage.SEVERITY_FATAL); Serializable mementoWrite = messageContext.createMessagesMemento(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(mementoWrite); oos.flush(); byte[] byteArray = bos.toByteArray(); oos.close(); ByteArrayInputStream bis = new ByteArrayInputStream(byteArray); ObjectInputStream ois = new ObjectInputStream(bis); Serializable mementoRead = (Serializable) ois.readObject(); ois.close(); messageContext.restoreMessages(mementoRead); EasyMock.reset(new Object[] { this.requestContext }); EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(messageContext); EasyMock.replay(new Object[] { this.requestContext }); FacesContext newFacesContext = new FlowFacesContext(this.requestContext, this.jsf.facesContext()); assertSame(FacesContext.getCurrentInstance(), newFacesContext); FacesMessage gotMessage = newFacesContext.getMessages("TESTID").next(); assertEquals("summary2", gotMessage.getSummary()); assertEquals(FacesMessage.SEVERITY_FATAL, gotMessage.getSeverity()); } public final void testGetMaximumSeverity() { this.messageContext = this.prepopulatedMessageContext; EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); assertEquals(FacesMessage.SEVERITY_FATAL, this.facesContext.getMaximumSeverity()); } public final void testGetELContext() { assertNotNull(this.facesContext.getELContext()); assertSame(this.facesContext, this.facesContext.getELContext().getContext(FacesContext.class)); } public final void testValidationFailed() { this.messageContext = new DefaultMessageContext(); EasyMock.expect(this.requestContext.getMessageContext()).andStubReturn(this.messageContext); EasyMock.replay(new Object[] { this.requestContext }); this.facesContext.addMessage("foo", new FacesMessage(FacesMessage.SEVERITY_ERROR, "foo", "bar")); assertEquals(true, this.facesContext.isValidationFailed()); } private void setupMessageContext() { this.prepopulatedMessageContext = new DefaultMessageContext(); this.prepopulatedMessageContext.addMessage(new FlowFacesContext.FlowFacesMessage(new FacesMessageSource(null), new FacesMessage("foo"))); this.prepopulatedMessageContext.addMessage(new FlowFacesContext.FlowFacesMessage(new FacesMessageSource( "componentId"), new FacesMessage("componentId_summary1", "componentId_detail1"))); this.prepopulatedMessageContext.addMessage(new FlowFacesContext.FlowFacesMessage(new FacesMessageSource( "componentId"), new FacesMessage("componentId_summary2", "componentId_detail2"))); this.prepopulatedMessageContext.addMessage(new FlowFacesContext.FlowFacesMessage(new FacesMessageSource(null), new FacesMessage("baz"))); this.prepopulatedMessageContext.addMessage(new MessageBuilder().source("userMessage").defaultText("userMessage") .info().build()); this.prepopulatedMessageContext.addMessage(new MessageBuilder().defaultText("Subzero Wins - Fatality").fatal() .build()); } }