Redirect messes up SeamTest - Bug?
acerberus Jul 18, 2009 9:44 PMI think there is a bug in SeamTest concerning the handling of redirects. If a redirect occurs (via pageflow, manually via setOutcome or via the return value of an action during the invokeApplicationPhase) conversations are lost and cannot be propagated to the a following FacesRequest.
The things that got me started on this were that I could not propagate conversations properly during tests. See my forum entries:
Could one of the Seam gurus please crosscheck that? Or am I doing something completely irational here and there is a perfectly good reason why this cannot work?
Here is a simple SeamTest to illustrate the conversation propagation behavior:
@Test public void testSeamBug1() throws Exception{ final String cid = new FacesRequest(){ @Override protected void invokeApplication(){ Conversation.instance().begin(); assert isLongRunningConversation(); setOutcome("/someViewId.xhtml"); } }.run(); new FacesRequest("/someViewId.xhtml", cid) { @Override protected void invokeApplication(){ assert isLongRunningConversation(); } }.run(); }
If setOutcome is removed then the assertion holds.
A workaround that I found, which is however hardly satisfying is to squeeze a dummy NonFacesRequest in between the two FacesRequests. This example here works perfectly and the conversation is propagated correctly:
@Test public void testSeamBug2() throws Exception{ final String cid = new FacesRequest(){ @Override protected void invokeApplication(){ Conversation.instance().begin(); assert isLongRunningConversation(); setOutcome("/someViewId.xhtml"); } }.run(); /* a dummy request to save the conversation */ new NonFacesRequest("/someViewId.xhtml", cid) { @Override protected void renderResponse(){ assert isLongRunningConversation(); } }.run(); new FacesRequest("/someViewId.xhtml", cid) { @Override protected void invokeApplication(){ assert isLongRunningConversation(); } }.run(); }
Does anyone have an explanation about what is going on here?
Cheers
Arno