/*
* Copyright 2006 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springmodules.xt.ajax;
import java.util.List;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springmodules.xt.ajax.support.NoMatchingHandlerException;
import org.springmodules.xt.ajax.support.UnsupportedEventException;
import org.springmodules.xt.test.ajax.DummyHandler;
import org.springmodules.xt.test.ajax.DummySubmitHandler;
/**
*
* @author Sergio Bossa
*/
public class AjaxInterceptorTest extends AbstractDependencyInjectionSpringContextTests {
public AjaxInterceptorTest(String testName) {
super(testName);
}
public void testPreHandleSucceeds() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
MockHttpServletRequest httpRequest = new MockHttpServletRequest("GET", "/ajax/test.action");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
SimpleFormController controller = new SimpleFormController();
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_ACTION_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "action");
ajaxInterceptor.preHandle(httpRequest, httpResponse, controller);
String response1 = httpResponse.getContentAsString();
String response2 = new DummyHandler().action(new AjaxActionEventImpl("action", httpRequest)).render();
assertEquals(response1, response2);
}
public void testPreHandleFailsWithUnsupportedEventException() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
MockHttpServletRequest httpRequest = new MockHttpServletRequest("GET", "/ajax/test.action");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
ModelAndView mv = new ModelAndView();
SimpleFormController controller = new SimpleFormController();
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_ACTION_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "fail");
try {
ajaxInterceptor.preHandle(httpRequest, httpResponse, controller);
fail("Should throw UnsupportedEventException!");
}
catch(UnsupportedEventException ex) {}
catch(Exception ex) {
fail("Should throw UnsupportedEventException!");
}
}
public void testPreHandleFailsWithNoMatchingHandlerException() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
MockHttpServletRequest httpRequest = new MockHttpServletRequest("GET", "/ajax/test2.action");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
ModelAndView mv = new ModelAndView();
SimpleFormController controller = new SimpleFormController();
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_ACTION_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "fail");
try {
ajaxInterceptor.preHandle(httpRequest, httpResponse, controller);
fail("Should throw NoMatchingHandlerException!");
}
catch(NoMatchingHandlerException ex) {}
catch(Exception ex) {
fail("Should throw NoMatchingHandlerException!");
}
}
public void testPostHandleSucceeds() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
XmlWebApplicationContext springContext = new XmlWebApplicationContext();
MockServletContext servletContext = new MockServletContext();
springContext.setConfigLocations(this.getConfigLocations());
springContext.setServletContext(servletContext);
springContext.refresh();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
MockHttpServletRequest httpRequest = new MockHttpServletRequest(servletContext, "POST", "/ajax/submit.action");
MockHttpSession session = new MockHttpSession(servletContext);
httpRequest.setSession(session);
httpRequest.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_SUBMIT_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "submit");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
SimpleFormController controller = new SimpleFormController();
ModelAndView mv = new ModelAndView("");
ajaxInterceptor.postHandle(httpRequest, httpResponse, controller, mv);
String response1 = httpResponse.getContentAsString();
String response2 = new DummySubmitHandler().submit(new AjaxSubmitEventImpl("submit", httpRequest)).render();
assertEquals(response1, response2);
}
public void testPostHandleWithAjaxRedirectPrefix() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
XmlWebApplicationContext springContext = new XmlWebApplicationContext();
MockServletContext servletContext = new MockServletContext();
springContext.setConfigLocations(this.getConfigLocations());
springContext.setServletContext(servletContext);
springContext.refresh();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
MockHttpServletRequest httpRequest = new MockHttpServletRequest(servletContext, "POST", "/ajax/submit.action");
MockHttpSession session = new MockHttpSession(servletContext);
httpRequest.setSession(session);
httpRequest.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_SUBMIT_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "validate");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
ModelAndView mv = new ModelAndView("ajax-redirect:/ajax/success.page");
SimpleFormController controller = new SimpleFormController();
ajaxInterceptor.postHandle(httpRequest, httpResponse, controller, mv);
assertTrue(httpResponse.getContentAsString().indexOf("/ajax/success.page") != -1);
}
public void testPostHandleWithStandardRedirectPrefix() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
XmlWebApplicationContext springContext = new XmlWebApplicationContext();
MockServletContext servletContext = new MockServletContext();
springContext.setConfigLocations(this.getConfigLocations());
springContext.setServletContext(servletContext);
springContext.refresh();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
MockHttpServletRequest httpRequest = new MockHttpServletRequest(servletContext, "POST", "/ajax/submit.action");
MockHttpSession session = new MockHttpSession(servletContext);
httpRequest.setSession(session);
httpRequest.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_SUBMIT_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "validate");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
ModelAndView mv = new ModelAndView("redirect:/ajax/success.page");
SimpleFormController controller = new SimpleFormController();
ajaxInterceptor.postHandle(httpRequest, httpResponse, controller, mv);
assertTrue(httpResponse.getContentAsString().indexOf("/ajax/success.page") != -1);
}
public void testPostHandleFailsWithUnsupportedEventException() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
XmlWebApplicationContext springContext = new XmlWebApplicationContext();
MockServletContext servletContext = new MockServletContext();
springContext.setConfigLocations(this.getConfigLocations());
springContext.setServletContext(servletContext);
springContext.refresh();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
MockHttpServletRequest httpRequest = new MockHttpServletRequest(servletContext, "POST", "/ajax/submit.action");
MockHttpSession session = new MockHttpSession(servletContext);
httpRequest.setSession(session);
httpRequest.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_SUBMIT_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "fail");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
ModelAndView mv = new ModelAndView("ajax-redirect:/ajax/success.page");
SimpleFormController controller = new SimpleFormController();
try {
ajaxInterceptor.postHandle(httpRequest, httpResponse, controller, mv);
fail("Should throw UnsupportedEventException!");
}
catch(UnsupportedEventException ex) {}
catch(Exception ex) {
fail("Should throw UnsupportedEventException!");
}
}
public void testPostHandleFailsWithNoMatchingHandlerException() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
XmlWebApplicationContext springContext = new XmlWebApplicationContext();
MockServletContext servletContext = new MockServletContext();
springContext.setConfigLocations(this.getConfigLocations());
springContext.setServletContext(servletContext);
springContext.refresh();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
MockHttpServletRequest httpRequest = new MockHttpServletRequest(servletContext, "POST", "/ajax/submit2.action");
MockHttpSession session = new MockHttpSession(servletContext);
httpRequest.setSession(session);
httpRequest.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
httpRequest.setParameter(ajaxInterceptor.getAjaxParameter(), ajaxInterceptor.AJAX_SUBMIT_REQUEST);
httpRequest.setParameter(ajaxInterceptor.getEventParameter(), "fail");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
ModelAndView mv = new ModelAndView("ajax-redirect:/ajax/success.page");
SimpleFormController controller = new SimpleFormController();
try {
ajaxInterceptor.postHandle(httpRequest, httpResponse, controller, mv);
fail("Should throw NoMatchingHandlerException!");
}
catch(NoMatchingHandlerException ex) {}
catch(Exception ex) {
fail("Should throw NoMatchingHandlerException!");
}
}
public void testPostHandleStopsBecauseOfNoModelAndView() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
XmlWebApplicationContext springContext = new XmlWebApplicationContext();
MockServletContext servletContext = new MockServletContext();
springContext.setConfigLocations(this.getConfigLocations());
springContext.setServletContext(servletContext);
springContext.refresh();
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
MockHttpServletRequest httpRequest = new MockHttpServletRequest(servletContext, "POST", "/ajax/simple.page");
MockHttpSession session = new MockHttpSession(servletContext);
httpRequest.setSession(session);
httpRequest.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext);
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
SimpleFormController controller = new SimpleFormController();
ajaxInterceptor.postHandle(httpRequest, httpResponse, controller, null);
}
public void testLookupHandlers() throws Exception {
AjaxInterceptor ajaxInterceptor = (AjaxInterceptor) this.applicationContext.getBean("ajaxInterceptor");
MockHttpServletRequest httpRequest = null;
List<AjaxHandler> handlers = null;
httpRequest = new MockHttpServletRequest("GET", "/ajax/test.action");
handlers = ajaxInterceptor.lookupHandlers(httpRequest);
assertEquals(1, handlers.size());
httpRequest = new MockHttpServletRequest("GET", "/ajax/submit.action");
handlers = ajaxInterceptor.lookupHandlers(httpRequest);
assertEquals(2, handlers.size());
httpRequest = new MockHttpServletRequest("GET", "/ajax/chainedSubmit.action");
handlers = ajaxInterceptor.lookupHandlers(httpRequest);
assertEquals(2, handlers.size());
httpRequest = new MockHttpServletRequest("GET", "/ajax/no.action");
handlers = ajaxInterceptor.lookupHandlers(httpRequest);
assertEquals(0, handlers.size());
}
protected String[] getConfigLocations() {
return new String[]{"testApplicationContext.xml"};
}
}