/** * 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 static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.liferay.dynamic.data.mapping.expression.internal.DDMExpressionFactoryImpl; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluator; import com.liferay.dynamic.data.mapping.form.evaluator.internal.DDMFormEvaluatorImpl; 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.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormLayout; import com.liferay.dynamic.data.mapping.model.DDMFormLayoutColumn; import com.liferay.dynamic.data.mapping.model.DDMFormLayoutPage; import com.liferay.dynamic.data.mapping.model.DDMFormLayoutRow; import com.liferay.dynamic.data.mapping.model.DDMFormRule; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.dynamic.data.mapping.test.util.DDMFormTestUtil; import com.liferay.dynamic.data.mapping.test.util.DDMFormValuesTestUtil; import com.liferay.portal.kernel.language.Language; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.test.ReflectionTestUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.util.ResourceBundleLoader; import com.liferay.portal.kernel.util.ResourceBundleLoaderUtil; import com.liferay.portal.kernel.util.StringUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; 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.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; /** * @author Marcellus Tavares */ @PrepareForTest(ResourceBundleLoaderUtil.class) @RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor( "com.liferay.portal.kernel.util.ResourceBundleLoaderUtil" ) public class DDMFormPagesTemplateContextFactoryTest { @Before public void setUp() { setUpLanguageUtil(); setUpResourceBundleLoaderUtil(); } @Test public void testDisablePages() { // Dynamic data mapping form DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); ddmForm.addDDMFormRule( new DDMFormRule("TRUE", Arrays.asList("jumpPage(0, 2)"))); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field1", "Field1", "text", "string", false, false, true)); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field2", "Field2", "text", "string", false, false, false)); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field3", "Field3", "text", "string", false, false, false)); // Dynamic data mapping form layout DDMFormLayout ddmFormLayout = new DDMFormLayout(); DDMFormLayoutPage ddmFormLayoutPage1 = createDDMFormLayoutPage( "Page 1", "Page 1 Description"); DDMFormLayoutRow ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field1")); ddmFormLayoutPage1.addDDMFormLayoutRow(ddmFormLayoutRow); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage1); DDMFormLayoutPage ddmFormLayoutPage2 = createDDMFormLayoutPage( "Page 2", "Page 2 Description"); ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field2")); ddmFormLayoutPage2.addDDMFormLayoutRow(ddmFormLayoutRow); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage2); DDMFormLayoutPage ddmFormLayoutPage3 = createDDMFormLayoutPage( "Page 3", "Page 3 Description"); ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field3")); ddmFormLayoutPage3.addDDMFormLayoutRow(ddmFormLayoutRow); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage3); // Dynamic data mapping form values DDMFormValues ddmFormValues = DDMFormValuesTestUtil.createDDMFormValues( ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "Field1", "A")); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "Field2", "")); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( "Field3", "")); // Template context DDMFormPagesTemplateContextFactory ddmFormPagesTemplateContextFactory = createDDMFormPagesTemplateContextFactory( ddmForm, ddmFormLayout, ddmFormValues, false, false); List<Object> pagesTemplateContext = ddmFormPagesTemplateContextFactory.create(); Assert.assertEquals( pagesTemplateContext.toString(), 3, pagesTemplateContext.size()); Map<String, Object> page1TemplateContext = (Map<String, Object>)pagesTemplateContext.get(0); Assert.assertTrue(MapUtil.getBoolean(page1TemplateContext, "enabled")); Map<String, Object> page2TemplateContext = (Map<String, Object>)pagesTemplateContext.get(1); Assert.assertFalse(MapUtil.getBoolean(page2TemplateContext, "enabled")); Map<String, Object> page3TemplateContext = (Map<String, Object>)pagesTemplateContext.get(2); Assert.assertTrue(MapUtil.getBoolean(page3TemplateContext, "enabled")); } @Test public void testOnePageThreeRows() { // Dynamic data mapping form DDMForm ddmForm = DDMFormTestUtil.createDDMForm( "Field1", "Field2", "Field3", "Field4", "Field5"); // Dynamic data mapping form layout DDMFormLayout ddmFormLayout = new DDMFormLayout(); DDMFormLayoutPage ddmFormLayoutPage = createDDMFormLayoutPage( "Page 1", "Page 1 Description"); DDMFormLayoutRow ddmFormLayoutRow1 = new DDMFormLayoutRow(); ddmFormLayoutRow1.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field1", "Field2")); ddmFormLayoutPage.addDDMFormLayoutRow(ddmFormLayoutRow1); DDMFormLayoutRow ddmFormLayoutRow2 = new DDMFormLayoutRow(); ddmFormLayoutRow2.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field3")); ddmFormLayoutPage.addDDMFormLayoutRow(ddmFormLayoutRow2); DDMFormLayoutRow ddmFormLayoutRow3 = new DDMFormLayoutRow(); ddmFormLayoutRow3.addDDMFormLayoutColumn( new DDMFormLayoutColumn(12, "Field4", "Field5")); ddmFormLayoutPage.addDDMFormLayoutRow(ddmFormLayoutRow3); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage); // Template context DDMFormPagesTemplateContextFactory ddmFormPagesTemplateContextFactory = createDDMFormPagesTemplateContextFactory( ddmForm, ddmFormLayout, null, false, true); List<Object> pages = ddmFormPagesTemplateContextFactory.create(); Assert.assertEquals(pages.toString(), 1, pages.size()); Map<String, Object> page1 = (Map<String, Object>)pages.get(0); Assert.assertEquals("Page 1", page1.get("title")); Assert.assertEquals("Page 1 Description", page1.get("description")); List<Object> rows = (List<Object>)page1.get("rows"); Assert.assertEquals(rows.toString(), 3, rows.size()); Map<String, Object> row1 = (Map<String, Object>)rows.get(0); List<Object> columnsRow1 = (List<Object>)row1.get("columns"); Assert.assertEquals(columnsRow1.toString(), 2, columnsRow1.size()); assertColumnSize(6, (Map<String, Object>)columnsRow1.get(0)); assertColumnSize(6, (Map<String, Object>)columnsRow1.get(1)); Map<String, Object> row2 = (Map<String, Object>)rows.get(1); List<Object> columnsRow2 = (List<Object>)row2.get("columns"); Assert.assertEquals(columnsRow2.toString(), 1, columnsRow2.size()); assertColumnSize(12, (Map<String, Object>)columnsRow2.get(0)); Map<String, Object> row3 = (Map<String, Object>)rows.get(2); List<Object> columnsRow3 = (List<Object>)row3.get("columns"); Assert.assertEquals(columnsRow3.toString(), 1, columnsRow3.size()); assertColumnSize(12, (Map<String, Object>)columnsRow3.get(0)); } @Test public void testRequiredFieldsWithoutRequiredFieldsWarning() { // Dynamic data mapping form DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field1", "Field1", "text", "string", false, false, true)); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field2", "Field2", "text", "string", false, false, false)); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field3", "Field3", "text", "string", false, false, false)); // Dynamic data mapping form layout DDMFormLayout ddmFormLayout = new DDMFormLayout(); DDMFormLayoutPage ddmFormLayoutPage1 = createDDMFormLayoutPage( "Page 1", "Page 1 Description"); DDMFormLayoutRow ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field1", "Field2")); ddmFormLayoutPage1.addDDMFormLayoutRow(ddmFormLayoutRow); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage1); DDMFormLayoutPage ddmFormLayoutPage2 = createDDMFormLayoutPage( "Page 2", "Page 2 Description"); ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field3")); ddmFormLayoutPage2.addDDMFormLayoutRow(ddmFormLayoutRow); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage2); // Template context DDMFormPagesTemplateContextFactory ddmFormPagesTemplateContextFactory = createDDMFormPagesTemplateContextFactory( ddmForm, ddmFormLayout, null, false, false); List<Object> pagesTemplateContext = ddmFormPagesTemplateContextFactory.create(); Assert.assertEquals( pagesTemplateContext.toString(), 2, pagesTemplateContext.size()); Map<String, Object> page1TemplateContext = (Map<String, Object>)pagesTemplateContext.get(0); Assert.assertFalse( MapUtil.getBoolean( page1TemplateContext, "showRequiredFieldsWarning")); Map<String, Object> page2TemplateContext = (Map<String, Object>)pagesTemplateContext.get(1); Assert.assertFalse( MapUtil.getBoolean( page2TemplateContext, "showRequiredFieldsWarning")); } @Test public void testRequiredFieldsWithRequiredFieldsWarning() { // Dynamic data mapping form DDMForm ddmForm = DDMFormTestUtil.createDDMForm(); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field1", "Field1", "text", "string", false, false, true)); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field2", "Field2", "text", "string", false, false, false)); ddmForm.addDDMFormField( DDMFormTestUtil.createDDMFormField( "Field3", "Field3", "text", "string", false, false, false)); // Dynamic data mapping form layout DDMFormLayout ddmFormLayout = new DDMFormLayout(); DDMFormLayoutPage ddmFormLayoutPage1 = createDDMFormLayoutPage( "Page 1", "Page 1 Description"); DDMFormLayoutRow ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field1", "Field2")); ddmFormLayoutPage1.addDDMFormLayoutRow(ddmFormLayoutRow); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage1); DDMFormLayoutPage ddmFormLayoutPage2 = createDDMFormLayoutPage( "Page 2", "Page 2 Description"); ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns( createDDMFormLayoutColumns("Field3")); ddmFormLayoutPage2.addDDMFormLayoutRow(ddmFormLayoutRow); ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage2); // Template context DDMFormPagesTemplateContextFactory ddmFormPagesTemplateContextFactory = createDDMFormPagesTemplateContextFactory( ddmForm, ddmFormLayout, null, false, true); List<Object> pagesTemplateContext = ddmFormPagesTemplateContextFactory.create(); Assert.assertEquals( pagesTemplateContext.toString(), 2, pagesTemplateContext.size()); Map<String, Object> page1TemplateContext = (Map<String, Object>)pagesTemplateContext.get(0); Assert.assertTrue( MapUtil.getBoolean( page1TemplateContext, "showRequiredFieldsWarning")); Map<String, Object> page2TemplateContext = (Map<String, Object>)pagesTemplateContext.get(1); Assert.assertFalse( MapUtil.getBoolean( page2TemplateContext, "showRequiredFieldsWarning")); } protected void assertColumnSize( int expectedSize, Map<String, Object> columnTemplateContex) { Assert.assertEquals( expectedSize, MapUtil.getInteger(columnTemplateContex, "size")); } protected DDMFormLayoutColumn createDDMFormLayoutColumn( String ddmFormFieldName, int size) { return new DDMFormLayoutColumn(size, ddmFormFieldName); } protected List<DDMFormLayoutColumn> createDDMFormLayoutColumns( String... ddmFormFieldNames) { List<DDMFormLayoutColumn> ddmFormLayoutColumns = new ArrayList<>(); int ddmFormLayoutColumnSize = DDMFormLayoutColumn.FULL / ddmFormFieldNames.length; for (String ddmFormFieldName : ddmFormFieldNames) { ddmFormLayoutColumns.add( createDDMFormLayoutColumn( ddmFormFieldName, ddmFormLayoutColumnSize)); } return ddmFormLayoutColumns; } protected DDMFormLayoutPage createDDMFormLayoutPage( String titleString, String descriptionString) { DDMFormLayoutPage ddmFormLayoutPage = new DDMFormLayoutPage(); LocalizedValue title = new LocalizedValue(_LOCALE); title.addString(_LOCALE, titleString); ddmFormLayoutPage.setTitle(title); LocalizedValue description = new LocalizedValue(_LOCALE); description.addString(_LOCALE, descriptionString); ddmFormLayoutPage.setDescription(description); return ddmFormLayoutPage; } protected DDMFormPagesTemplateContextFactory createDDMFormPagesTemplateContextFactory( DDMForm ddmForm, DDMFormLayout ddmFormLayout, DDMFormValues ddmFormValues, boolean ddmFormReadOnly, boolean showRequiredFieldsWarning) { DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setDDMFormValues(ddmFormValues); ddmFormRenderingContext.setLocale(_LOCALE); ddmFormRenderingContext.setPortletNamespace(_PORTLET_NAMESPACE); ddmFormRenderingContext.setReadOnly(ddmFormReadOnly); ddmFormRenderingContext.setShowRequiredFieldsWarning( showRequiredFieldsWarning); DDMFormPagesTemplateContextFactory ddmFormPagesTemplateContextFactory = new DDMFormPagesTemplateContextFactory( ddmForm, ddmFormLayout, ddmFormRenderingContext); ddmFormPagesTemplateContextFactory.setDDMFormEvaluator( getDDMFormEvaluator()); ddmFormPagesTemplateContextFactory.setDDMFormFieldTypeServicesTracker( getDDMFormFieldTypesServicesTracker()); return ddmFormPagesTemplateContextFactory; } protected DDMFormEvaluator getDDMFormEvaluator() { DDMFormEvaluator ddmFormEvaluator = new DDMFormEvaluatorImpl(); ReflectionTestUtil.setFieldValue( ddmFormEvaluator, "_ddmExpressionFactory", new DDMExpressionFactoryImpl()); return ddmFormEvaluator; } protected DDMFormFieldTypeServicesTracker getDDMFormFieldTypesServicesTracker() { DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker = mock( DDMFormFieldTypeServicesTracker.class); return ddmFormFieldTypeServicesTracker; } protected void setUpLanguageUtil() { Language language = mock(Language.class); whenLanguageGet( language, LocaleUtil.US, "this-field-is-required", "This field is required."); LanguageUtil languageUtil = new LanguageUtil(); languageUtil.setLanguage(language); } protected void setUpResourceBundleLoaderUtil() { PowerMockito.mockStatic(ResourceBundleLoaderUtil.class); ResourceBundleLoader portalResourceBundleLoader = mock( ResourceBundleLoader.class); when( ResourceBundleLoaderUtil.getPortalResourceBundleLoader() ).thenReturn( portalResourceBundleLoader ); } protected void whenLanguageGet( Language language, Locale locale, String key, String returnValue) { when( language.get(Matchers.any(ResourceBundle.class), Matchers.eq(key)) ).thenReturn( returnValue ); } private static final Locale _LOCALE = LocaleUtil.US; private static final String _PORTLET_NAMESPACE = StringUtil.randomString(); }