/* * Copyright (c) 2001-2016, Inversoft Inc., All Rights Reserved * * 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.primeframework.mvc.action.config; import javax.servlet.ServletContext; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import org.easymock.Capture; import org.easymock.EasyMock; import org.example.action.KitchenSink; import org.example.action.Simple; import org.example.action.TestAnnotation; import org.example.action.user.Index; import org.example.domain.UserField; import org.primeframework.mvc.action.result.annotation.Forward; import org.primeframework.mvc.action.result.annotation.JSON; import org.primeframework.mvc.action.result.annotation.Redirect; import org.primeframework.mvc.action.result.annotation.Status; import org.primeframework.mvc.content.binary.BinaryActionConfiguration; import org.primeframework.mvc.content.binary.BinaryActionConfigurator; import org.primeframework.mvc.content.json.JacksonActionConfiguration; import org.primeframework.mvc.content.json.JacksonActionConfigurator; import org.primeframework.mvc.servlet.HTTPMethod; import org.primeframework.mvc.util.DefaultURIBuilder; import org.testng.annotations.Test; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.eq; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; /** * This class tests the default action configuration provider. * * @author Brian Pontarelli */ public class DefaultActionConfigurationProviderTest { @Test public void configure() throws Exception { ServletContext context = EasyMock.createStrictMock(ServletContext.class); Capture<Map<String, ActionConfiguration>> c = new Capture<>(); context.setAttribute(eq(DefaultActionConfigurationProvider.ACTION_CONFIGURATION_KEY), capture(c)); EasyMock.replay(context); new DefaultActionConfigurationProvider(context, new DefaultActionConfigurationBuilder(new DefaultURIBuilder(), new HashSet<>(Arrays.asList(new JacksonActionConfigurator(), new BinaryActionConfigurator())))); Map<String, ActionConfiguration> config = c.getValue(); assertSame(config.get("/simple").actionClass, Simple.class); assertNotNull(config.get("/simple").annotation); assertEquals(config.get("/simple").executeMethods.size(), 8); assertEquals(config.get("/simple").executeMethods.get(HTTPMethod.GET).method, Simple.class.getMethod("execute")); assertEquals(config.get("/simple").executeMethods.get(HTTPMethod.POST).method, Simple.class.getMethod("execute")); assertEquals(config.get("/simple").executeMethods.get(HTTPMethod.PUT).method, Simple.class.getMethod("execute")); assertEquals(config.get("/simple").executeMethods.get(HTTPMethod.HEAD).method, Simple.class.getMethod("execute")); assertEquals(config.get("/simple").executeMethods.get(HTTPMethod.DELETE).method, Simple.class.getMethod("execute")); assertEquals(config.get("/simple").resultConfigurations.size(), 0); assertEquals(config.get("/simple").pattern, ""); assertEquals(config.get("/simple").patternParts.length, 0); assertEquals(config.get("/simple").uri, "/simple"); assertEquals(config.get("/simple").validationMethods.size(), 0); assertNotNull(config.get("/user/index")); assertSame(Index.class, config.get("/user/index").actionClass); assertEquals(config.get("/user/index").uri, "/user/index"); assertSame(config.get("/kitchen-sink").actionClass, KitchenSink.class); assertNotNull(config.get("/kitchen-sink").annotation); assertNotNull(config.get("/kitchen-sink").annotations.get(TestAnnotation.class)); assertEquals(config.get("/kitchen-sink").executeMethods.size(), 3); assertEquals(config.get("/kitchen-sink").executeMethods.get(HTTPMethod.GET).method, KitchenSink.class.getMethod("get")); assertNotNull(config.get("/kitchen-sink").executeMethods.get(HTTPMethod.GET).annotations.get(TestAnnotation.class)); assertEquals(config.get("/kitchen-sink").executeMethods.get(HTTPMethod.HEAD).method, KitchenSink.class.getMethod("get")); assertEquals(config.get("/kitchen-sink").executeMethods.get(HTTPMethod.POST).method, KitchenSink.class.getMethod("post")); assertNull(config.get("/kitchen-sink").executeMethods.get(HTTPMethod.PUT)); assertNull(config.get("/kitchen-sink").executeMethods.get(HTTPMethod.DELETE)); assertEquals(config.get("/kitchen-sink").resultConfigurations.size(), 8); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward1")).code(), "forward1"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward1")).contentType(), "text"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward1")).page(), "/WEB-INF/forward1.ftl"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward1")).status(), 200); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward1")).statusStr(), ""); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward2")).code(), "forward2"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward2")).contentType(), "bin"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward2")).page(), "/WEB-INF/forward2.ftl"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward2")).status(), 300); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward2")).statusStr(), "foo"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward-superclass")).code(), "forward-superclass"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward-superclass")).contentType(), "text/html; charset=UTF-8"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward-superclass")).page(), "forward-superclass.ftl"); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward-superclass")).status(), 200); assertEquals(((Forward) config.get("/kitchen-sink").resultConfigurations.get("forward-superclass")).statusStr(), ""); assertEquals(((Redirect) config.get("/kitchen-sink").resultConfigurations.get("redirect1")).code(), "redirect1"); assertEquals(((Redirect) config.get("/kitchen-sink").resultConfigurations.get("redirect1")).uri(), "/redirect1"); assertTrue(((Redirect) config.get("/kitchen-sink").resultConfigurations.get("redirect1")).perm()); assertEquals(((Redirect) config.get("/kitchen-sink").resultConfigurations.get("redirect2")).code(), "redirect2"); assertEquals(((Redirect) config.get("/kitchen-sink").resultConfigurations.get("redirect2")).uri(), "/redirect2"); assertFalse(((Redirect) config.get("/kitchen-sink").resultConfigurations.get("redirect2")).perm()); assertEquals(((Status) config.get("/kitchen-sink").resultConfigurations.get("status")).code(), "status"); assertEquals(((Status) config.get("/kitchen-sink").resultConfigurations.get("status")).status(), 300); assertEquals(((Status) config.get("/kitchen-sink").resultConfigurations.get("status")).statusStr(), "hello world"); assertEquals(((Status) config.get("/kitchen-sink").resultConfigurations.get("status")).headers()[0].name(), "foo"); assertEquals(((Status) config.get("/kitchen-sink").resultConfigurations.get("status")).headers()[0].value(), "bar"); assertEquals(((Status) config.get("/kitchen-sink").resultConfigurations.get("status")).headers()[1].name(), "baz"); assertEquals(((Status) config.get("/kitchen-sink").resultConfigurations.get("status")).headers()[1].value(), "fred"); assertEquals(((JSON) config.get("/kitchen-sink").resultConfigurations.get("json")).code(), "json"); assertEquals(((JSON) config.get("/kitchen-sink").resultConfigurations.get("json")).status(), 201); assertEquals(config.get("/kitchen-sink").pattern, "{name}/{value}/static/{foo}"); assertEquals(config.get("/kitchen-sink").patternParts.length, 4); assertEquals(config.get("/kitchen-sink").uri, "/kitchen-sink"); assertEquals(config.get("/kitchen-sink").preParameterMethods.size(), 1); assertEquals(config.get("/kitchen-sink").postParameterMethods.size(), 1); assertEquals(config.get("/kitchen-sink").preValidationMethods.size(), 1); assertEquals(config.get("/kitchen-sink").postValidationMethods.size(), 1); assertEquals(config.get("/kitchen-sink").validationMethods.size(), 1); assertEquals(config.get("/kitchen-sink").validationMethods.get(HTTPMethod.POST).get(0).method, KitchenSink.class.getMethod("validate")); assertEquals(((JacksonActionConfiguration) config.get("/kitchen-sink").additionalConfiguration.get(JacksonActionConfiguration.class)).requestMember, "jsonRequest"); assertEquals(((JacksonActionConfiguration) config.get("/kitchen-sink").additionalConfiguration.get(JacksonActionConfiguration.class)).requestMemberType, UserField.class); assertEquals(((JacksonActionConfiguration) config.get("/kitchen-sink").additionalConfiguration.get(JacksonActionConfiguration.class)).responseMember, "jsonResponse"); assertEquals(((BinaryActionConfiguration) config.get("/kitchen-sink").additionalConfiguration.get(BinaryActionConfiguration.class)).responseMember, "binaryResponse"); assertEquals(((BinaryActionConfiguration) config.get("/kitchen-sink").additionalConfiguration.get(BinaryActionConfiguration.class)).requestMember, "binaryRequest"); // Verify inheritance results assertSame(config.get("/extension-inheritance").resultConfigurations.get("success").annotationType(), Forward.class); } }