/** * 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.lists.service.test; import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian; import com.liferay.dynamic.data.lists.exception.RecordGroupIdException; import com.liferay.dynamic.data.lists.helper.DDLRecordSetTestHelper; import com.liferay.dynamic.data.lists.helper.DDLRecordTestHelper; import com.liferay.dynamic.data.lists.helper.DDLRecordTestUtil; import com.liferay.dynamic.data.lists.model.DDLRecord; import com.liferay.dynamic.data.lists.model.DDLRecordConstants; import com.liferay.dynamic.data.lists.model.DDLRecordSet; import com.liferay.dynamic.data.lists.model.DDLRecordVersion; import com.liferay.dynamic.data.lists.service.DDLRecordLocalServiceUtil; import com.liferay.dynamic.data.lists.service.DDLRecordVersionLocalServiceUtil; import com.liferay.dynamic.data.mapping.exception.StorageException; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormField; import com.liferay.dynamic.data.mapping.model.DDMStructure; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.model.Value; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.dynamic.data.mapping.storage.StorageAdapter; import com.liferay.dynamic.data.mapping.storage.StorageType; import com.liferay.dynamic.data.mapping.test.util.DDMFormTestUtil; import com.liferay.dynamic.data.mapping.test.util.DDMFormValuesTestUtil; import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestHelper; import com.liferay.dynamic.data.mapping.test.util.storage.FailStorageAdapter; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.test.rule.AggregateTestRule; import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun; import com.liferay.portal.kernel.test.rule.Sync; import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule; import com.liferay.portal.kernel.test.util.GroupTestUtil; import com.liferay.portal.kernel.test.util.RandomTestUtil; import com.liferay.portal.kernel.test.util.TestPropsValues; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import com.liferay.registry.Registry; import com.liferay.registry.RegistryUtil; import com.liferay.registry.ServiceRegistration; import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; /** * @author Marcellus Tavares */ @RunWith(Arquillian.class) @Sync public class DDLRecordServiceTest { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new AggregateTestRule( new LiferayIntegrationTestRule(), SynchronousDestinationTestRule.INSTANCE); @BeforeClass public static void setUpClass() { Registry registry = RegistryUtil.getRegistry(); _serviceRegistration = registry.registerService( StorageAdapter.class, new FailStorageAdapter()); } @AfterClass public static void tearDownClass() { _serviceRegistration.unregister(); } @Before public void setUp() throws Exception { _availableLocales = DDMFormTestUtil.createAvailableLocales(Locale.US); _defaultLocale = Locale.US; _group = GroupTestUtil.addGroup(); _ddmStructureTestHelper = new DDMStructureTestHelper( PortalUtil.getClassNameId(DDLRecordSet.class), _group); _recordSetTestHelper = new DDLRecordSetTestHelper(_group); } @Test public void testAddDraftVersion() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", false, false)); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); DDMFormFieldValue expectedDDMFormFieldValue = createUnlocalizedDDMFormFieldValue("Name", "Sample Name"); expectedDDMFormValues.addDDMFormFieldValue(expectedDDMFormFieldValue); DDLRecordSet recordSet = addRecordSet(ddmForm); ServiceContext serviceContext = DDLRecordTestUtil.getServiceContext( WorkflowConstants.ACTION_SAVE_DRAFT); serviceContext.setAttribute("status", WorkflowConstants.STATUS_DRAFT); serviceContext.setAttribute("validateDDMFormValues", Boolean.FALSE); DDLRecordLocalServiceUtil.addRecord( TestPropsValues.getUserId(), _group.getGroupId(), recordSet.getRecordSetId(), DDLRecordConstants.DISPLAY_INDEX_DEFAULT, expectedDDMFormValues, serviceContext); DDLRecordVersion recordVersion = DDLRecordVersionLocalServiceUtil.fetchLatestRecordVersion( TestPropsValues.getUserId(), recordSet.getRecordSetId(), recordSet.getVersion(), WorkflowConstants.STATUS_DRAFT); Assert.assertNotNull(recordVersion); DDMFormValues ddmFormValues = recordVersion.getDDMFormValues(); Map<String, List<DDMFormFieldValue>> ddmFormFieldValuesMap = ddmFormValues.getDDMFormFieldValuesMap(); List<DDMFormFieldValue> ddmFormFieldValues = ddmFormFieldValuesMap.get( "Name"); DDMFormFieldValue ddmFormFieldValue0 = ddmFormFieldValues.get(0); Value value = ddmFormFieldValue0.getValue(); Assert.assertEquals("Sample Name", value.getString(_defaultLocale)); } @Test public void testAddRecordVerifyRecordSetVersion() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", true, false)); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); DDLRecordSet recordSet = addRecordSet(ddmForm); DDLRecordTestHelper recordTestHelper = new DDLRecordTestHelper( _group, recordSet); DDLRecord record = recordTestHelper.addRecord( expectedDDMFormValues, WorkflowConstants.ACTION_PUBLISH); Assert.assertEquals( recordSet.getVersion(), record.getRecordSetVersion()); DDLRecordVersion recordVersion = record.getRecordVersion(); Assert.assertEquals( recordSet.getVersion(), recordVersion.getRecordSetVersion()); } @Test(expected = RecordGroupIdException.class) public void testAddRecordWithDifferentGroupIdFromRecordSet() throws Exception { long groupId = RandomTestUtil.nextLong(); DDMForm ddmForm = DDMFormTestUtil.createDDMForm("Field"); DDLRecordSet ddlRecordSet = addRecordSet(ddmForm); DDLRecordTestHelper ddlRecordTestHelper = new DDLRecordTestHelper( GroupTestUtil.addGroup(groupId), ddlRecordSet); ddlRecordTestHelper.addRecord(); } @Test(expected = StorageException.class) public void testAddRecordWithFailStorage() throws Exception { DDMForm ddmForm = DDMFormTestUtil.createDDMForm("Field"); DDLRecordSet ddlRecordSet = addRecordSet( ddmForm, FailStorageAdapter.STORAGE_TYPE); DDLRecordTestHelper ddlRecordTestHelper = new DDLRecordTestHelper( _group, ddlRecordSet); ddlRecordTestHelper.addRecord(); } @Test public void testAddRecordWithLocalizedTextField() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", true, false)); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); expectedDDMFormValues.addDDMFormFieldValue( createLocalizedDDMFormFieldValue("Name", "Joe Bloggs")); assertRecordDDMFormValues(ddmForm, expectedDDMFormValues); } @Test public void testAddRecordWithNestedFieldAndSeparatorAsParentField() throws Exception { DDMForm ddmForm = createDDMForm(); DDMFormField separatorDDMFormField = createSeparatorDDMFormField( "Separator"); separatorDDMFormField.addNestedDDMFormField( createTextDDMFormField("Name", true, false)); ddmForm.addDDMFormField(separatorDDMFormField); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); DDMFormFieldValue separatorDDMFormFieldValue = createSeparatorDDMFormFieldValue("Separator"); separatorDDMFormFieldValue.addNestedDDMFormFieldValue( createLocalizedDDMFormFieldValue("Name", "Joe Bloggs")); expectedDDMFormValues.addDDMFormFieldValue(separatorDDMFormFieldValue); assertRecordDDMFormValues(ddmForm, expectedDDMFormValues); } @Test public void testAddRecordWithNestedFieldsAndTextAsParentField() throws Exception { DDMForm ddmForm = createDDMForm(); DDMFormField parentDDMFormField = createTextDDMFormField( "Name", true, true); parentDDMFormField.addNestedDDMFormField( createTextDDMFormField("Phone", false, true)); ddmForm.addDDMFormField(parentDDMFormField); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); DDMFormFieldValue scottDDMFormFieldValue = createLocalizedDDMFormFieldValue("Name", "Scott Joplin"); scottDDMFormFieldValue.addNestedDDMFormFieldValue( createUnlocalizedDDMFormFieldValue("Phone", "12")); scottDDMFormFieldValue.addNestedDDMFormFieldValue( createUnlocalizedDDMFormFieldValue("Phone", "34")); expectedDDMFormValues.addDDMFormFieldValue(scottDDMFormFieldValue); DDMFormFieldValue louisDDMFormFieldValue = createLocalizedDDMFormFieldValue("Name", "Louis Armstrong"); louisDDMFormFieldValue.addNestedDDMFormFieldValue( createUnlocalizedDDMFormFieldValue("Phone", "56")); louisDDMFormFieldValue.addNestedDDMFormFieldValue( createUnlocalizedDDMFormFieldValue("Phone", "78")); expectedDDMFormValues.addDDMFormFieldValue(louisDDMFormFieldValue); assertRecordDDMFormValues(ddmForm, expectedDDMFormValues); } @Test public void testAddRecordWithRepeatableTextField() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", true, true)); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); expectedDDMFormValues.addDDMFormFieldValue( createLocalizedDDMFormFieldValue("Name", "Joe Bloggs I")); expectedDDMFormValues.addDDMFormFieldValue( createLocalizedDDMFormFieldValue("Name", "Joe Bloggs II")); expectedDDMFormValues.addDDMFormFieldValue( createLocalizedDDMFormFieldValue("Name", "Joe Bloggs III")); assertRecordDDMFormValues(ddmForm, expectedDDMFormValues); } @Test public void testAddRecordWithUnlocalizedAndUnrepeatableTextField() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", false, false)); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); expectedDDMFormValues.addDDMFormFieldValue( createUnlocalizedDDMFormFieldValue("Name", "Joe Bloggs")); assertRecordDDMFormValues(ddmForm, expectedDDMFormValues); } @Test public void testAddRecordWithUpdatedRecordSet() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", true, false)); ddmForm.addDDMFormField( createTextDDMFormField("Description", true, false)); DDMFormValues expectedDDMFormValues = createDDMFormValues(ddmForm); DDLRecordSet recordSet = addRecordSet(ddmForm); DDLRecordTestHelper recordTestHelper = new DDLRecordTestHelper( _group, recordSet); DDLRecord record = recordTestHelper.addRecord( expectedDDMFormValues, WorkflowConstants.ACTION_PUBLISH); List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields(); ddmFormFields.remove(1); DDMStructure ddmStructure = _ddmStructureTestHelper.updateStructure( recordSet.getDDMStructureId(), ddmForm); _recordSetTestHelper.updateRecordSet( recordSet.getRecordSetId(), ddmStructure); expectedDDMFormValues = createDDMFormValues(ddmForm); record = recordTestHelper.updateRecord( record.getRecordId(), false, 0, expectedDDMFormValues, WorkflowConstants.ACTION_PUBLISH); Assert.assertEquals( recordSet.getVersion(), record.getRecordSetVersion()); DDLRecordVersion recordVersion = record.getRecordVersion(); Assert.assertEquals( recordSet.getVersion(), recordVersion.getRecordSetVersion()); } @Test public void testPublishRecordDraftWithoutChanges() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", true, false)); DDLRecordSet recordSet = addRecordSet(ddmForm); DDLRecordTestHelper recordTestHelper = new DDLRecordTestHelper( _group, recordSet); DDMFormValues ddmFormValues = createDDMFormValues(ddmForm); ddmFormValues.addDDMFormFieldValue( createLocalizedDDMFormFieldValue("Name", "Joe Bloggs")); DDLRecord record = recordTestHelper.addRecord( ddmFormValues, WorkflowConstants.ACTION_SAVE_DRAFT); Assert.assertEquals(WorkflowConstants.STATUS_DRAFT, record.getStatus()); DDLRecordVersion recordVersion = record.getRecordVersion(); Assert.assertTrue(recordVersion.isDraft()); record = updateRecord( record.getRecordId(), record.getDDMFormValues(), WorkflowConstants.ACTION_PUBLISH); Assert.assertEquals( WorkflowConstants.STATUS_APPROVED, record.getStatus()); recordVersion = record.getRecordVersion(); Assert.assertTrue(recordVersion.isApproved()); } @Test public void testUpdateRecord() throws Exception { DDMForm ddmForm = createDDMForm(); ddmForm.addDDMFormField(createTextDDMFormField("Name", true, false)); ddmForm.addDDMFormField(createTextDDMFormField("Phone", true, false)); DDLRecordSet recordSet = addRecordSet(ddmForm); DDLRecordTestHelper recordTestHelper = new DDLRecordTestHelper( _group, recordSet); DDLRecord record = recordTestHelper.addRecord(); Map<String, Serializable> fieldsMap = new HashMap<>(); fieldsMap.put("Name", "Joe Bloggs"); fieldsMap.put("Phone", "123456"); updateRecord( record.getRecordId(), fieldsMap, true, WorkflowConstants.ACTION_PUBLISH); record = DDLRecordLocalServiceUtil.getRecord(record.getRecordId()); assertRecordFieldValue(record, "Name", "Joe Bloggs"); assertRecordFieldValue(record, "Phone", "123456"); } protected DDLRecordSet addRecordSet(DDMForm ddmForm) throws Exception { return addRecordSet(ddmForm, StorageType.JSON.toString()); } protected DDLRecordSet addRecordSet(DDMForm ddmForm, String storageType) throws Exception { DDMStructure ddmStructure = _ddmStructureTestHelper.addStructure( ddmForm, storageType); return _recordSetTestHelper.addRecordSet(ddmStructure); } protected void assertRecordDDMFormValues( DDMForm ddmForm, DDMFormValues expectedDDMFormValues) throws Exception { DDLRecordSet recordSet = addRecordSet(ddmForm); DDLRecordTestHelper recordTestHelper = new DDLRecordTestHelper( _group, recordSet); DDLRecord record = recordTestHelper.addRecord( expectedDDMFormValues, WorkflowConstants.ACTION_PUBLISH); DDLRecord actualRecord = DDLRecordLocalServiceUtil.getRecord( record.getRecordId()); DDMFormValues actualDDMFormValues = actualRecord.getDDMFormValues(); Assert.assertEquals(expectedDDMFormValues, actualDDMFormValues); } protected void assertRecordFieldValue( DDLRecord record, String fieldName, String expectedValue) throws Exception { List<DDMFormFieldValue> ddmFormFieldValues = record.getDDMFormFieldValues(fieldName); Assert.assertEquals( ddmFormFieldValues.toString(), 1, ddmFormFieldValues.size()); DDMFormFieldValue ddmFormFieldValue = ddmFormFieldValues.get(0); Value value = ddmFormFieldValue.getValue(); Assert.assertEquals(expectedValue, value.getString(_defaultLocale)); } protected DDMForm createDDMForm() { DDMForm ddmForm = new DDMForm(); Set<Locale> availableLocales = new HashSet<>(); availableLocales.add(LocaleUtil.US); ddmForm.setAvailableLocales(availableLocales); ddmForm.setDefaultLocale(LocaleUtil.US); return ddmForm; } protected DDMFormValues createDDMFormValues(DDMForm ddmForm) { Set<Locale> availableLocales = DDMFormValuesTestUtil.createAvailableLocales(LocaleUtil.US); return DDMFormValuesTestUtil.createDDMFormValues( ddmForm, availableLocales, LocaleUtil.US); } protected DDMFormFieldValue createLocalizedDDMFormFieldValue( String name, String enValue) { return DDMFormValuesTestUtil.createLocalizedDDMFormFieldValue( name, enValue); } protected DDMFormField createSeparatorDDMFormField(String name) { DDMFormField ddmFormField = new DDMFormField(name, "separator"); ddmFormField.setDataType(StringPool.BLANK); LocalizedValue label = ddmFormField.getLabel(); label.addString(LocaleUtil.US, name); return ddmFormField; } protected DDMFormFieldValue createSeparatorDDMFormFieldValue(String name) { DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue(); ddmFormFieldValue.setName(name); ddmFormFieldValue.setInstanceId(StringUtil.randomString()); return ddmFormFieldValue; } protected DDMFormField createTextDDMFormField( String name, boolean localizable, boolean repeatable) { DDMFormField ddmFormField = new DDMFormField(name, "text"); ddmFormField.setDataType("string"); ddmFormField.setLocalizable(localizable); ddmFormField.setRepeatable(repeatable); LocalizedValue label = ddmFormField.getLabel(); label.addString(LocaleUtil.US, name); return ddmFormField; } protected DDMFormFieldValue createUnlocalizedDDMFormFieldValue( String name, String value) { return DDMFormValuesTestUtil.createUnlocalizedDDMFormFieldValue( name, value); } protected DDLRecord updateRecord( long recordId, DDMFormValues ddmFormValues, int workflowAction) throws Exception { ServiceContext serviceContext = DDLRecordTestUtil.getServiceContext( workflowAction); return DDLRecordLocalServiceUtil.updateRecord( TestPropsValues.getUserId(), recordId, false, DDLRecordConstants.DISPLAY_INDEX_DEFAULT, ddmFormValues, serviceContext); } protected DDLRecord updateRecord( long recordId, Map<String, Serializable> fieldsMap, boolean mergeFields, int workflowAction) throws Exception { ServiceContext serviceContext = DDLRecordTestUtil.getServiceContext( workflowAction); return DDLRecordLocalServiceUtil.updateRecord( TestPropsValues.getUserId(), recordId, DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fieldsMap, mergeFields, serviceContext); } private static ServiceRegistration<StorageAdapter> _serviceRegistration; private Set<Locale> _availableLocales; private DDMStructureTestHelper _ddmStructureTestHelper; private Locale _defaultLocale; @DeleteAfterTestRun private Group _group; private DDLRecordSetTestHelper _recordSetTestHelper; }