/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.dynamic.data.mapping.data.provider.internal.servlet.test; import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProvider; import com.liferay.dynamic.data.mapping.model.DDMDataProviderInstance; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.service.DDMDataProviderInstanceLocalServiceUtil; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.dynamic.data.mapping.test.util.DDMFormValuesTestUtil; import com.liferay.dynamic.data.mapping.util.DDMFormFactory; import com.liferay.portal.kernel.json.JSONArray; import com.liferay.portal.kernel.json.JSONFactoryUtil; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.test.rule.AggregateTestRule; import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun; import com.liferay.portal.kernel.test.util.GroupTestUtil; import com.liferay.portal.kernel.test.util.ServiceContextTestUtil; import com.liferay.portal.kernel.test.util.TestPropsValues; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import com.liferay.registry.Registry; import com.liferay.registry.RegistryUtil; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.servlet.Servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.skyscreamer.jsonassert.JSONAssert; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; /** * @author Rafael Praxedes */ @RunWith(Arquillian.class) public class DDMDataProviderPaginatorServletTest { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new LiferayIntegrationTestRule(); @Before public void setUp() throws Exception { group = GroupTestUtil.addGroup(); setUpDDMDataProvider(); setUpDDMDataProviderPaginatorServlet(); setUpPermissionThreadLocal(); setUpPrincipalThreadLocal(); } @After public void tearDown() { PermissionThreadLocal.setPermissionChecker(_originalPermissionChecker); PrincipalThreadLocal.setName(_originalName); } @Test public void testPagination() throws Exception { DDMDataProviderInstance ddmDataProviderInstance = createDDMDataProviderInstance(); Map<String, String> params = createRequestParametersMap( ddmDataProviderInstance); HttpServletRequest httpServletRequest = createHttpServletRequest( params, 0, 10); JSONArray responseJSONArray = createJSONArray( executeDDMDataProviderPaginatorServlet(httpServletRequest)); Assert.assertEquals(10, responseJSONArray.length()); } @Test public void testPaginationToDifferentPagesShouldBeDifferent() throws Exception { DDMDataProviderInstance ddmDataProviderInstance = createDDMDataProviderInstance(); Map<String, String> params = createRequestParametersMap( ddmDataProviderInstance); HttpServletRequest httpServletRequest = createHttpServletRequest( params, 0, 1); JSONArray responseJSONArray1 = createJSONArray( executeDDMDataProviderPaginatorServlet(httpServletRequest)); httpServletRequest = createHttpServletRequest(params, 1, 2); JSONArray responseJSONArray2 = createJSONArray( executeDDMDataProviderPaginatorServlet(httpServletRequest)); JSONAssert.assertNotEquals( responseJSONArray1.toJSONString(), responseJSONArray2.toJSONString(), false); } @Test public void testPaginationToSamePageShouldBeEquals() throws Exception { DDMDataProviderInstance ddmDataProviderInstance = createDDMDataProviderInstance(); Map<String, String> params = createRequestParametersMap( ddmDataProviderInstance); HttpServletRequest httpServletRequest = createHttpServletRequest( params, 0, 1); JSONArray responseJSONArray1 = createJSONArray( executeDDMDataProviderPaginatorServlet(httpServletRequest)); httpServletRequest = createHttpServletRequest(params, 0, 1); JSONArray responseJSONArray2 = createJSONArray( executeDDMDataProviderPaginatorServlet(httpServletRequest)); Assert.assertEquals(1, responseJSONArray1.length()); Assert.assertEquals( responseJSONArray1.length(), responseJSONArray2.length()); JSONAssert.assertEquals( responseJSONArray1.toJSONString(), responseJSONArray2.toJSONString(), false); } @Test public void testPaginationWithInvalidPaginationParametersShouldFail() throws Exception { DDMDataProviderInstance ddmDataProviderInstance = createDDMDataProviderInstance(); Map<String, String> params = createRequestParametersMap( ddmDataProviderInstance); HttpServletRequest httpServletRequest = createHttpServletRequest( params, 1, 1); MockHttpServletResponse mockHttpServletResponse = executeDDMDataProviderPaginatorServlet(httpServletRequest); Assert.assertEquals( MockHttpServletResponse.SC_BAD_REQUEST, mockHttpServletResponse.getStatus()); } @Test public void testPaginationWithoutRequiredParametersShouldFail() throws Exception { HttpServletRequest httpServletRequest = createHttpServletRequest( new HashMap<String, String>(), 0, 1); MockHttpServletResponse mockHttpServletResponse = executeDDMDataProviderPaginatorServlet(httpServletRequest); Assert.assertEquals( MockHttpServletResponse.SC_BAD_REQUEST, mockHttpServletResponse.getStatus()); } protected DDMDataProviderInstance createDDMDataProviderInstance() throws Exception { DDMForm ddmForm = DDMFormFactory.create( _restDDMDataProvider.getSettings()); DDMFormValues ddmFormValues = DDMFormValuesTestUtil.createDDMFormValues( ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "cacheable", Boolean.FALSE.toString())); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "filterable", Boolean.FALSE.toString())); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "filterParameterName", StringPool.BLANK)); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "pagination", Boolean.TRUE.toString())); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "password", "test")); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "paginationEndParameterName", "end")); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "paginationStartParameterName", "start")); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "url", "http://localhost:8080/api/jsonws/country/get-countries")); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "username", "test@liferay.com")); ddmFormValues.addDDMFormFieldValue( createOutputParameter( "Countries", "nameCurrentValue", "[\"list\"]")); Map<Locale, String> nameMap = new HashMap<>(); nameMap.put(LocaleUtil.getSiteDefault(), "Data provider"); ServiceContext serviceContext = ServiceContextTestUtil.getServiceContext( group, TestPropsValues.getUserId()); return DDMDataProviderInstanceLocalServiceUtil.addDataProviderInstance( TestPropsValues.getUserId(), group.getGroupId(), nameMap, nameMap, ddmFormValues, "rest", serviceContext); } protected HttpServletRequest createHttpServletRequest( Map<String, String> params, int start, int end) { MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); mockHttpServletRequest.setParameters(params); mockHttpServletRequest.setParameter("start", String.valueOf(start)); mockHttpServletRequest.setParameter("end", String.valueOf(end)); return mockHttpServletRequest; } protected DDMFormFieldValue createInputParameter( String inputParameterName, String inputParameterType, String inputParameterRequired) { DDMFormFieldValue inputParameters = DDMFormValuesTestUtil.createDDMFormFieldValue( "inputParameters", null); inputParameters.addNestedDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "inputParameterName", inputParameterName)); inputParameters.addNestedDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "inputParameterType", inputParameterType)); inputParameters.addNestedDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "inputParameterRequired", inputParameterRequired)); return inputParameters; } protected JSONArray createJSONArray( MockHttpServletResponse mockHttpServletResponse) throws Exception { return JSONFactoryUtil.createJSONArray( mockHttpServletResponse.getContentAsString()); } protected DDMFormFieldValue createOutputParameter( String outputParameterName, String outputParameterPath, String outputParameterType) { DDMFormFieldValue outputParameters = DDMFormValuesTestUtil.createDDMFormFieldValue( "outputParameters", null); outputParameters.addNestedDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "outputParameterName", outputParameterName)); outputParameters.addNestedDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "outputParameterPath", outputParameterPath)); outputParameters.addNestedDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "outputParameterType", outputParameterType)); return outputParameters; } protected Map<String, String> createRequestParametersMap( DDMDataProviderInstance ddmDataProviderInstance) { Map<String, String> params = new HashMap<>(); params.put( "dataProviderInstanceUUID", ddmDataProviderInstance.getUuid()); params.put("outputParameterName", "Countries"); return params; } protected MockHttpServletResponse executeDDMDataProviderPaginatorServlet( HttpServletRequest request) throws Exception { MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse(); invokeDoPost(request, mockHttpServletResponse); return mockHttpServletResponse; } protected void invokeDoPost( HttpServletRequest request, HttpServletResponse response) throws Exception { Class<?> clazz = _ddmDataProviderPaginatorServlet.getClass(); Method method = clazz.getDeclaredMethod( "doPost", HttpServletRequest.class, HttpServletResponse.class); method.setAccessible(true); method.invoke(_ddmDataProviderPaginatorServlet, request, response); } protected void setUpDDMDataProvider() throws Exception { Registry registry = RegistryUtil.getRegistry(); DDMDataProvider[] ddmDataProviders = registry.getServices( "com.liferay.dynamic.data.mapping.data.provider.DDMDataProvider", "(ddm.data.provider.type=rest)"); _restDDMDataProvider = ddmDataProviders[0]; } protected void setUpDDMDataProviderPaginatorServlet() throws Exception { Registry registry = RegistryUtil.getRegistry(); StringBundler sb = new StringBundler(5); sb.append("(&(objectClass="); sb.append(Servlet.class.getName()); sb.append(")(osgi.http.whiteboard.servlet.name=com.liferay.dynamic."); sb.append("data.mapping.data.provider.internal.servlet."); sb.append("DDMDataProviderPaginatorServlet))"); Servlet[] servlets = registry.getServices( Servlet.class.getName(), sb.toString()); _ddmDataProviderPaginatorServlet = servlets[0]; } protected void setUpPermissionThreadLocal() throws Exception { _originalPermissionChecker = PermissionThreadLocal.getPermissionChecker(); PermissionThreadLocal.setPermissionChecker( PermissionCheckerFactoryUtil.create(TestPropsValues.getUser())); } protected void setUpPrincipalThreadLocal() throws Exception { _originalName = PrincipalThreadLocal.getName(); PrincipalThreadLocal.setName(TestPropsValues.getUserId()); } @DeleteAfterTestRun protected Group group; private Servlet _ddmDataProviderPaginatorServlet; private String _originalName; private PermissionChecker _originalPermissionChecker; private DDMDataProvider _restDDMDataProvider; }