/** * 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.evaluator.internal; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.liferay.dynamic.data.mapping.expression.DDMExpressionFactory; import com.liferay.dynamic.data.mapping.expression.internal.DDMExpressionFactoryImpl; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluationResult; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluatorContext; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormFieldEvaluationResult; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormField; import com.liferay.dynamic.data.mapping.model.DDMFormFieldValidation; import com.liferay.dynamic.data.mapping.model.DDMFormRule; import com.liferay.dynamic.data.mapping.model.UnlocalizedValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.dynamic.data.mapping.storage.FieldConstants; import com.liferay.dynamic.data.mapping.test.util.DDMFormValuesTestUtil; 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.model.Company; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.model.RoleConstants; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.service.RoleLocalService; import com.liferay.portal.kernel.service.UserGroupRoleLocalService; import com.liferay.portal.kernel.service.UserLocalService; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.ResourceBundleLoader; import com.liferay.portal.kernel.util.ResourceBundleLoaderUtil; import com.liferay.portal.kernel.util.StringPool; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mock; 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 Leonardo Barros * @author Marcellus Tavares */ @PrepareForTest(ResourceBundleLoaderUtil.class) @RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor( "com.liferay.portal.kernel.util.ResourceBundleLoaderUtil" ) public class DDMFormEvaluatorHelperTest { @Before public void setUp() throws Exception { setUpLanguageUtil(); setUpPortalUtil(); setUpResourceBundleLoaderUtil(); } @Test public void testAllCondition() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField0 = createDDMFormField( "field0", "text", FieldConstants.STRING); DDMFormField ddmFormField1 = createDDMFormField( "field1", "number", FieldConstants.DOUBLE); ddmFormField1.setRepeatable(true); ddmForm.addDDMFormField(ddmFormField0); ddmForm.addDDMFormField(ddmFormField1); String condition = "all('#value# <= 10', getValue('field1'))"; String action = "setEnabled(\"field0\", false)"; DDMFormRule ddmFormRule = new DDMFormRule( condition, Arrays.asList(action)); ddmForm.addDDMFormRule(ddmFormRule); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue(""))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_0", "field1", new UnlocalizedValue("1"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_1", "field1", new UnlocalizedValue("5"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_2", "field1", new UnlocalizedValue("10"))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, _userLocalService); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 4, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult field0DDMFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertTrue(field0DDMFormFieldEvaluationResult.isReadOnly()); } @Test public void testBelongsToCondition() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField0 = createDDMFormField( "field0", "text", FieldConstants.STRING); ddmForm.addDDMFormField(ddmFormField0); String condition = "belongsTo(\"Role1\")"; String action = "setEnabled(\"field0\", false)"; DDMFormRule ddmFormRule = new DDMFormRule( condition, Arrays.asList(action)); ddmForm.addDDMFormRule(ddmFormRule); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue(""))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("request", _request); ddmFormEvaluatorContext.addProperty("groupId", 1L); when( _roleLocalService.fetchRole( Matchers.anyLong(), Matchers.anyString()) ).thenReturn( _role ); when( _role.getType() ).thenReturn( RoleConstants.TYPE_REGULAR ); when( _userLocalService.hasRoleUser( Matchers.anyLong(), Matchers.eq("Role1"), Matchers.anyLong(), Matchers.eq(true)) ).thenReturn( true ); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, _roleLocalService, _userGroupRoleLocalService, _userLocalService); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 1, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult field0DDMFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertTrue(field0DDMFormFieldEvaluationResult.isReadOnly()); } @Test public void testJumpPageAction() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField = createDDMFormField( "field0", "text", FieldConstants.NUMBER); ddmForm.addDDMFormField(ddmFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("1"))); String condition = "getValue(\"field0\") >= 1"; List<String> actions = ListUtil.fromArray( new String[] {"jumpPage(1, 3)"}); DDMFormRule ddmFormRule = new DDMFormRule(condition, actions); ddmForm.addDDMFormRule(ddmFormRule); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Set<Integer> disabledPagesIndexes = ddmFormEvaluationResult.getDisabledPagesIndexes(); Assert.assertTrue(disabledPagesIndexes.contains(2)); } @Test public void testNotAllCondition() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField0 = createDDMFormField( "field0", "text", FieldConstants.STRING); DDMFormField ddmFormField1 = createDDMFormField( "field1", "number", FieldConstants.DOUBLE); ddmFormField1.setRepeatable(true); ddmForm.addDDMFormField(ddmFormField0); ddmForm.addDDMFormField(ddmFormField1); String condition = "not(all('between(#value#,2,6)', getValue('field1')))"; String action = "setVisible(\"field0\", false)"; DDMFormRule ddmFormRule = new DDMFormRule( condition, Arrays.asList(action)); ddmForm.addDDMFormRule(ddmFormRule); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue(""))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_0", "field1", new UnlocalizedValue("1"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_1", "field1", new UnlocalizedValue("5"))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, _userLocalService); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 3, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult field0DDMFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertFalse(field0DDMFormFieldEvaluationResult.isVisible()); } @Test public void testNotBelongsToCondition() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField0 = createDDMFormField( "field0", "text", FieldConstants.STRING); ddmForm.addDDMFormField(ddmFormField0); String condition = "not(belongsTo(\"Role1\"))"; String action = "setVisible(\"field0\", false)"; DDMFormRule ddmFormRule = new DDMFormRule( condition, Arrays.asList(action)); ddmForm.addDDMFormRule(ddmFormRule); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue(""))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("request", _request); ddmFormEvaluatorContext.addProperty("groupId", 1L); when( _userLocalService.hasRoleUser( _company.getCompanyId(), "Role1", _user.getUserId(), true) ).thenReturn( false ); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, _roleLocalService, _userGroupRoleLocalService, _userLocalService); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 1, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult field0DDMFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertFalse(field0DDMFormFieldEvaluationResult.isVisible()); } @Test public void testNotCalledJumpPageAction() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField = createDDMFormField( "field0", "text", FieldConstants.NUMBER); ddmForm.addDDMFormField(ddmFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("1"))); String condition = "getValue(\"field0\") > 1"; List<String> actions = ListUtil.fromArray( new String[] {"jumpPage(1, 3)"}); DDMFormRule ddmFormRule = new DDMFormRule(condition, actions); ddmForm.addDDMFormRule(ddmFormRule); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Set<Integer> disabledPagesIndexes = ddmFormEvaluationResult.getDisabledPagesIndexes(); Assert.assertTrue(disabledPagesIndexes.isEmpty()); } @Test public void testRequiredValidationWithCheckboxField() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField = createDDMFormField( "field0", "checkbox", FieldConstants.BOOLEAN); ddmFormField.setRequired(true); ddmForm.addDDMFormField(ddmFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("false"))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 1, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertEquals( "This field is required.", ddmFormFieldEvaluationResult.getErrorMessage()); Assert.assertFalse(ddmFormFieldEvaluationResult.isValid()); } @Test public void testRequiredValidationWithHiddenField() throws Exception { DDMForm ddmForm = new DDMForm(); ddmForm.addDDMFormField( createDDMFormField("field0", "text", FieldConstants.INTEGER)); DDMFormField field1DDMFormField = createDDMFormField( "field1", "text", FieldConstants.STRING); field1DDMFormField.setRequired(true); field1DDMFormField.setVisibilityExpression("field0 > 5"); ddmForm.addDDMFormField(field1DDMFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("4"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_instanceId", "field1", new UnlocalizedValue(""))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 2, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult field1DDMFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field1", "field1_instanceId"); Assert.assertEquals( StringPool.BLANK, field1DDMFormFieldEvaluationResult.getErrorMessage()); Assert.assertTrue(field1DDMFormFieldEvaluationResult.isValid()); } @Test public void testRequiredValidationWithinRuleAction() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField0 = createDDMFormField( "field0", "text", FieldConstants.NUMBER); DDMFormField ddmFormField1 = createDDMFormField( "field1", "text", FieldConstants.STRING); ddmForm.addDDMFormField(ddmFormField0); ddmForm.addDDMFormField(ddmFormField1); String condition = "getValue(\"field0\") > 10"; List<String> actions = ListUtil.fromArray( new String[] {"setRequired(\"field1\", true)"}); DDMFormRule ddmFormRule = new DDMFormRule(condition, actions); ddmForm.addDDMFormRule(ddmFormRule); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("11"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_instanceId", "field1", new UnlocalizedValue(""))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 2, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field1", "field1_instanceId"); Assert.assertEquals( "This field is required.", ddmFormFieldEvaluationResult.getErrorMessage()); Assert.assertFalse(ddmFormFieldEvaluationResult.isValid()); } @Test public void testRequiredValidationWithTextField() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField = createDDMFormField( "field0", "text", FieldConstants.STRING); ddmFormField.setRequired(true); ddmForm.addDDMFormField(ddmFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("\n"))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 1, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertEquals( "This field is required.", ddmFormFieldEvaluationResult.getErrorMessage()); Assert.assertFalse(ddmFormFieldEvaluationResult.isValid()); } @Test public void testShowHideAndEnableDisableRules() throws Exception { DDMForm ddmForm = new DDMForm(); ddmForm.addDDMFormField( createDDMFormField("field0", "text", FieldConstants.DOUBLE)); ddmForm.addDDMFormField( createDDMFormField("field1", "text", FieldConstants.DOUBLE)); ddmForm.addDDMFormField( createDDMFormField("field2", "text", FieldConstants.DOUBLE)); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("30"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_instanceId", "field1", new UnlocalizedValue("15"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field2_instanceId", "field2", new UnlocalizedValue("10"))); String condition = "getValue(\"field0\") >= 30"; List<String> actions = ListUtil.fromArray( new String[] { "setVisible(\"field1\", false)", "setEnabled(\"field2\", false)" }); DDMFormRule ddmFormRule = new DDMFormRule(condition, actions); ddmForm.addDDMFormRule(ddmFormRule); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 3, ddmFormFieldEvaluationResultMap.size()); // Field 0 DDMFormFieldEvaluationResult expectedField0DDMFormFieldEvaluationResult = createDDMFormFieldEvaluationResult( "field0", "field0_instanceId", StringPool.BLANK, true, 30., true, false, false); assertEquals( expectedField0DDMFormFieldEvaluationResult, ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId")); // Field 1 DDMFormFieldEvaluationResult expectedField1DDMFormFieldEvaluationResult = createDDMFormFieldEvaluationResult( "field1", "field1_instanceId", StringPool.BLANK, true, 15., false, false, false); assertEquals( expectedField1DDMFormFieldEvaluationResult, ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field1", "field1_instanceId")); // Field 2 DDMFormFieldEvaluationResult expectedField2DDMFormFieldEvaluationResult = createDDMFormFieldEvaluationResult( "field2", "field2_instanceId", StringPool.BLANK, true, 10., true, true, false); assertEquals( expectedField2DDMFormFieldEvaluationResult, ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field2", "field2_instanceId")); } @Test public void testUpdateAndCalculateRule() throws Exception { DDMForm ddmForm = new DDMForm(); ddmForm.addDDMFormField( createDDMFormField("field0", "text", FieldConstants.DOUBLE)); ddmForm.addDDMFormField( createDDMFormField("field1", "text", FieldConstants.DOUBLE)); ddmForm.addDDMFormField( createDDMFormField("field2", "text", FieldConstants.DOUBLE)); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("5"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_instanceId", "field1", new UnlocalizedValue("2"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field2_instanceId", "field2", new UnlocalizedValue("0"))); String condition = "getValue(\"field0\") > 0 && getValue(\"field1\") > 0"; String action = "calculate(\"field2\", getValue(\"field0\") * " + "getValue(\"field1\"))"; DDMFormRule ddmFormRule = new DDMFormRule( condition, Arrays.asList(action)); ddmForm.addDDMFormRule(ddmFormRule); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 3, ddmFormFieldEvaluationResultMap.size()); // Field 0 DDMFormFieldEvaluationResult expectedField0DDMFormFieldEvaluationResult = createDDMFormFieldEvaluationResult( "field0", "field0_instanceId", 5.0); assertEquals( expectedField0DDMFormFieldEvaluationResult, ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId")); // Field 1 DDMFormFieldEvaluationResult expectedField1DDMFormFieldEvaluationResult = createDDMFormFieldEvaluationResult( "field1", "field1_instanceId", 2.0); assertEquals( expectedField1DDMFormFieldEvaluationResult, ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field1", "field1_instanceId")); // Field 2 DDMFormFieldEvaluationResult expectedField2DDMFormFieldEvaluationResult = createDDMFormFieldEvaluationResult( "field2", "field2_instanceId", 10.0); assertEquals( expectedField2DDMFormFieldEvaluationResult, ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field2", "field2_instanceId")); } @Test public void testValidationExpression() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField = createDDMFormField( "field0", "text", FieldConstants.INTEGER); DDMFormFieldValidation ddmFormFieldValidation = new DDMFormFieldValidation(); ddmFormFieldValidation.setErrorMessage("This field should be zero."); ddmFormFieldValidation.setExpression("field0 == 0"); ddmFormField.setDDMFormFieldValidation(ddmFormFieldValidation); ddmForm.addDDMFormField(ddmFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("1"))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 1, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertEquals( "This field should be zero.", ddmFormFieldEvaluationResult.getErrorMessage()); Assert.assertFalse(ddmFormFieldEvaluationResult.isValid()); } @Test public void testValidationExpressionWithNoErrorMessage() throws Exception { DDMForm ddmForm = new DDMForm(); DDMFormField ddmFormField = createDDMFormField( "field", "numeric", FieldConstants.INTEGER); DDMFormFieldValidation ddmFormFieldValidation = new DDMFormFieldValidation(); ddmFormFieldValidation.setExpression("field > 10"); ddmFormField.setDDMFormFieldValidation(ddmFormFieldValidation); ddmForm.addDDMFormField(ddmFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field_instanceId", "field", new UnlocalizedValue("1"))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 1, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field", "field_instanceId"); Assert.assertEquals( "This field is invalid.", ddmFormFieldEvaluationResult.getErrorMessage()); Assert.assertFalse(ddmFormFieldEvaluationResult.isValid()); } @Test public void testValidationRule() throws Exception { DDMForm ddmForm = new DDMForm(); ddmForm.addDDMFormField( createDDMFormField("field0", "text", FieldConstants.DOUBLE)); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("5"))); String condition = "getValue(\"field0\") <= 10"; String action = "setInvalid(\"field0\", \"The value should be greater than 10.\")"; DDMFormRule ddmFormRule = new DDMFormRule( condition, Arrays.asList(action)); ddmForm.addDDMFormRule(ddmFormRule); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 1, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult actualDDMFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field0", "field0_instanceId"); Assert.assertEquals( "The value should be greater than 10.", actualDDMFormFieldEvaluationResult.getErrorMessage()); Assert.assertEquals( false, actualDDMFormFieldEvaluationResult.isValid()); } @Test public void testVisibilityExpression() throws Exception { DDMForm ddmForm = new DDMForm(); ddmForm.addDDMFormField( createDDMFormField("field0", "text", FieldConstants.INTEGER)); DDMFormField field1DDMFormField = createDDMFormField( "field1", "text", FieldConstants.STRING); field1DDMFormField.setVisibilityExpression("field0 > 5"); ddmForm.addDDMFormField(field1DDMFormField); DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field0_instanceId", "field0", new UnlocalizedValue("6"))); ddmFormValues.addDDMFormFieldValue( DDMFormValuesTestUtil.createDDMFormFieldValue( "field1_instanceId", "field1", new UnlocalizedValue(""))); DDMFormEvaluatorContext ddmFormEvaluatorContext = new DDMFormEvaluatorContext(ddmForm, ddmFormValues, LocaleUtil.US); ddmFormEvaluatorContext.addProperty("groupId", 1L); DDMFormEvaluatorHelper ddmFormEvaluatorHelper = new DDMFormEvaluatorHelper( null, _ddmExpressionFactory, ddmFormEvaluatorContext, _jsonFactory, null, null, null); DDMFormEvaluationResult ddmFormEvaluationResult = ddmFormEvaluatorHelper.evaluate(); Map<String, DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResultMap = ddmFormEvaluationResult.getDDMFormFieldEvaluationResultsMap(); Assert.assertEquals( ddmFormFieldEvaluationResultMap.toString(), 2, ddmFormFieldEvaluationResultMap.size()); DDMFormFieldEvaluationResult field1DDMFormFieldEvaluationResult = ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( "field1", "field1_instanceId"); Assert.assertTrue(field1DDMFormFieldEvaluationResult.isVisible()); } protected void assertEquals( DDMFormFieldEvaluationResult expectedDDMFormFieldEvaluationResult, DDMFormFieldEvaluationResult actualDDMFormFieldEvaluationResult) { Assert.assertEquals( expectedDDMFormFieldEvaluationResult, actualDDMFormFieldEvaluationResult); // Properties Object expectedValue = expectedDDMFormFieldEvaluationResult.getValue(); Object actualValue = actualDDMFormFieldEvaluationResult.getValue(); Assert.assertEquals(expectedValue, actualValue); Assert.assertEquals( expectedDDMFormFieldEvaluationResult.getErrorMessage(), actualDDMFormFieldEvaluationResult.getErrorMessage()); Assert.assertEquals( expectedDDMFormFieldEvaluationResult.isValid(), actualDDMFormFieldEvaluationResult.isValid()); Assert.assertEquals( expectedDDMFormFieldEvaluationResult.isVisible(), actualDDMFormFieldEvaluationResult.isVisible()); Assert.assertEquals( expectedDDMFormFieldEvaluationResult.isReadOnly(), actualDDMFormFieldEvaluationResult.isReadOnly()); Assert.assertEquals( expectedDDMFormFieldEvaluationResult.isRequired(), actualDDMFormFieldEvaluationResult.isRequired()); } protected DDMFormField createDDMFormField( String name, String type, String dataType) { DDMFormField ddmFormField = new DDMFormField(name, type); ddmFormField.setDataType(dataType); return ddmFormField; } protected DDMFormFieldEvaluationResult createDDMFormFieldEvaluationResult( String name, String instanceId, Object value) { return createDDMFormFieldEvaluationResult( name, instanceId, StringPool.BLANK, true, value, true, false, false); } protected DDMFormFieldEvaluationResult createDDMFormFieldEvaluationResult( String name, String instanceId, String errorMessage, boolean valid, Object value, boolean visible, boolean readOnly, boolean required) { DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult = new DDMFormFieldEvaluationResult(name, instanceId); ddmFormFieldEvaluationResult.setErrorMessage(errorMessage); ddmFormFieldEvaluationResult.setValid(valid); ddmFormFieldEvaluationResult.setValue(value); ddmFormFieldEvaluationResult.setVisible(visible); ddmFormFieldEvaluationResult.setReadOnly(readOnly); ddmFormFieldEvaluationResult.setRequired(required); return ddmFormFieldEvaluationResult; } protected void setUpLanguageUtil() { LanguageUtil languageUtil = new LanguageUtil(); _language = mock(Language.class); when( _language.get( Matchers.any(ResourceBundle.class), Matchers.eq("this-field-is-invalid")) ).thenReturn( "This field is invalid." ); when( _language.get( Matchers.any(ResourceBundle.class), Matchers.eq("this-field-is-required")) ).thenReturn( "This field is required." ); languageUtil.setLanguage(_language); } protected void setUpPortalUtil() throws Exception { PortalUtil portalUtil = new PortalUtil(); Portal portal = mock(Portal.class); when(portal.getUser(_request)).thenReturn(_user); when(portal.getCompany(_request)).thenReturn(_company); portalUtil.setPortal(portal); } protected void setUpResourceBundleLoaderUtil() { PowerMockito.mockStatic(ResourceBundleLoaderUtil.class); ResourceBundleLoader portalResourceBundleLoader = mock( ResourceBundleLoader.class); when( ResourceBundleLoaderUtil.getPortalResourceBundleLoader() ).thenReturn( portalResourceBundleLoader ); } @Mock private Company _company; private final DDMExpressionFactory _ddmExpressionFactory = new DDMExpressionFactoryImpl(); private final JSONFactory _jsonFactory = new JSONFactoryImpl(); private Language _language; @Mock private HttpServletRequest _request; @Mock private Role _role; @Mock private RoleLocalService _roleLocalService; @Mock private User _user; @Mock private UserGroupRoleLocalService _userGroupRoleLocalService; @Mock private UserLocalService _userLocalService; }