/**
* 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.values.query;
import com.liferay.dynamic.data.mapping.form.values.query.internal.DDMFormValuesQueryFactoryImpl;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.model.UnlocalizedValue;
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.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.StringUtil;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* @author Marcellus Tavares
*/
@PrepareForTest(LocaleUtil.class)
@RunWith(PowerMockRunner.class)
public class DDMFormValuesQueryTest extends PowerMockito {
@Before
public void setUp() {
_ddmFormValues = createDDMFormValues();
_ddmFormValuesQueryFactory = new DDMFormValuesQueryFactoryImpl();
setUpLocaleUtil();
}
@Test
public void testSelectAllFromRootUsingMultipleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery("//*");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 18, ddmFormFieldValues.size());
}
@Test
public void testSelectAllFromRootUsingSingleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery("/*");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
Assert.assertEquals(
"text1", getDDMFormFieldValueFieldName(ddmFormFieldValues.get(0)));
Assert.assertEquals(
"text2", getDDMFormFieldValueFieldName(ddmFormFieldValues.get(1)));
Assert.assertEquals(
"text3", getDDMFormFieldValueFieldName(ddmFormFieldValues.get(2)));
}
@Test
public void testSelectAllFromText1UsingSingleAndMultipleStep()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"/text1//*");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 4, ddmFormFieldValues.size());
Assert.assertEquals(
"text11", getDDMFormFieldValueFieldName(ddmFormFieldValues.get(0)));
Assert.assertEquals(
"text11", getDDMFormFieldValueFieldName(ddmFormFieldValues.get(1)));
Assert.assertEquals(
"text11", getDDMFormFieldValueFieldName(ddmFormFieldValues.get(2)));
Assert.assertEquals(
"text12", getDDMFormFieldValueFieldName(ddmFormFieldValues.get(3)));
}
@Test
public void testSelectAllFromText3UsingMultipleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//text3//*");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 7, ddmFormFieldValues.size());
}
@Test
public void testSelectAllFromText3UsingSingleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"/text3/*");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 2, ddmFormFieldValues.size());
}
@Test
public void testSelectText2FromRootUsingSingleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"/text2");
DDMFormFieldValue ddmFormFieldValue =
ddmFormValuesQuery.selectSingleDDMFormFieldValue();
Assert.assertEquals("text2", ddmFormFieldValue.getName());
}
@Test
public void testSelectText12FromRootUsingMultipleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//text12");
DDMFormFieldValue ddmFormFieldValue =
ddmFormValuesQuery.selectSingleDDMFormFieldValue();
Assert.assertEquals("text12", ddmFormFieldValue.getName());
}
@Test
public void testSelectText12FromRootUsingSingleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"/text12");
DDMFormFieldValue ddmFormFieldValue =
ddmFormValuesQuery.selectSingleDDMFormFieldValue();
Assert.assertNull(ddmFormFieldValue);
}
@Test
public void testSelectText311From31UsingMultipleAndSingleStep()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//text31/text313");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 1, ddmFormFieldValues.size());
Assert.assertEquals(
"text313",
getDDMFormFieldValueFieldName(ddmFormFieldValues.get(0)));
}
@Test
public void testSelectText311From31UsingMultipleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//text313");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 1, ddmFormFieldValues.size());
Assert.assertEquals(
"text313",
getDDMFormFieldValueFieldName(ddmFormFieldValues.get(0)));
}
@Test
public void testSelectUsingAndExpressionAndSingleStep() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'En text22' and @value('pt_BR') = 'Pt " +
"text22']");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'En text22' and @type = 'text']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'En text22' and @value('pt_BR') = 'wrong']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 0, ddmFormFieldValues.size());
}
@Test
public void testSelectUsingAndExpressionForLocalizedFieldAndMulitpleStep()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'En text22' and @value('pt_BR') = 'Pt " +
"text22']");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'En text22' and @type = 'text']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'En text22' and @value('pt_BR') = 'wrong']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 0, ddmFormFieldValues.size());
}
@Test
public void testSelectUsingLocalizedValueMatcherAndMulitpleStep()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'En text22']");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'Pt text22']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 0, ddmFormFieldValues.size());
}
@Test
public void testSelectUsingLocalizedValueMatcherAndSingleStep()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"/text3[@value('en_US') = 'text3']");
DDMFormFieldValue ddmFormFieldValue =
ddmFormValuesQuery.selectSingleDDMFormFieldValue();
Assert.assertEquals(
"text3", getDDMFormFieldValueFieldName(ddmFormFieldValue));
}
@Test
public void testSelectUsingMixedBooleanExpressionMatchers()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value('en_US') = 'wrong' and @value('en_US') = 'wrong' or" +
"@value('pt_BR') = 'Pt text22']");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
}
@Test
public void testSelectUsingMultipleAndSingleSteps() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//text31/text311");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 1, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery("//text3/text311");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 0, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery("/text3//text311");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 1, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery("/text31//text311");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 0, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery("//*/text22");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
}
@Test
public void testSelectUsingOrPredicateMatchers() throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"/*[@value('en_US') = 'En text22' or @value('pt_BR') = 'wrong']");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 0, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"/*[@value('en_US') = 'wrong' or @type = 'text']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"/*[@value('en_US') = 'En text1' or @value('pt_BR') = 'wrong']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 1, ddmFormFieldValues.size());
}
@Test
public void testSelectUsingTypePredicateMatcherAndMultipleStep()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@type = 'text']");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 18, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery("/*[@type = 'date']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 0, ddmFormFieldValues.size());
}
@Test
public void testSelectUsingValuePredicateMatcherForLocalizedField()
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value = 'En text22']");
List<DDMFormFieldValue> ddmFormFieldValues =
ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
ddmFormValuesQuery = createDDMFormValuesQuery(
"//*[@value = 'Pt text22']");
ddmFormFieldValues = ddmFormValuesQuery.selectDDMFormFieldValues();
Assert.assertEquals(
ddmFormFieldValues.toString(), 3, ddmFormFieldValues.size());
}
@Test(expected = DDMFormValuesQuerySyntaxException.class)
public void testSyntaxError() throws Exception {
createDDMFormValuesQuery("~/]");
}
protected Set<Locale> createAvailableLocales(Locale... locales) {
Set<Locale> availableLocales = new LinkedHashSet<>();
for (Locale locale : locales) {
availableLocales.add(locale);
}
return availableLocales;
}
protected DDMForm createDDMForm() {
DDMForm ddmForm = new DDMForm();
ddmForm.setAvailableLocales(
createAvailableLocales(LocaleUtil.BRAZIL, LocaleUtil.US));
ddmForm.setDefaultLocale(LocaleUtil.US);
DDMFormField text1DDMFormField = createTextDDMFormField(
"text1", true, true);
text1DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text11", true, true));
text1DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text12", false, false));
ddmForm.addDDMFormField(text1DDMFormField);
DDMFormField text2DDMFormField = createTextDDMFormField(
"text2", false, false);
text2DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text21", false, false));
text2DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text22", true, true));
ddmForm.addDDMFormField(text2DDMFormField);
DDMFormField text3DDMFormField = createTextDDMFormField(
"text3", false, false);
DDMFormField text31DDMFormField = createTextDDMFormField(
"text31", false, false);
text31DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text311", false, false));
text31DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text312", false, false));
text31DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text313", false, false));
text3DDMFormField.addNestedDDMFormField(text31DDMFormField);
DDMFormField text32DDMFormField = createTextDDMFormField(
"text32", false, false);
text32DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text321", false, false));
text32DDMFormField.addNestedDDMFormField(
createTextDDMFormField("text322", false, false));
text3DDMFormField.addNestedDDMFormField(text32DDMFormField);
ddmForm.addDDMFormField(text3DDMFormField);
return ddmForm;
}
protected DDMFormFieldValue createDDMFormFieldValue(
String name, Value value) {
DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue();
ddmFormFieldValue.setInstanceId(StringUtil.randomString());
ddmFormFieldValue.setName(name);
ddmFormFieldValue.setValue(value);
return ddmFormFieldValue;
}
protected DDMFormFieldValue createDDMFormFieldValueLocalizedInstance(
String fieldName) {
return createDDMFormFieldValue(
fieldName,
createLocalizedValue(
"En " + fieldName, "Pt " + fieldName, LocaleUtil.US));
}
protected DDMFormFieldValue createDDMFormFieldValueUnlocalizedInstance(
String fieldName) {
return createDDMFormFieldValue(
fieldName, new UnlocalizedValue(fieldName));
}
protected DDMFormValues createDDMFormValues() {
DDMFormValues ddmFormValues = new DDMFormValues(createDDMForm());
DDMFormFieldValue text1DDMFormFieldValue =
createDDMFormFieldValueLocalizedInstance("text1");
text1DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueLocalizedInstance("text11"));
text1DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueLocalizedInstance("text11"));
text1DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueLocalizedInstance("text11"));
text1DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueUnlocalizedInstance("text12"));
ddmFormValues.addDDMFormFieldValue(text1DDMFormFieldValue);
DDMFormFieldValue text2DDMFormFieldValue =
createDDMFormFieldValueUnlocalizedInstance("text2");
text2DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueUnlocalizedInstance("text21"));
text2DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueLocalizedInstance("text22"));
text2DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueLocalizedInstance("text22"));
text2DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueLocalizedInstance("text22"));
ddmFormValues.addDDMFormFieldValue(text2DDMFormFieldValue);
DDMFormFieldValue text3DDMFormFieldValue =
createDDMFormFieldValueUnlocalizedInstance("text3");
DDMFormFieldValue text31DDMFormFieldValue =
createDDMFormFieldValueUnlocalizedInstance("text31");
text31DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueUnlocalizedInstance("text311"));
text31DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueUnlocalizedInstance("text312"));
text31DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueUnlocalizedInstance("text313"));
text3DDMFormFieldValue.addNestedDDMFormFieldValue(
text31DDMFormFieldValue);
DDMFormFieldValue text32DDMFormFieldValue =
createDDMFormFieldValueUnlocalizedInstance("text32");
text32DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueUnlocalizedInstance("text321"));
text32DDMFormFieldValue.addNestedDDMFormFieldValue(
createDDMFormFieldValueUnlocalizedInstance("text322"));
text3DDMFormFieldValue.addNestedDDMFormFieldValue(
text32DDMFormFieldValue);
ddmFormValues.addDDMFormFieldValue(text3DDMFormFieldValue);
return ddmFormValues;
}
protected DDMFormValuesQuery createDDMFormValuesQuery(String query)
throws Exception {
DDMFormValuesQuery ddmFormValuesQuery =
_ddmFormValuesQueryFactory.create(_ddmFormValues, query);
return ddmFormValuesQuery;
}
protected Value createLocalizedValue(
String enValue, String ptValue, Locale defaultLocale) {
Value value = new LocalizedValue(defaultLocale);
value.addString(LocaleUtil.BRAZIL, ptValue);
value.addString(LocaleUtil.US, enValue);
return value;
}
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 localizedValue = ddmFormField.getLabel();
localizedValue.addString(LocaleUtil.US, name);
return ddmFormField;
}
protected String getDDMFormFieldValueFieldName(
DDMFormFieldValue ddmFormFieldValue) {
return ddmFormFieldValue.getName();
}
protected void setUpLocaleUtil() {
mockStatic(LocaleUtil.class);
when(
LocaleUtil.fromLanguageId("en_US")
).thenReturn(
LocaleUtil.US
);
when(
LocaleUtil.fromLanguageId("pt_BR")
).thenReturn(
LocaleUtil.BRAZIL
);
}
private DDMFormValues _ddmFormValues;
private DDMFormValuesQueryFactory _ddmFormValuesQueryFactory;
}