/* * Copyright 2014 Kenshoo.com * * 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 com.kenshoo.freemarker.resources; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.request.RequestContextListener; import com.kenshoo.freemarker.model.ExecuteRequest; import com.kenshoo.freemarker.model.ExecuteResourceField; import com.kenshoo.freemarker.model.ExecuteResourceProblem; import com.kenshoo.freemarker.model.ExecuteResponse; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.spi.spring.container.servlet.SpringServlet; import com.sun.jersey.test.framework.AppDescriptor; import com.sun.jersey.test.framework.JerseyTest; import com.sun.jersey.test.framework.WebAppDescriptor; /** * Created by Pmuruge on 8/29/2015. */ public class FreeMarkerOnlineExecuteResourceTest extends JerseyTest { private static final String DATA_MODEL = "user=John"; private static final String TEMPLATE_WITH_VARIABLE = "Welcome ${user}"; private static final String TEMPLATE_PLAIN = "Welcome John"; private static final String MALFORMED_DATA_MODEL = "userJohn"; private static final String EXECUTE_API = "api/execute"; @Override protected AppDescriptor configure() { return new WebAppDescriptor.Builder("com.kenshoo.freemarker.resources") .contextPath("/") .contextListenerClass(ContextLoaderListener.class) .contextParam("contextConfigLocation", "classpath:spring/bootstrap-context.xml") .servletClass(SpringServlet.class) .requestListenerClass(RequestContextListener.class) .build(); } @Test public void testSuccessRequest() throws Exception { ExecuteRequest req = new ExecuteRequest(TEMPLATE_WITH_VARIABLE, DATA_MODEL); ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API) .header("Content-Type", "application/json").entity(req).post(ClientResponse.class); assertEquals(200, resp.getStatus()); ExecuteResponse response = resp.getEntity(ExecuteResponse.class); assertNull(response.getProblems()); } @Test public void testMalformedDataModel() throws Exception { ExecuteRequest req = new ExecuteRequest(TEMPLATE_PLAIN, MALFORMED_DATA_MODEL); ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API) .header("Content-Type", "application/json").entity(req).post(ClientResponse.class); assertEquals(200, resp.getStatus()); ExecuteResponse response = resp.getEntity(ExecuteResponse.class); assertNotNull(response.getProblems()); assertTrue(containsProblem(response, ExecuteResourceField.DATA_MODEL)); } @Test public void testLongDataModel() throws Exception { ExecuteRequest req = new ExecuteRequest(TEMPLATE_PLAIN, create30KString()); ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API) .header("Content-Type", "application/json").entity(req).post(ClientResponse.class); assertEquals(200, resp.getStatus()); ExecuteResponse response = resp.getEntity(ExecuteResponse.class); assertNotNull(response.getProblems()); assertTrue(containsProblem(response, ExecuteResourceField.DATA_MODEL)); String problemMessage = getProblemMessage(response, ExecuteResourceField.DATA_MODEL); assertThat(problemMessage, containsString("data model")); assertThat(problemMessage, containsString("limit")); } @Test public void testLongTemplate() throws Exception { ExecuteRequest req = new ExecuteRequest(create30KString(), DATA_MODEL); ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API) .header("Content-Type", "application/json").entity(req).post(ClientResponse.class); assertEquals(200, resp.getStatus()); ExecuteResponse response = resp.getEntity(ExecuteResponse.class); assertNotNull(response.getProblems()); assertTrue(containsProblem(response, ExecuteResourceField.TEMPLATE)); String problemMessage = getProblemMessage(response, ExecuteResourceField.TEMPLATE); assertThat(problemMessage, containsString("template")); assertThat(problemMessage, containsString("limit")); } @Test public void testMultipleErrorsDataModel() throws Exception { ExecuteRequest req = new ExecuteRequest(create30KString(), create30KString()); req.setOutputFormat("wrongOutputFormat"); req.setLocale("wrongLocale"); req.setTimeZone("wrongTimeZone"); ClientResponse resp = client().resource(getBaseURI() + EXECUTE_API) .header("Content-Type", "application/json").entity(req).post(ClientResponse.class); assertEquals(200, resp.getStatus()); ExecuteResponse response = resp.getEntity(ExecuteResponse.class); assertNotNull(response.getProblems()); assertThat(getProblemMessage(response, ExecuteResourceField.TEMPLATE), containsString("limit")); assertThat(getProblemMessage(response, ExecuteResourceField.DATA_MODEL), containsString("limit")); assertThat(getProblemMessage(response, ExecuteResourceField.OUTPUT_FORMAT), containsString("wrongOutputFormat")); assertThat(getProblemMessage(response, ExecuteResourceField.LOCALE), containsString("wrongLocale")); assertThat(getProblemMessage(response, ExecuteResourceField.TIME_ZONE), containsString("wrongTimeZone")); } private String create30KString() { final String veryLongString; { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 30000 / 10; i++) { sb.append("0123456789"); } veryLongString = sb.toString(); } return veryLongString; } private boolean containsProblem(ExecuteResponse response, ExecuteResourceField field) { for (ExecuteResourceProblem problem : response.getProblems()) { if (problem.getField() == field) { return true; } } return false; } private String getProblemMessage(ExecuteResponse response, ExecuteResourceField field) { for (ExecuteResourceProblem problem : response.getProblems()) { if (problem.getField() == field) { return problem.getMessage(); } } return null; } }