/** * 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.form.renderer.internal; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluationResult; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluator; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluatorContext; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker; import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRenderingContext; import com.liferay.dynamic.data.mapping.internal.util.DDMImpl; import com.liferay.dynamic.data.mapping.io.DDMFormFieldTypesJSONSerializer; import com.liferay.dynamic.data.mapping.io.DDMFormJSONSerializer; import com.liferay.dynamic.data.mapping.io.DDMFormLayoutJSONSerializer; import com.liferay.dynamic.data.mapping.io.internal.DDMFormJSONSerializerImpl; import com.liferay.dynamic.data.mapping.io.internal.DDMFormLayoutJSONSerializerImpl; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormLayout; import com.liferay.dynamic.data.mapping.service.DDMDataProviderInstanceService; import com.liferay.dynamic.data.mapping.test.util.DDMFormTestUtil; import com.liferay.portal.json.JSONFactoryImpl; import com.liferay.portal.kernel.json.JSONFactory; import com.liferay.portal.kernel.language.Language; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.util.LocaleThreadLocal; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.PortalClassLoaderUtil; import com.liferay.portal.kernel.util.ReflectionUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.util.PortalImpl; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.powermock.api.mockito.PowerMockito; import org.powermock.modules.junit4.PowerMockRunner; /** * @author Marcellus Tavares */ @RunWith(PowerMockRunner.class) public class DDMFormTemplateContextFactoryTest extends PowerMockito { @Before public void setUp() throws Exception { setUpDDMFormTemplateContextFactory(); setUpDDM(); setUpDDMFormContextProviderServlet(); setUpDDMFormEvaluator(); setUpDDMFormFieldTypeServicesTracker(); setUpDDMFormFieldTypesJSONSerializer(); setUpDDMFormJSONSerializer(); setUpDDMFormLayoutJSONSerializer(); setUpJSONFactory(); setUpLanguageUtil(); setUpLocaleThreadLocal(); setUpPortalClassLoaderUtil(); } @After public void tearDown() { LocaleThreadLocal.setSiteDefaultLocale(_originalSiteDefaultLocale); } @Test public void testContainerId() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); String containerId = StringUtil.randomString(); ddmFormRenderingContext.setContainerId(containerId); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); Assert.assertEquals(containerId, templateContext.get("containerId")); } @Test public void testContainerIdGeneration() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, new DDMFormRenderingContext()); Assert.assertNotNull(templateContext.get("containerId")); } @Test public void testEvaluatorURL() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); String expectedEvaluatorURL = "CONTEXT_PATH/dynamic-data-mapping-form-context-provider/"; Assert.assertEquals( expectedEvaluatorURL, templateContext.get("evaluatorURL")); } @Test public void testPortletNamespace() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setPortletNamespace("_PORTLET_NAMESPACE_"); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); Assert.assertEquals( "_PORTLET_NAMESPACE_", templateContext.get("portletNamespace")); } @Test public void testReadOnly() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setReadOnly(true); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); Assert.assertEquals(true, templateContext.get("readOnly")); } @Test public void testRequiredFieldsWarningHTML() throws Exception { // Mock language when( _language.format( Matchers.any(ResourceBundle.class), Matchers.eq("all-fields-marked-with-x-are-required"), Matchers.anyString(), Matchers.eq(false)) ).thenReturn( "All fields marked with '*' are required." ); DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setReadOnly(true); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); String expectedRequiredFieldsWarningHTML = "<label class=\"required-warning\">All fields marked with '*' " + "are required.</label>"; Assert.assertEquals( expectedRequiredFieldsWarningHTML, templateContext.get("requiredFieldsWarningMessageHTML")); } @Test public void testShowRequiredFieldsWarning() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setShowRequiredFieldsWarning(false); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); Assert.assertEquals( false, templateContext.get("showRequiredFieldsWarning")); } @Test public void testShowSubmitButton() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setShowSubmitButton(true); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); Assert.assertEquals(true, templateContext.get("showSubmitButton")); } @Test public void testShowSubmitButtonAndReadOnlyEnabled() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setShowSubmitButton(true); ddmFormRenderingContext.setReadOnly(true); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( ddmForm, ddmFormRenderingContext); Assert.assertEquals(false, templateContext.get("showSubmitButton")); } @Test public void testStrings() throws Exception { when( _language.get( Matchers.any(ResourceBundle.class), Matchers.eq("next")) ).thenReturn( "Next" ); when( _language.get( Matchers.any(ResourceBundle.class), Matchers.eq("previous")) ).thenReturn( "Previous" ); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), new DDMFormRenderingContext()); Map<String, String> expectedStringsMap = new HashMap<>(); expectedStringsMap.put("next", "Next"); expectedStringsMap.put("previous", "Previous"); Assert.assertEquals(expectedStringsMap, templateContext.get("strings")); } @Test public void testSubmitLabel() throws Exception { DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); String submitLabel = StringUtil.randomString(); ddmFormRenderingContext.setSubmitLabel(submitLabel); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), ddmFormRenderingContext); Assert.assertEquals(submitLabel, templateContext.get("submitLabel")); // Default value when( _language.get(Matchers.any(Locale.class), Matchers.eq("submit")) ).thenReturn( "Submit" ); templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), new DDMFormRenderingContext()); Assert.assertEquals("Submit", templateContext.get("submitLabel")); } @Test public void testTemplateNamespace() throws Exception { // Settings form DDMFormLayout ddmFormLayout = new DDMFormLayout(); ddmFormLayout.setPaginationMode(DDMFormLayout.SETTINGS_MODE); Map<String, Object> templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), ddmFormLayout, new DDMFormRenderingContext()); Assert.assertEquals( "ddm.settings_form", templateContext.get("templateNamespace")); // Simple form templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), new DDMFormRenderingContext()); Assert.assertEquals( "ddm.simple_form", templateContext.get("templateNamespace")); // Tabbed form ddmFormLayout.setPaginationMode(DDMFormLayout.TABBED_MODE); templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), ddmFormLayout, new DDMFormRenderingContext()); Assert.assertEquals( "ddm.tabbed_form", templateContext.get("templateNamespace")); // Paginated form ddmFormLayout.setPaginationMode(StringPool.BLANK); templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), ddmFormLayout, new DDMFormRenderingContext()); Assert.assertEquals( "ddm.paginated_form", templateContext.get("templateNamespace")); // Wizard form ddmFormLayout.setPaginationMode(DDMFormLayout.WIZARD_MODE); templateContext = _ddmFormTemplateContextFactory.create( DDMFormTestUtil.createDDMForm(), ddmFormLayout, new DDMFormRenderingContext()); Assert.assertEquals( "ddm.wizard_form", templateContext.get("templateNamespace")); } protected void setDeclaredField( Object targetObject, String fieldName, Object fieldValue) throws Exception { Field field = ReflectionUtil.getDeclaredField( targetObject.getClass(), fieldName); field.set(targetObject, fieldValue); } protected void setUpDDM() throws Exception { setDeclaredField(_ddmFormTemplateContextFactory, "_ddm", new DDMImpl()); } protected void setUpDDMFormContextProviderServlet() throws Exception { Servlet ddmFormContextProviderServlet = mock(Servlet.class); ServletConfig ddmFormContextProviderServletConfig = mock( ServletConfig.class); when( ddmFormContextProviderServlet.getServletConfig() ).thenReturn( ddmFormContextProviderServletConfig ); ServletContext ddmFormContextProviderServletContext = mock( ServletContext.class); when( ddmFormContextProviderServletConfig.getServletContext() ).thenReturn( ddmFormContextProviderServletContext ); when( ddmFormContextProviderServletContext.getContextPath() ).thenReturn( "CONTEXT_PATH" ); setDeclaredField( _ddmFormTemplateContextFactory, "_ddmFormContextProviderServlet", ddmFormContextProviderServlet); } protected void setUpDDMFormEvaluator() throws Exception { DDMFormEvaluator ddmFormEvaluator = mock(DDMFormEvaluator.class); when( ddmFormEvaluator.evaluate( Matchers.any(DDMFormEvaluatorContext.class)) ).thenReturn( new DDMFormEvaluationResult() ); setDeclaredField( _ddmFormTemplateContextFactory, "_ddmFormEvaluator", ddmFormEvaluator); } protected void setUpDDMFormFieldTypeServicesTracker() throws Exception { DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker = mock( DDMFormFieldTypeServicesTracker.class); setDeclaredField( _ddmFormTemplateContextFactory, "_ddmFormFieldTypeServicesTracker", ddmFormFieldTypeServicesTracker); } protected void setUpDDMFormFieldTypesJSONSerializer() throws Exception { DDMFormFieldTypesJSONSerializer ddmFormFieldTypesJSONSerializer = mock( DDMFormFieldTypesJSONSerializer.class); setDeclaredField( _ddmFormTemplateContextFactory, "_ddmFormFieldTypesJSONSerializer", ddmFormFieldTypesJSONSerializer); } protected void setUpDDMFormJSONSerializer() throws Exception { DDMFormJSONSerializer ddmFormJSONSerializer = new DDMFormJSONSerializerImpl(); setDeclaredField( _ddmFormTemplateContextFactory, "_ddmFormJSONSerializer", ddmFormJSONSerializer); DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker = mock( DDMFormFieldTypeServicesTracker.class); setDeclaredField( ddmFormJSONSerializer, "_ddmFormFieldTypeServicesTracker", ddmFormFieldTypeServicesTracker); setDeclaredField(ddmFormJSONSerializer, "_jsonFactory", _jsonFactory); } protected void setUpDDMFormLayoutJSONSerializer() throws Exception { DDMFormLayoutJSONSerializer ddmFormLayoutJSONSerializer = new DDMFormLayoutJSONSerializerImpl(); setDeclaredField( _ddmFormTemplateContextFactory, "_ddmFormLayoutJSONSerializer", ddmFormLayoutJSONSerializer); setDeclaredField( ddmFormLayoutJSONSerializer, "_jsonFactory", _jsonFactory); } protected void setUpDDMFormTemplateContextFactory() throws Exception { _ddmFormTemplateContextFactory = new DDMFormTemplateContextFactoryImpl(); DDMDataProviderInstanceService ddmDataProviderInstanceService = mock( DDMDataProviderInstanceService.class); field( DDMFormTemplateContextFactoryImpl.class, "_ddmFormTemplateContextFactoryHelper" ).set( _ddmFormTemplateContextFactory, new DDMFormTemplateContextFactoryHelper( ddmDataProviderInstanceService) ); } protected void setUpJSONFactory() throws Exception { setDeclaredField( _ddmFormTemplateContextFactory, "_jsonFactory", _jsonFactory); } protected void setUpLanguageUtil() { LanguageUtil languageUtil = new LanguageUtil(); _language = mock(Language.class); languageUtil.setLanguage(_language); } protected void setUpLocaleThreadLocal() { _originalSiteDefaultLocale = LocaleThreadLocal.getSiteDefaultLocale(); LocaleThreadLocal.setSiteDefaultLocale(LocaleUtil.US); } protected void setUpPortalClassLoaderUtil() { PortalClassLoaderUtil.setClassLoader(PortalImpl.class.getClassLoader()); } private DDMFormTemplateContextFactoryImpl _ddmFormTemplateContextFactory; private final JSONFactory _jsonFactory = new JSONFactoryImpl(); private Language _language; private Locale _originalSiteDefaultLocale; }