A suggested SeamTest improvement
matt.drees Jul 12, 2007 2:33 AMI spent some time debugging one of my tests, trying to figure out why the conversation wasn't being propagated. I had something (very roughly) like this:
String cid = new FacesRequest("/page1.xhtml") {
@Override
protected void invokeApplication() throws Exception {
Manager.instance().beginConversation();
FacesManager.instance().redirect("/page2.xhtml");
}
}.run();
cid = new FacesRequest("/page2.xhtml", cid) {
@Override
protected void invokeApplication() {
assert Manager.instance().isLongRunningConversation();
}
}.run();
But the assertion fails, which I learned has to do with the fact that there was nothing rendered in the first request. So, I can fix it by doing this:
String cid = new FacesRequest("/page1.xhtml") {
@Override
protected void invokeApplication() throws Exception {
Manager.instance().beginConversation();
FacesManager.instance().redirect("/page2.xhtml");
}
}.run();
cid = new NonFacesRequest("/page2.xhtml", cid) {
}.run();
cid = new FacesRequest("/page2.xhtml", cid) {
@Override
protected void invokeApplication() {
assert Manager.instance().isLongRunningConversation();
}
}.run();
But it annoys me to have that empty request in there. So, it'd be nice to have something like this:
String cid = new FacesRequestAndRedirect("/page1.xhtml", null, "/page2.xhtml") {
@Override
protected void invokeApplication() throws Exception {
Manager.instance().beginConversation();
FacesManager.instance().redirect(getRedirectedTo());
}
@Override
public void renderAfterRedirect() throws Exception {
assert Manager.instance().isLongRunningConversation();
}
}.run();
cid = new FacesRequest("/page2.xhtml", cid) {
@Override
protected void invokeApplication() throws Exception {
assert Manager.instance().isLongRunningConversation();
}
}.run();
And it turns out that I could make it happen with this convolution:
public class FacesRequestAndRedirect extends FacesRequest {
private String redirectedTo;
public FacesRequestAndRedirect() {
super();
}
public FacesRequestAndRedirect(String viewId, String conversationId) {
super(viewId, conversationId);
}
public FacesRequestAndRedirect(String viewId) {
super(viewId);
}
public FacesRequestAndRedirect(String viewId, String conversationId, String redirectedTo) {
super(viewId, conversationId);
setRedirectedTo(redirectedTo);
}
@Override
public final void renderResponse() throws Exception {
}
public void renderAfterRedirect() throws Exception {
}
public String getRedirectedTo() {
return redirectedTo;
}
public void setRedirectedTo(String redirectedTo) {
this.redirectedTo = redirectedTo;
}
@Override
public String run() throws Exception {
String cid = super.run();
cid = new NonFacesRequest(getRedirectedTo(), cid) {
@Override
protected void renderResponse() throws Exception {
renderAfterRedirect();
}
}.run();
return cid;
}
}
So, I haven't used it or thought about it much, but it might be worth putting something like this into Seam. Any thoughts?