package com.ocpsoft.pretty.faces.util;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseStream;
import javax.faces.context.ResponseWriter;
import javax.faces.render.RenderKit;
import org.junit.Test;
public class FacesMessagesUtilsTest
{
@Test
public void testSaveMessages()
{
// set up FacesContext
FacesContextMock facesContext = new FacesContextMock();
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Summary A", "Detail A"));
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Summary B", "Detail B"));
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Summary B", "Detail B"));
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Summary B", "Detail B"));
// call saveMessages()
Map<String, Object> sessionMap = new HashMap<String, Object>();
int saved = new FacesMessagesUtils().saveMessages(facesContext, sessionMap);
// messages stored in session
assertEquals(3, saved);
assertNotNull(sessionMap.get(FacesMessagesUtils.token));
assertEquals(3, ((Collection<?>) sessionMap.get(FacesMessagesUtils.token)).size());
}
@Test
public void testDuplicatedMessages()
{
/*
* Step 1: Save
*/
// class under test
FacesMessagesUtils utils = new FacesMessagesUtils();
// set up FacesContext
FacesContextMock facesContext = new FacesContextMock();
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Summary A", "Detail A"));
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Summary B", "Detail B"));
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Summary C", "Detail C"));
// call saveMessages()
Map<String, Object> sessionMap = new HashMap<String, Object>();
int saved = utils.saveMessages(facesContext, sessionMap);
// check message are saved
assertEquals(3, saved);
assertNotNull(sessionMap.get(FacesMessagesUtils.token));
assertEquals(3, ((Collection<?>) sessionMap.get(FacesMessagesUtils.token)).size());
/*
* Step 2: Restore
*/
// Setup new FacesContext with two messages
facesContext.clearAllMesages();
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Summary B", "Detail B"));
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Summary B", "Detail B"));
// restore messages
int restored = utils.restoreMessages(facesContext, sessionMap);
// check that two of the three messages have been restored
assertEquals(2, restored);
assertEquals(4, facesContext.getAllMessages().size());
}
/**
* Simple mock of {@link FacesContext} that just handles the message queue.
*
*/
private static class FacesContextMock extends FacesContext
{
private List<FacesMessage> messages = new ArrayList<FacesMessage>();
public List<FacesMessage> getAllMessages()
{
return messages;
}
public void clearAllMesages()
{
messages.clear();
}
@Override
public void addMessage(String arg0, FacesMessage arg1)
{
messages.add(arg1);
}
@Override
public Application getApplication()
{
return null;
}
@Override
public Iterator<String> getClientIdsWithMessages()
{
return null;
}
@Override
public ExternalContext getExternalContext()
{
return null;
}
@Override
public Severity getMaximumSeverity()
{
return null;
}
@Override
public Iterator<FacesMessage> getMessages()
{
return messages.iterator();
}
@Override
public Iterator<FacesMessage> getMessages(String arg0)
{
return messages.iterator();
}
@Override
public RenderKit getRenderKit()
{
return null;
}
@Override
public boolean getRenderResponse()
{
return false;
}
@Override
public boolean getResponseComplete()
{
return false;
}
@Override
public ResponseStream getResponseStream()
{
return null;
}
@Override
public ResponseWriter getResponseWriter()
{
return null;
}
@Override
public UIViewRoot getViewRoot()
{
return null;
}
@Override
public void release()
{
}
@Override
public void renderResponse()
{
}
@Override
public void responseComplete()
{
}
@Override
public void setResponseStream(ResponseStream arg0)
{
}
@Override
public void setResponseWriter(ResponseWriter arg0)
{
}
@Override
public void setViewRoot(UIViewRoot arg0)
{
}
}
}