package net.eusashead.hateoas.response.argumentresolver; /* * #[license] * spring-responseentitybuilder * %% * Copyright (C) 2013 Eusa's Head * %% * 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. * %[license] */ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import javax.servlet.http.HttpServletRequest; import net.eusashead.hateoas.response.DeleteResponseBuilder; import net.eusashead.hateoas.response.EntityResponseBuilder; import net.eusashead.hateoas.response.OptionsResponseBuilder; import net.eusashead.hateoas.response.PostResponseBuilder; import net.eusashead.hateoas.response.PutResponseBuilder; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.springframework.core.MethodParameter; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.ModelAndViewContainer; @RunWith(JUnit4.class) public class ResponseBuilderMethodArgumentResolverTest { private ResponseBuilderMethodArgumentResolver resolver; @Before public void before() { resolver = new ResponseBuilderMethodArgumentResolver(); } @Test public void testSupportsGetResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(EntityResponseBuilder.class); Assert.assertTrue(resolver.supportsParameter(parameter)); } @Test public void testSupportsOptionsResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(OptionsResponseBuilder.class); Assert.assertTrue(resolver.supportsParameter(parameter)); } @Test public void testSupportsPostResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(PostResponseBuilder.class); Assert.assertTrue(resolver.supportsParameter(parameter)); } @Test public void testSupportsPutResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(PutResponseBuilder.class); Assert.assertTrue(resolver.supportsParameter(parameter)); } @Test public void testSupportsDeleteResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(DeleteResponseBuilder.class); Assert.assertTrue(resolver.supportsParameter(parameter)); } @Test public void testResolveGetResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(EntityResponseBuilder.class); ModelAndViewContainer container = mock(ModelAndViewContainer.class); NativeWebRequest request = mockRequest("GET"); WebDataBinderFactory factory = mock(WebDataBinderFactory.class); Object obj = resolver.resolveArgument(parameter, container, request, factory); Assert.assertNotNull(obj); Assert.assertTrue(EntityResponseBuilder.class.isAssignableFrom(obj.getClass())); } @Test public void testResolveOptionsResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(OptionsResponseBuilder.class); ModelAndViewContainer container = mock(ModelAndViewContainer.class); NativeWebRequest request = mockRequest("OPTIONS"); WebDataBinderFactory factory = mock(WebDataBinderFactory.class); Object obj = resolver.resolveArgument(parameter, container, request, factory); Assert.assertNotNull(obj); Assert.assertTrue(OptionsResponseBuilder.class.isAssignableFrom(obj.getClass())); } @Test public void testResolvePostResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(PostResponseBuilder.class); ModelAndViewContainer container = mock(ModelAndViewContainer.class); NativeWebRequest request = mockRequest("POST"); WebDataBinderFactory factory = mock(WebDataBinderFactory.class); Object obj = resolver.resolveArgument(parameter, container, request, factory); Assert.assertNotNull(obj); Assert.assertTrue(PostResponseBuilder.class.isAssignableFrom(obj.getClass())); } @Test public void testResolvePutResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(PutResponseBuilder.class); ModelAndViewContainer container = mock(ModelAndViewContainer.class); NativeWebRequest request = mockRequest("PUT"); WebDataBinderFactory factory = mock(WebDataBinderFactory.class); Object obj = resolver.resolveArgument(parameter, container, request, factory); Assert.assertNotNull(obj); Assert.assertTrue(PutResponseBuilder.class.isAssignableFrom(obj.getClass())); } @Test public void testResolveDeleteResponseBuilder() throws Exception { MethodParameter parameter = mockMethodParameter(DeleteResponseBuilder.class); ModelAndViewContainer container = mock(ModelAndViewContainer.class); NativeWebRequest request = mockRequest("DELETE"); WebDataBinderFactory factory = mock(WebDataBinderFactory.class); Object obj = resolver.resolveArgument(parameter, container, request, factory); Assert.assertNotNull(obj); Assert.assertTrue(DeleteResponseBuilder.class.isAssignableFrom(obj.getClass())); } private NativeWebRequest mockRequest(String verb) { MockHttpServletRequest nativeRequest = new MockHttpServletRequest(verb, "http://www.domain.com/path/to/content"); NativeWebRequest request = mock(NativeWebRequest.class); doReturn(nativeRequest).when(request).getNativeRequest(HttpServletRequest.class); return request; } private MethodParameter mockMethodParameter(Class<?> clazz) { MethodParameter parameter = mock(MethodParameter.class); doReturn(clazz).when(parameter).getParameterType(); return parameter; } }