/**
* 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.form.evaluator.DDMFormEvaluationResult;
import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormFieldEvaluationResult;
import com.liferay.dynamic.data.mapping.form.field.type.BaseDDMFormFieldRenderer;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldRenderer;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTemplateContextContributor;
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.DDMFormField;
import com.liferay.dynamic.data.mapping.render.DDMFormFieldRenderingContext;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
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.LanguageConstants;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.template.TemplateResource;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.MapUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Matchers;
/**
* @author Marcellus Tavares
*/
public class DDMFormFieldTemplateContextFactoryTest {
@Before
public void setUp() {
setUpLanguageUtil();
}
@Test
public void testNotReadOnlyTextFieldAndReadOnlyForm() {
// Dynamic data mapping form
DDMForm ddmForm = DDMFormTestUtil.createDDMForm();
DDMFormField ddmFormField = DDMFormTestUtil.createTextDDMFormField(
"Field1", false, false, false);
boolean readOnly = false;
ddmFormField.setReadOnly(readOnly);
ddmForm.addDDMFormField(ddmFormField);
// Dynamic data mapping form field evaluation
String instanceId = StringUtil.randomString();
DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult =
new DDMFormFieldEvaluationResult("Field1", instanceId);
ddmFormFieldEvaluationResult.setReadOnly(readOnly);
ddmFormFieldEvaluationResult.setVisible(true);
DDMFormEvaluationResult ddmFormEvaluationResult =
getDDMFormEvaluationResult(ddmFormFieldEvaluationResult);
// Dynamic data mapping form values
List<DDMFormFieldValue> ddmFormFieldValues = new ArrayList<>();
DDMFormFieldValue ddmFormFieldValue =
DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue(
"Field1", "Value 1");
ddmFormFieldValue.setInstanceId(instanceId);
ddmFormFieldValues.add(ddmFormFieldValue);
DDMFormFieldTemplateContextFactory ddmFormFieldTemplateContextFactory =
createDDMFormFieldTemplateContextFactory(
ddmForm, ddmFormEvaluationResult, ddmFormFieldValues, true,
getTextDDMFormFieldRenderer(),
getTextDDMFormFieldTemplateContextContributor());
List<Object> fields = ddmFormFieldTemplateContextFactory.create();
Assert.assertEquals(fields.toString(), 1, fields.size());
Map<String, Object> fieldTemplateContext =
(Map<String, Object>)fields.get(0);
Assert.assertEquals(
true, MapUtil.getBoolean(fieldTemplateContext, "readOnly"));
}
@Test
public void testReadOnlyTextFieldAndNotReadOnlyForm() {
// Dynamic data mapping form
DDMForm ddmForm = DDMFormTestUtil.createDDMForm();
DDMFormField ddmFormField = DDMFormTestUtil.createTextDDMFormField(
"Field1", false, false, true);
boolean readOnly = true;
ddmFormField.setReadOnly(readOnly);
ddmForm.addDDMFormField(ddmFormField);
// Dynamic data mapping form field evaluation
String instanceId = StringUtil.randomString();
DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult =
new DDMFormFieldEvaluationResult("Field1", instanceId);
ddmFormFieldEvaluationResult.setReadOnly(readOnly);
ddmFormFieldEvaluationResult.setVisible(true);
DDMFormEvaluationResult ddmFormEvaluationResult =
getDDMFormEvaluationResult(ddmFormFieldEvaluationResult);
// Dynamic data mapping form values
List<DDMFormFieldValue> ddmFormFieldValues = new ArrayList<>();
DDMFormFieldValue ddmFormFieldValue =
DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue(
"Field1", "Value 1");
ddmFormFieldValue.setInstanceId(instanceId);
ddmFormFieldValues.add(ddmFormFieldValue);
DDMFormFieldTemplateContextFactory ddmFormFieldTemplateContextFactory =
createDDMFormFieldTemplateContextFactory(
ddmForm, ddmFormEvaluationResult, ddmFormFieldValues, false,
getTextDDMFormFieldRenderer(),
getTextDDMFormFieldTemplateContextContributor());
List<Object> fields = ddmFormFieldTemplateContextFactory.create();
Assert.assertEquals(fields.toString(), 1, fields.size());
Map<String, Object> fieldTemplateContext =
(Map<String, Object>)fields.get(0);
Assert.assertEquals(
true, MapUtil.getBoolean(fieldTemplateContext, "readOnly"));
}
@Test
public void testTextField() {
// Dynamic data mapping form
DDMForm ddmForm = DDMFormTestUtil.createDDMForm();
boolean required = true;
DDMFormField ddmFormField = DDMFormTestUtil.createTextDDMFormField(
"Field1", false, false, required);
ddmFormField.setLabel(
DDMFormValuesTestUtil.createLocalizedValue("Field 1", _LOCALE));
ddmFormField.setReadOnly(false);
ddmFormField.setTip(
DDMFormValuesTestUtil.createLocalizedValue(
"This is a tip.", _LOCALE));
ddmFormField.setProperty("displayStyle", "singleline");
ddmForm.addDDMFormField(ddmFormField);
// Dynamic data mapping form field evaluation
String instanceId = StringUtil.randomString();
DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult =
new DDMFormFieldEvaluationResult("Field1", instanceId);
ddmFormFieldEvaluationResult.setRequired(required);
ddmFormFieldEvaluationResult.setValid(true);
ddmFormFieldEvaluationResult.setVisible(true);
DDMFormEvaluationResult ddmFormEvaluationResult =
getDDMFormEvaluationResult(ddmFormFieldEvaluationResult);
// Dynamic data mapping form values
List<DDMFormFieldValue> ddmFormFieldValues = new ArrayList<>();
DDMFormFieldValue ddmFormFieldValue =
DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue(
"Field1", "Value 1");
ddmFormFieldValue.setInstanceId(instanceId);
ddmFormFieldValues.add(ddmFormFieldValue);
DDMFormFieldTemplateContextFactory ddmFormFieldTemplateContextFactory =
createDDMFormFieldTemplateContextFactory(
ddmForm, ddmFormEvaluationResult, ddmFormFieldValues, false,
getTextDDMFormFieldRenderer(),
getTextDDMFormFieldTemplateContextContributor());
List<Object> fields = ddmFormFieldTemplateContextFactory.create();
Assert.assertEquals(fields.toString(), 1, fields.size());
Map<String, Object> fieldTemplateContext =
(Map<String, Object>)fields.get(0);
Assert.assertEquals(
"singleline",
MapUtil.getString(fieldTemplateContext, "displayStyle"));
Assert.assertEquals(
"Field 1", MapUtil.getString(fieldTemplateContext, "label"));
Assert.assertEquals(
false, MapUtil.getBoolean(fieldTemplateContext, "readOnly"));
Assert.assertEquals(
false, MapUtil.getBoolean(fieldTemplateContext, "repeatable"));
Assert.assertEquals(
true, MapUtil.getBoolean(fieldTemplateContext, "required"));
Assert.assertEquals(
"This is a tip.", MapUtil.getString(fieldTemplateContext, "tip"));
Assert.assertEquals(
true, MapUtil.getBoolean(fieldTemplateContext, "valid"));
Assert.assertEquals(
StringPool.BLANK,
MapUtil.getString(fieldTemplateContext, "validationErrorMessage"));
Assert.assertEquals(
"Value 1", MapUtil.getString(fieldTemplateContext, "value"));
Assert.assertEquals(
true, MapUtil.getBoolean(fieldTemplateContext, "visible"));
String expectedName = String.format(
_FIELD_NAME_FORMAT, "Field1", instanceId, 0, _LOCALE.toString());
Assert.assertEquals(
expectedName, MapUtil.getString(fieldTemplateContext, "name"));
}
protected DDMFormFieldTemplateContextFactory
createDDMFormFieldTemplateContextFactory(
DDMForm ddmForm, DDMFormEvaluationResult ddmFormEvaluationResult,
List<DDMFormFieldValue> ddmFormFieldValues, boolean ddmFormReadOnly,
DDMFormFieldRenderer ddmFormFieldRenderer,
DDMFormFieldTemplateContextContributor
ddmFormFieldTemplateContextContributor) {
DDMFormRenderingContext ddmFormRenderingContext =
new DDMFormRenderingContext();
ddmFormRenderingContext.setLocale(_LOCALE);
ddmFormRenderingContext.setPortletNamespace(_PORTLET_NAMESPACE);
ddmFormRenderingContext.setReadOnly(ddmFormReadOnly);
DDMFormFieldTemplateContextFactory ddmFormFieldTemplateContextFactory =
new DDMFormFieldTemplateContextFactory(
ddmForm.getDDMFormFieldsMap(true), ddmFormEvaluationResult,
ddmFormFieldValues, ddmFormRenderingContext);
DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker =
mockDDMFormFieldTypeServicesTracker(
ddmFormFieldRenderer, ddmFormFieldTemplateContextContributor);
ddmFormFieldTemplateContextFactory.setDDMFormFieldTypeServicesTracker(
ddmFormFieldTypeServicesTracker);
return ddmFormFieldTemplateContextFactory;
}
protected DDMFormEvaluationResult getDDMFormEvaluationResult(
DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult) {
List<DDMFormFieldEvaluationResult> ddmFormFieldEvaluationResults =
new ArrayList<>();
ddmFormFieldEvaluationResults.add(ddmFormFieldEvaluationResult);
DDMFormEvaluationResult ddmFormEvaluationResult =
new DDMFormEvaluationResult();
ddmFormEvaluationResult.setDDMFormFieldEvaluationResults(
ddmFormFieldEvaluationResults);
return ddmFormEvaluationResult;
}
protected DDMFormFieldRenderer getTextDDMFormFieldRenderer() {
return new BaseDDMFormFieldRenderer() {
public String getTemplateLanguage() {
return null;
}
public String getTemplateNamespace() {
return "ddm.text";
}
public TemplateResource getTemplateResource() {
return null;
}
};
}
protected DDMFormFieldTemplateContextContributor
getTextDDMFormFieldTemplateContextContributor() {
return new DDMFormFieldTemplateContextContributor() {
public Map<String, Object> getParameters(
DDMFormField ddmFormField,
DDMFormFieldRenderingContext ddmFormFieldRenderingContext) {
Map<String, Object> parameters = new HashMap<>();
parameters.put(
"displayStyle", ddmFormField.getProperty("displayStyle"));
return parameters;
}
};
}
protected DDMFormFieldTypeServicesTracker
mockDDMFormFieldTypeServicesTracker(
DDMFormFieldRenderer ddmFormFieldRenderer,
DDMFormFieldTemplateContextContributor
ddmFormFieldTemplateContextContributor) {
DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker = mock(
DDMFormFieldTypeServicesTracker.class);
when(
ddmFormFieldTypeServicesTracker.getDDMFormFieldRenderer(
Matchers.anyString())
).thenReturn(
ddmFormFieldRenderer
);
when(
ddmFormFieldTypeServicesTracker.
getDDMFormFieldTemplateContextContributor(Matchers.anyString())
).thenReturn(
ddmFormFieldTemplateContextContributor
);
return ddmFormFieldTypeServicesTracker;
}
protected void setUpLanguageUtil() {
Language language = mock(Language.class);
whenLanguageGet(
language, LocaleUtil.US, LanguageConstants.KEY_DIR, "ltr");
LanguageUtil languageUtil = new LanguageUtil();
languageUtil.setLanguage(language);
}
protected void whenLanguageGet(
Language language, Locale locale, String key, String returnValue) {
when(
language.get(Matchers.eq(locale), Matchers.eq(key))
).thenReturn(
returnValue
);
}
private static final String _FIELD_NAME_FORMAT =
"_PORTLET_NAMESPACE_ddm$$%s$%s$%d$$%s";
private static final Locale _LOCALE = LocaleUtil.US;
private static final String _PORTLET_NAMESPACE = "_PORTLET_NAMESPACE_";
}