package org.bonitasoft.livingapps; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.bonitasoft.console.common.server.page.CustomPageRequestModifier; import org.bonitasoft.console.common.server.page.PageRenderer; import org.bonitasoft.console.common.server.page.ResourceRenderer; import org.bonitasoft.console.common.server.utils.BonitaHomeFolderAccessor; import org.bonitasoft.engine.business.application.ApplicationPageNotFoundException; import org.bonitasoft.engine.exception.BonitaHomeNotSetException; import org.bonitasoft.engine.exception.ServerAPIException; import org.bonitasoft.engine.exception.UnknownAPITypeException; import org.bonitasoft.engine.page.PageNotFoundException; import org.bonitasoft.engine.session.APISession; import org.bonitasoft.livingapps.exception.CreationException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class LivingApplicationServletTest { @Mock HttpServletRequest hsRequest; @Mock HttpServletResponse hsResponse; @Mock APISession session; @Mock ApplicationRouter router; @Mock ResourceRenderer resourceRenderer; @Mock PageRenderer pageRenderer; @Mock CustomPageRequestModifier customPageRequestModifier; @Spy LivingApplicationServlet servlet; @Before public void beforeEach() throws Exception { doReturn(router).when(servlet).createApplicationRouter(any(APISession.class)); doReturn(pageRenderer).when(servlet).getPageRenderer(); doReturn(resourceRenderer).when(servlet).getResourceRenderer(); doReturn(session).when(servlet).getSession(hsRequest); doReturn("/appToken/pageToken/").when(hsRequest).getPathInfo(); servlet.customPageRequestModifier = customPageRequestModifier; } @Test public void should_send_error_404_when_the_application_page_is_not_found() throws Exception { doThrow(new ApplicationPageNotFoundException("error")).when(router).route(eq(hsRequest), eq(hsResponse), eq(session), eq(pageRenderer), eq(resourceRenderer), any(BonitaHomeFolderAccessor.class)); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(404, "error"); } @Test public void should_send_error_404_when_the_custom_page_is_not_associated_to_application() throws Exception { doThrow(new ApplicationPageNotFoundException("error")).when(router).route(eq(hsRequest), eq(hsResponse), eq(session), eq(pageRenderer), eq(resourceRenderer), any(BonitaHomeFolderAccessor.class)); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(404,"error"); } @Test public void should_send_error_404_when_the_custom_page_is_not_existing() throws Exception { doThrow(new PageNotFoundException("PageName")).when(router).route(eq(hsRequest), eq(hsResponse), eq(session), eq(pageRenderer), eq(resourceRenderer), any(BonitaHomeFolderAccessor.class)); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(404, "Unable to find page with name: "+"PageName" ); } @Test public void should_send_error_500_on_searchException() throws Exception { doThrow(new CreationException("error")).when(router).route(eq(hsRequest), eq(hsResponse), eq(session), eq(pageRenderer), eq(resourceRenderer), any(BonitaHomeFolderAccessor.class)); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(404, "error"); } @Test public void should_send_error_500_on_BonitaHomeNotSetException() throws Exception { doThrow(new BonitaHomeNotSetException("error")).when(router).route(eq(hsRequest), eq(hsResponse), eq(session), eq(pageRenderer), eq(resourceRenderer), any(BonitaHomeFolderAccessor.class)); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(500); } @Test public void should_send_error_500_on_ServerAPIException() throws Exception { given(servlet.createApplicationRouter(session)) .willThrow(new ServerAPIException(new Exception(""))); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(500); } @Test public void should_send_error_500_on_UnknownAPITypeException() throws Exception { given(servlet.createApplicationRouter(session)) .willThrow(new UnknownAPITypeException("error")); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(500); } @Test public void should_send_error_404_when_the_page_is_not_found() throws Exception { doThrow(new ApplicationPageNotFoundException("error")).when(router).route(eq(hsRequest), eq(hsResponse), eq(session), eq(pageRenderer), eq(resourceRenderer), any(BonitaHomeFolderAccessor.class)); servlet.service(hsRequest, hsResponse); verify(hsResponse).sendError(404, "error"); } @Test public void should_redirectToValidPageUrl_on_missing_final_slash() throws Exception { doReturn("/appToken/pageToken").when(hsRequest).getPathInfo(); servlet.service(hsRequest, hsResponse); verify(customPageRequestModifier).redirectToValidPageUrl(hsRequest, hsResponse); } @Test public void should_redirectToValidPageUrl_on_missing_final_slash_after_appToken() throws Exception { doReturn("/appToken").when(hsRequest).getPathInfo(); servlet.service(hsRequest, hsResponse); verify(customPageRequestModifier).redirectToValidPageUrl(hsRequest, hsResponse); } @Test public void should_not_redirectToValidPageUrl_on_resource_query() throws Exception { doReturn("/appToken/pageToken/file.css").when(hsRequest).getPathInfo(); servlet.service(hsRequest, hsResponse); verify(customPageRequestModifier, times(0)).redirectToValidPageUrl(hsRequest, hsResponse); } }