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.

Reply via email to