package com.constellio.app.ui.pages.search.criteria; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; import java.util.List; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import com.constellio.app.ui.pages.search.criteria.Criterion.BooleanOperator; import com.constellio.app.ui.pages.search.criteria.Criterion.SearchOperator; import com.constellio.app.ui.pages.search.criteria.RelativeCriteria.RelativeSearchOperator; import com.constellio.app.ui.pages.search.criteria.SearchCriterionTestSetup.CriterionTestRecord; import com.constellio.app.ui.pages.search.criteria.SearchCriterionTestSetup.TestEnum; import com.constellio.model.services.search.query.logical.criteria.MeasuringUnitTime; import com.constellio.sdk.tests.ConstellioTest; public class CriterionFactoryAcceptanceTest extends ConstellioTest { public static final String STRING_VALUE = "string value"; public static final String STRING_VALUE_WITH_SPECIAL_CHARACTERS = "list:abc & def ; but not, ghi."; public static final int INT_VALUE = 42; public static final LocalDateTime DATE_VALUE = new LocalDateTime(2015, 1, 1, 0, 0, 0); public static final LocalDateTime DATE_END_VALUE = new LocalDateTime(2015, 1, 31, 23, 59, 59); public static final double DOUBLE_VALUE = 42.42; SearchCriterionTestSetup setup = new SearchCriterionTestSetup(zeCollection); CriterionTestRecord shortcuts = setup.getShortcuts(); CriterionFactory factory; @Before public void setUp() { givenCollection(zeCollection); defineSchemasManager().using(setup); factory = new CriterionFactory(); } @Test public void givenACriterionWithStringMetadataWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = stringCriterion(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenACriterionWithSpecialCharactersInStringMetadataWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = stringWithSpecialCharactersCriterion(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenACriterionWithDoubleMetadataWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = doubleCriterion(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenACriterionWithBooleanMetadataWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = booleanCriterion(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenACriterionWithDateMetadataWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = betweenDateCriterion(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenACriterionWithEnumMetadataWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = enumCriterion(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenRelativeCriteriaEqualDateWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = relativeCriterionEqualDate(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenRelativeCriteriaEqualDateTimeWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = relativeCriterionEqualDate(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenRelativeCriteriaTodayWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = relativeCriterionTodayDate(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenRelativeCriteriaPastWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = relativeCriterionPastDate(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenRelativeCriteriaFutureWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = relativeCriterionFutureDate(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } @Test public void givenRelativeCriteriaBetweenWhenSavingAndRestoringThenGetRestoredInstanceWithSameValuesAsSavedInstance() throws ConditionException { Criterion savedCriterion = relativeCriterionBetweenDate(); String serializedCriterion = factory.toString(savedCriterion); Criterion restoredCriterion = factory.build(serializedCriterion); String reserializedCriterion = factory.toString(restoredCriterion); assertThat(savedCriterion).isEqualToComparingFieldByField(restoredCriterion); assertThat(serializedCriterion).isEqualTo(reserializedCriterion); } // private List<Criterion> complexCriterion() { // (criterionTestRecord_default_aString CONTAINS "string value" AND // NOT criterionTestRecord_aDouble > 42.42) OR // (criterionTestRecord_default_aBoolean is true AND // criterionTestRecord_default_aDate BETWEEN(2015-01-01, 2015-01-31) AND // criterionTestRecord_default_anEnum == TestEnum.VALUE1) List<Criterion> complex = new ArrayList<>(); complex.add(criterion1()); complex.add(criterion2()); complex.add(criterion3()); complex.add(betweenDateCriterion()); complex.add(criterion4()); return complex; } private Criterion criterion1() { Criterion s = stringCriterion(); s.setLeftParens(true); s.setBooleanOperator(BooleanOperator.AND_NOT); return s; } private Criterion criterion2() { Criterion d = doubleCriterion(); d.setRightParens(true); d.setBooleanOperator(BooleanOperator.OR); return d; } private Criterion criterion3() { Criterion b = booleanCriterion(); b.setLeftParens(true); return b; } private Criterion criterion4() { Criterion e = enumCriterion(); e.setRightParens(true); return e; } private Criterion stringCriterion() { // criterionTestRecord_default_aString CONTAINS "string value" Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aString().getCode(), shortcuts.aString().getType(), null); criterion.setSearchOperator(SearchOperator.CONTAINS_TEXT); criterion.setValue(STRING_VALUE); return criterion; } private Criterion stringWithSpecialCharactersCriterion() { // criterionTestRecord_default_aString CONTAINS "string value" Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aString().getCode(), shortcuts.aString().getType(), null); criterion.setSearchOperator(SearchOperator.CONTAINS_TEXT); criterion.setValue(STRING_VALUE_WITH_SPECIAL_CHARACTERS); return criterion; } private Criterion intCriterion() { // DO NOT USE (YET) -- WE DO NOT SUPPORT INTEGER FIELDS // criterionTestRecord_default_anInt < 42 Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aString().getCode(), shortcuts.anInt().getType(), null); criterion.setSearchOperator(SearchOperator.LESSER_THAN); criterion.setValue(INT_VALUE); return criterion; } private Criterion doubleCriterion() { // criterionTestRecord_aDouble > 42.42 Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aDouble().getCode(), shortcuts.aDouble().getType(), null); criterion.setSearchOperator(SearchOperator.GREATER_THAN); criterion.setValue(DOUBLE_VALUE); return criterion; } private Criterion booleanCriterion() { // criterionTestRecord_default_aBoolean is true Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aBoolean().getCode(), shortcuts.aBoolean().getType(), null); criterion.setSearchOperator(SearchOperator.IS_TRUE); return criterion; } private Criterion betweenDateCriterion() { // criterionTestRecord_default_aDate BETWEEN(2015-01-01, 2015-01-31) Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aDate().getCode(), shortcuts.aDate().getType(), null); criterion.setSearchOperator(SearchOperator.BETWEEN); criterion.setValue(DATE_VALUE); criterion.setEndValue(DATE_END_VALUE); return criterion; } private Criterion enumCriterion() { // criterionTestRecord_default_anEnum == TestEnum.VALUE1 Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.anEnum().getCode(), shortcuts.anEnum().getType(), shortcuts.anEnum().getEnumClass().getName()); criterion.setSearchOperator(SearchOperator.EQUALS); criterion.setValue(TestEnum.VALUE1); criterion.setEnumClassName(TestEnum.class.getName()); return criterion; } private Criterion relativeCriterionEqualDate() { Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aDate().getCode(), shortcuts.aDate().getType(), null); criterion.setSearchOperator(SearchOperator.EQUALS); RelativeCriteria relativeCriteria = new RelativeCriteria(); relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.EQUALS); criterion.setRelativeCriteria(relativeCriteria); criterion.setValue(DATE_VALUE); return criterion; } private Criterion relativeCriterionTodayDate() { Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aDate().getCode(), shortcuts.aDate().getType(), null); criterion.setSearchOperator(SearchOperator.GREATER_THAN); RelativeCriteria relativeCriteria = new RelativeCriteria(); relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.TODAY); criterion.setRelativeCriteria(relativeCriteria); return criterion; } private Criterion relativeCriterionPastDate() { Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aDate().getCode(), shortcuts.aDate().getType(), null); criterion.setSearchOperator(SearchOperator.GREATER_THAN); RelativeCriteria relativeCriteria = new RelativeCriteria(); relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.PAST); relativeCriteria.setMeasuringUnitTime(MeasuringUnitTime.DAYS); criterion.setRelativeCriteria(relativeCriteria); criterion.setValue(2.0); return criterion; } private Criterion relativeCriterionFutureDate() { Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aDate().getCode(), shortcuts.aDate().getType(), null); criterion.setSearchOperator(SearchOperator.GREATER_THAN); RelativeCriteria relativeCriteria = new RelativeCriteria(); relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.FUTURE); relativeCriteria.setMeasuringUnitTime(MeasuringUnitTime.DAYS); criterion.setRelativeCriteria(relativeCriteria); criterion.setValue(2.0); return criterion; } private Criterion relativeCriterionBetweenDate() { Criterion criterion = new Criterion(shortcuts.code()); criterion.setMetadata(shortcuts.aDate().getCode(), shortcuts.aDate().getType(), null); criterion.setSearchOperator(SearchOperator.BETWEEN); RelativeCriteria relativeCriteria = new RelativeCriteria(); relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.PAST); relativeCriteria.setMeasuringUnitTime(MeasuringUnitTime.DAYS); relativeCriteria.setEndRelativeSearchOperator(RelativeSearchOperator.FUTURE); relativeCriteria.setEndMeasuringUnitTime(MeasuringUnitTime.DAYS); criterion.setRelativeCriteria(relativeCriteria); criterion.setValue(2.0); criterion.setEndValue(2.0); return criterion; } }