/**
* 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.util;
import com.liferay.dynamic.data.mapping.BaseDDMTestCase;
import com.liferay.dynamic.data.mapping.internal.util.DDMFormTemplateSynchonizer;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormFieldOptions;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.model.DDMTemplateConstants;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.model.impl.DDMTemplateImpl;
import com.liferay.dynamic.data.mapping.service.impl.DDMTemplateLocalServiceImpl;
import com.liferay.dynamic.data.mapping.service.util.ServiceProps;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.util.PropsValues;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* @author Marcellus Tavares
*/
@PrepareForTest({LocaleUtil.class, PropsValues.class, ServiceProps.class})
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor(
{
"com.liferay.portal.kernel.configuration.ConfigurationFactoryUtil",
"com.liferay.portal.kernel.xml.SAXReaderUtil",
"com.liferay.portal.util.PropsValues"
}
)
public class DDMFormTemplateSynchonizerTest extends BaseDDMTestCase {
@Before
@Override
public void setUp() throws Exception {
super.setUp();
setUpConfigurationFactoryUtil();
setUpDDMFormJSONSerializer();
setUpDDMFormJSONDeserializer();
setUpJSONFactoryUtil();
setUpLanguageUtil();
setUpLocaleUtil();
setUpHtmlUtil();
setUpPropsValues();
setUpSAXReaderUtil();
setUpServiceProps();
}
@Test
public void testAddRequiredFieldsIfTheyWereAddedInStructureAndModeIsCreate()
throws Exception {
DDMForm structureDDMForm = createDDMForm();
addDDMFormField(
structureDDMForm, createTextDDMFormField("name1", false));
createFormTemplates(structureDDMForm);
addDDMFormField(
structureDDMForm, createTextDDMFormField("name2", true));
DDMFormTemplateSynchonizer ddmFormTemplateSynchonizer =
new MockDDMFormTemplateSynchronizer(structureDDMForm);
ddmFormTemplateSynchonizer.synchronize();
testFormTemplatesAfterAddRequiredFields();
}
@Test
public void testRemoveTemplateFieldsIfTheyWereRemovedFromStructure()
throws Exception {
DDMForm structureDDMForm = createDDMForm();
addDDMFormField(
structureDDMForm, createTextDDMFormField("name1", false));
addDDMFormField(
structureDDMForm, createTextDDMFormField("name2", false));
createFormTemplates(structureDDMForm);
removeDDMFormField(structureDDMForm, "name1");
DDMFormTemplateSynchonizer ddmFormTemplateSynchonizer =
new MockDDMFormTemplateSynchronizer(structureDDMForm);
ddmFormTemplateSynchonizer.synchronize();
testFormTemplatesAfterRemoveFields();
}
@Test
public void testUpdateDDMFormFieldOptionsIfTheyWereModifiedFromStructure()
throws Exception {
DDMForm structureDDMForm = createDDMForm();
DDMFormField selectDDMFormField = createSelectDDMFormField(
"Select", false, 2);
addDDMFormField(structureDDMForm, selectDDMFormField);
DDMFormField radioDDMFormField = createSelectDDMFormField(
"Radio", true, 3);
addDDMFormField(structureDDMForm, radioDDMFormField);
createFormTemplates(structureDDMForm);
selectDDMFormField.setDDMFormFieldOptions(createDDMFormFieldOptions(1));
radioDDMFormField.setDDMFormFieldOptions(createDDMFormFieldOptions(2));
DDMFormTemplateSynchonizer ddmFormTemplateSynchonizer =
new MockDDMFormTemplateSynchronizer(structureDDMForm);
ddmFormTemplateSynchonizer.synchronize();
testFormTemplatesAfterChangeDDMFormFieldOptionsProperty(
structureDDMForm, "Select", "Radio");
}
@Test
public void testUpdateRequiredPropertyIfTemplateModeIsCreate()
throws Exception {
DDMForm structureDDMForm = createDDMForm();
addDDMFormField(
structureDDMForm, createTextDDMFormField("name1", false));
addDDMFormField(
structureDDMForm, createTextDDMFormField("name2", true));
createFormTemplates(structureDDMForm);
updateDDMFormFieldRequiredProperty(structureDDMForm, "name1", true);
updateDDMFormFieldRequiredProperty(structureDDMForm, "name2", false);
DDMFormTemplateSynchonizer ddmFormTemplateSynchonizer =
new MockDDMFormTemplateSynchronizer(structureDDMForm);
ddmFormTemplateSynchonizer.synchronize();
testFormTemplatesAfterUpdateRequiredFieldProperties();
}
protected void addDDMFormField(DDMForm ddmForm, DDMFormField ddmFormField) {
List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields();
ddmFormFields.add(ddmFormField);
}
protected DDMForm createDDMForm() {
DDMForm ddmForm = new DDMForm();
ddmForm.setAvailableLocales(createAvailableLocales(LocaleUtil.US));
ddmForm.setDefaultLocale(LocaleUtil.US);
return ddmForm;
}
protected DDMFormFieldOptions createDDMFormFieldOptions(
int availableOptions) {
DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
for (int i = 1; i <= availableOptions; i++) {
ddmFormFieldOptions.addOptionLabel(
"Value " + i, LocaleUtil.US, "Option " + i);
}
return ddmFormFieldOptions;
}
protected void createFormTemplates(DDMForm ddmForm) {
_createDDMTemplate = createTemplate(
RandomTestUtil.randomLong(), "Test Create Mode Form Template",
DDMTemplateConstants.TEMPLATE_MODE_CREATE,
ddmFormJSONSerializer.serialize(ddmForm));
_editDDMTemplate = createTemplate(
RandomTestUtil.randomLong(), "Test Edit Mode Form Template",
DDMTemplateConstants.TEMPLATE_MODE_EDIT,
ddmFormJSONSerializer.serialize(ddmForm));
}
protected DDMFormField createRadioDDMFormField(
String name, boolean required, int availableOptions) {
DDMFormField ddmFormField = new DDMFormField(name, "radio");
ddmFormField.setDataType("string");
ddmFormField.setRequired(required);
LocalizedValue label = ddmFormField.getLabel();
label.addString(LocaleUtil.US, StringUtil.randomString());
DDMFormFieldOptions ddmFormFieldOptions = createDDMFormFieldOptions(
availableOptions);
ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
return ddmFormField;
}
protected DDMFormField createSelectDDMFormField(
String name, boolean required, int availableOptions) {
DDMFormField ddmFormField = new DDMFormField(name, "select");
ddmFormField.setDataType("string");
ddmFormField.setRequired(required);
LocalizedValue label = ddmFormField.getLabel();
label.addString(LocaleUtil.US, StringUtil.randomString());
DDMFormFieldOptions ddmFormFieldOptions = createDDMFormFieldOptions(
availableOptions);
ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
return ddmFormField;
}
@Override
protected DDMTemplate createTemplate(
long templateId, String name, String mode, String script) {
DDMTemplate template = new DDMTemplateImpl();
template.setTemplateId(templateId);
template.setName(name);
template.setMode(mode);
template.setScript(script);
return template;
}
protected DDMFormField createTextDDMFormField(
String name, boolean required) {
DDMFormField ddmFormField = new DDMFormField(name, "text");
ddmFormField.setDataType("string");
ddmFormField.setRequired(required);
LocalizedValue label = ddmFormField.getLabel();
label.addString(LocaleUtil.US, StringUtil.randomString());
return ddmFormField;
}
protected Map<String, DDMFormField> getDDMFormFieldsMap(
DDMTemplate ddmTemplate)
throws Exception {
DDMForm ddmForm = ddmFormJSONDeserializer.deserialize(
ddmTemplate.getScript());
return ddmForm.getDDMFormFieldsMap(true);
}
protected void removeDDMFormField(DDMForm ddmForm, String fieldName) {
List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields();
Iterator<DDMFormField> itr = ddmFormFields.iterator();
while (itr.hasNext()) {
DDMFormField ddmFormField = itr.next();
if (fieldName.equals(ddmFormField.getName())) {
itr.remove();
}
}
}
protected void setUpServiceProps() {
mockStatic(ServiceProps.class);
}
protected void testFormTemplatesAfterAddRequiredFields() throws Exception {
// Create
Map<String, DDMFormField> ddmFormFieldsMap = getDDMFormFieldsMap(
_createDDMTemplate);
DDMFormField ddmFormField = ddmFormFieldsMap.get("name2");
Assert.assertNotNull(ddmFormField);
Assert.assertTrue(ddmFormField.isRequired());
// Edit
ddmFormFieldsMap = getDDMFormFieldsMap(_editDDMTemplate);
ddmFormField = ddmFormFieldsMap.get("name2");
Assert.assertNull(ddmFormField);
}
protected void testFormTemplatesAfterChangeDDMFormFieldOptionsProperty(
DDMForm structureForm, String...fields)
throws Exception {
Map<String, DDMFormField> structureDDMFormFieldsMap =
structureForm.getDDMFormFieldsMap(true);
Map<String, DDMFormField> createTemplateDDMFormFieldsMap =
getDDMFormFieldsMap(_createDDMTemplate);
Map<String, DDMFormField> editTemplateDDMFormFieldsMap =
getDDMFormFieldsMap(_editDDMTemplate);
for (String field : fields) {
DDMFormField structureDDMFormField = structureDDMFormFieldsMap.get(
field);
DDMFormFieldOptions structureDDMFormFieldOptions =
structureDDMFormField.getDDMFormFieldOptions();
// Create
DDMFormField templateDDMFormField =
createTemplateDDMFormFieldsMap.get(field);
DDMFormFieldOptions templateDDMFormFieldOptions =
templateDDMFormField.getDDMFormFieldOptions();
Assert.assertEquals(
structureDDMFormFieldOptions, templateDDMFormFieldOptions);
// Edit
templateDDMFormField = editTemplateDDMFormFieldsMap.get(field);
templateDDMFormFieldOptions =
templateDDMFormField.getDDMFormFieldOptions();
Assert.assertEquals(
structureDDMFormFieldOptions, templateDDMFormFieldOptions);
}
}
protected void testFormTemplatesAfterRemoveFields() throws Exception {
// Create
Map<String, DDMFormField> ddmFormFieldsMap = getDDMFormFieldsMap(
_createDDMTemplate);
DDMFormField ddmFormField = ddmFormFieldsMap.get("name1");
Assert.assertNull(ddmFormField);
// Edit
ddmFormFieldsMap = getDDMFormFieldsMap(_editDDMTemplate);
ddmFormField = ddmFormFieldsMap.get("name1");
Assert.assertNull(ddmFormField);
}
protected void testFormTemplatesAfterUpdateRequiredFieldProperties()
throws Exception {
// Create
Map<String, DDMFormField> ddmFormFieldsMap = getDDMFormFieldsMap(
_createDDMTemplate);
DDMFormField name1DDMFormField = ddmFormFieldsMap.get("name1");
DDMFormField name2DDMFormField = ddmFormFieldsMap.get("name2");
Assert.assertTrue(name1DDMFormField.isRequired());
Assert.assertFalse(name2DDMFormField.isRequired());
// Edit
ddmFormFieldsMap = getDDMFormFieldsMap(_editDDMTemplate);
name1DDMFormField = ddmFormFieldsMap.get("name1");
name2DDMFormField = ddmFormFieldsMap.get("name2");
Assert.assertFalse(name1DDMFormField.isRequired());
Assert.assertTrue(name2DDMFormField.isRequired());
}
protected void updateDDMFormFieldRequiredProperty(
DDMForm ddmForm, String fieldName, boolean required) {
List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields();
for (DDMFormField ddmFormField : ddmFormFields) {
if (fieldName.equals(ddmFormField.getName())) {
ddmFormField.setRequired(required);
}
}
}
private DDMTemplate _createDDMTemplate;
private DDMTemplate _editDDMTemplate;
private class MockDDMFormTemplateSynchronizer
extends DDMFormTemplateSynchonizer {
public MockDDMFormTemplateSynchronizer(DDMForm structureDDMForm) {
super(
structureDDMForm, ddmFormJSONDeserializer,
ddmFormJSONSerializer, new DDMTemplateLocalServiceImpl());
}
@Override
protected List<DDMTemplate> getDDMFormTemplates() {
List<DDMTemplate> ddmFormTemplates = new ArrayList<>();
ddmFormTemplates.add(_createDDMTemplate);
ddmFormTemplates.add(_editDDMTemplate);
return ddmFormTemplates;
}
@Override
protected void updateDDMTemplate(
DDMTemplate ddmTemplate, DDMForm templateDDMForm) {
String script = ddmFormJSONSerializer.serialize(templateDDMForm);
ddmTemplate.setScript(script);
if (ddmTemplate.getMode().equals(
DDMTemplateConstants.TEMPLATE_MODE_CREATE)) {
_createDDMTemplate = ddmTemplate;
}
else {
_editDDMTemplate = ddmTemplate;
}
}
}
}