Wicket Tester does not properly set the rendered page when
setResponsePage(xxx.class) and setRedirect(true) are called as a result of
executeAjaxEvent on an AjaxButton.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key: WICKET-2898
URL: https://issues.apache.org/jira/browse/WICKET-2898
Project: Wicket
Issue Type: Bug
Components: wicket
Affects Versions: 1.4.8
Reporter: Scott Hraban
Fix For: 1.4.10, 1.5-M1
The code that is being tested is supposed to AJAX submit a form, and if login
is successful, do a redirect to the home page.
It works in real life, but the Wicket Tester seems to have problems with it.
The following is a simplification of the code being tested:
public InputForm extends Form
{
public InputForm()
{
new AjaxButton("button", InputForm.this)
{
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(final AjaxRequestTarget target,
final Form form)
{
setResponsePage(IndexPage.class);
setRedirect(true);
}
};
}
@Override
protected void onSubmit()
{
if (!<authenticate>)
{
error("fail");
}
}
}
And this is the test code:
@Test
public void testLogin()
{
tester.startPage(LoginPage.class);
tester.assertRenderedPage(LoginPage.class);
final FormTester formTester = tester.newFormTester("inputForm");
formTester.setValue("username", "VALID");
formTester.setValue("password", "VALID");
formTester.setValue("button", "true");
tester.executeAjaxEvent("inputForm:button", "onclick");
tester.assertRenderedPage(IndexPage.class);
tester.assertNoErrorMessage();
}
This issue seems to be specific in that we need the redirect, using AJAX, and
setResponsePage() with a class. If I change it to setResponsePage(new
IndexPage());, the there is no problem, but this is not the right thing to do
for the real world.
It appears that the problem might be in
MockWebApplication::postProcessRequestCycle, in that the code in 1.3.7 tester
passed this test, but the 1.4.8 tester does not, and this is the 1.3.7 and
1.4.8 code to compare:
1.3.7:
if (httpResponse.isRedirect())
{
lastRenderedPage =
generateLastRenderedPage(cycle);
MockHttpServletRequest newHttpRequest = new
MockHttpServletRequest(application,
servletSession,
application.getServletContext());
newHttpRequest.setRequestToRedirectString(httpResponse.getRedirectLocation());
wicketRequest =
application.newWebRequest(newHttpRequest);
cycle = createRequestCycle();
cycle.request();
}
1.4.8:
if (httpResponse.isRedirect())
{
lastRenderedPage =
generateLastRenderedPage(cycle);
MockHttpServletRequest newHttpRequest = new
MockHttpServletRequest(application,
servletSession,
application.getServletContext());
newHttpRequest.setRequestToRedirectString(httpResponse.getRedirectLocation());
wicketRequest =
application.newWebRequest(newHttpRequest);
cycle = createRequestCycle();
cycle.request();
}
else
{
String url =
httpResponse.getHeader("Ajax-Location");
if (url != null)
{
MockHttpServletRequest newHttpRequest =
new MockHttpServletRequest(application,
servletSession,
application.getServletContext());
newHttpRequest.setRequestToRedirectString(url);
wicketRequest =
application.newWebRequest(newHttpRequest);
cycle = createRequestCycle();
cycle.request();
}
}
What I notice is that the AJAX path for the redirect is missing the
"lastRenderedPage = generateLastRenderedPage(cycle);" that is there for the
regular redirect, and was there in 1.3.7 for the AJAX path (since there was no
distinction.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.