From df41100e5eac71b82cbfa5aa07f87bf83a11d73a Mon Sep 17 00:00:00 2001 From: Viktor Kovtun <viktor.kovtun@id.ethz.ch> Date: Thu, 24 Sep 2020 17:36:31 +0200 Subject: [PATCH] SSDM-10226 Added SearchMaterialTest.testWithDateOrTimestampProperty() and improved AbstractSearchPropertyTest.testWithDateOrTimestampProperty() with dates and timestamps searched as string properties. --- .../asapi/v3/AbstractSearchPropertyTest.java | 68 ++++--- .../systemtest/asapi/v3/AbstractTest.java | 23 +-- .../asapi/v3/SearchMaterialTest.java | 186 +++++++++++++++++- 3 files changed, 238 insertions(+), 39 deletions(-) diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java index a18ca832bb8..3e95aeb6a0c 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractSearchPropertyTest.java @@ -270,40 +270,72 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest public void testWithDateOrTimestampProperty(final DataType dataType, final Date value, final String queryString, final boolean found) { - // Given final String sessionToken = v3api.login(TEST_USER, PASSWORD); final PropertyTypePermId propertyTypeId = createAPropertyType(sessionToken, dataType); final DateFormat dateFormat = dataType == DataType.DATE ? DATE_FORMAT : DATE_HOURS_MINUTES_SECONDS_FORMAT; final String formattedValue = dateFormat.format(value); - final ObjectPermId entityPermId = createEntity(sessionToken, propertyTypeId, formattedValue); - final AbstractEntitySearchCriteria<?> searchCriteria1 = createSearchCriteria(); - new DateQueryInjector(searchCriteria1, propertyTypeId, dateFormat).buildCriteria(queryString); + + // Given + final AbstractEntitySearchCriteria<?> dateSearchCriteria = createSearchCriteria(); + new DateQueryInjector(dateSearchCriteria, propertyTypeId, dateFormat).buildCriteria(queryString); + + // When + final List<? extends IPermIdHolder> dateEntities = search(sessionToken, dateSearchCriteria); + + // Then + assertEquals(dateEntities.size(), found ? 1 : 0); + if (found) + { + assertEquals(dateEntities.get(0).getPermId().toString(), entityPermId.getPermId()); + } + + // Given + final AbstractEntitySearchCriteria<?> dateSearchStringPropertyCriteria = createSearchCriteria(); + new StringQueryInjector(dateSearchStringPropertyCriteria, propertyTypeId, false).buildCriteria(queryString); // When - final List<? extends IPermIdHolder> entities1 = search(sessionToken, searchCriteria1); + final List<? extends IPermIdHolder> dateEntitiesFromStringPropertyCriteria = search(sessionToken, + dateSearchStringPropertyCriteria); // Then - assertEquals(entities1.size(), found ? 1 : 0); + assertEquals(dateEntitiesFromStringPropertyCriteria.size(), found ? 1 : 0); if (found) { - assertEquals(entities1.get(0).getPermId().toString(), entityPermId.getPermId()); + assertEquals(dateEntitiesFromStringPropertyCriteria.get(0).getPermId().toString(), entityPermId.getPermId()); } if (dataType == DataType.TIMESTAMP) { // Given - final AbstractEntitySearchCriteria<?> searchCriteria2 = createSearchCriteria(); - new DateQueryInjector(searchCriteria2, propertyTypeId, null).buildCriteria(queryString); + final AbstractEntitySearchCriteria<?> timestampSearchCriteria = createSearchCriteria(); + new DateQueryInjector(timestampSearchCriteria, propertyTypeId, null).buildCriteria(queryString); // When - final List<? extends IPermIdHolder> entities2 = search(sessionToken, searchCriteria2); + final List<? extends IPermIdHolder> timestampEntities = search(sessionToken, timestampSearchCriteria); // Then - assertEquals(entities2.size(), found ? 1 : 0); + assertEquals(timestampEntities.size(), found ? 1 : 0); if (found) { - assertEquals(entities2.get(0).getPermId().toString(), entityPermId.getPermId()); + assertEquals(timestampEntities.get(0).getPermId().toString(), entityPermId.getPermId()); + } + + // Given + final AbstractEntitySearchCriteria<?> timestampSearchStringPropertyCriteria = createSearchCriteria(); + new StringQueryInjector(timestampSearchStringPropertyCriteria, propertyTypeId, false) + .buildCriteria(queryString); + + // When + final List<? extends IPermIdHolder> timestampEntitiesFromStringPropertyCriteria = search(sessionToken, + timestampSearchStringPropertyCriteria); + + // Then + assertEquals(timestampEntitiesFromStringPropertyCriteria.size(), found ? 1 : 0); + if (found) + { + assertEquals(timestampEntitiesFromStringPropertyCriteria.get(0).getPermId().toString(), + entityPermId.getPermId()); } } } @@ -412,14 +444,6 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest assertEquals(hasMatch, found); } - private Date createDate(final int year, final int month, final int date, final int hrs, final int min, - final int sec) - { - final Calendar calendar = Calendar.getInstance(); - calendar.set(year, month, date, hrs, min, sec); - return calendar.getTime(); - } - private ObjectPermId createEntity(String sessionToken, PropertyTypePermId propertyTypeId, String value) { EntityTypePermId entityTypeId = createEntityType(sessionToken, propertyTypeId); @@ -496,7 +520,7 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest protected abstract void injectQuery(Operator operator, String operand); } - private static final class StringQueryInjector extends AbstractQueryInjector + static final class StringQueryInjector extends AbstractQueryInjector { private boolean anyField; @@ -554,7 +578,7 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest } } - private static final class DateQueryInjector extends AbstractQueryInjector + static final class DateQueryInjector extends AbstractQueryInjector { private final DateFormat dateFormat; diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java index da6be769a25..9650e83f17a 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java @@ -23,20 +23,7 @@ import static org.testng.Assert.fail; import java.lang.reflect.Method; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.function.Consumer; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -172,6 +159,14 @@ public class AbstractTest extends SystemTestCase @Autowired protected IGeneralInformationService generalInformationService; + protected static Date createDate(final int year, final int month, final int date, final int hrs, final int min, + final int sec) + { + final Calendar calendar = Calendar.getInstance(); + calendar.set(year, month, date, hrs, min, sec); + return calendar.getTime(); + } + @BeforeClass public void beforeClass() { diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java index ca216e0e702..16941aa6843 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java @@ -16,14 +16,18 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3; +import static ch.ethz.sis.openbis.generic.server.asapi.v3.search.translator.SearchCriteriaTranslator.DATE_FORMAT; +import static ch.ethz.sis.openbis.generic.server.asapi.v3.search.translator.SearchCriteriaTranslator.DATE_HOURS_MINUTES_SECONDS_FORMAT; import static org.testng.Assert.assertEquals; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.text.DateFormat; +import java.util.*; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPermIdHolder; import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.create.MaterialCreation; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.DataType; import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyTypePermId; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult; @@ -824,6 +828,182 @@ public class SearchMaterialTest extends AbstractTest "DatePropertySearchCriteria", "VARCHAR")); } + @DataProvider + protected Object[][] withDateOrTimestampPropertyExamples() + { + return new Object[][] { + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "== 2020-02-15", true }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "== 2020-02-14", false }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), ">= 2020-02-16", false }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), ">= 2020-02-15", true }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), ">= 2020-02-14", true }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "<= 2020-02-16", true }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "<= 2020-02-15", true }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "<= 2020-02-14", false }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "> 2020-02-16", false }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "> 2020-02-15", false }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "> 2020-02-14", true }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "< 2020-02-16", true }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "< 2020-02-15", false }, + { DataType.DATE, createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0), "< 2020-02-14", false }, + + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "== 2020-02-15 10:00:01", true }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "== 2020-02-15 10:00:00", false }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), ">= 2020-02-15 10:00:02", false }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), ">= 2020-02-15 10:00:01", true }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), ">= 2020-02-15 10:00:00", true }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "<= 2020-02-15 10:00:02", true }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "<= 2020-02-15 10:00:01", true }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "<= 2020-02-15 10:00:00", false }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "> 2020-02-15 10:00:02", false }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "> 2020-02-15 10:00:01", false }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "> 2020-02-15 10:00:00", true }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "< 2020-02-15 10:00:02", true }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "< 2020-02-15 10:00:01", false }, + { DataType.TIMESTAMP, createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1), "< 2020-02-15 10:00:00", false }, + }; + } + + @Test(dataProvider = "withDateOrTimestampPropertyExamples") + public void testWithDateOrTimestampProperty(final DataType dataType, final Date value, final String queryString, + final boolean found) + { + final String sessionToken = v3api.login(TEST_USER, PASSWORD); + final PropertyTypePermId propertyTypeId = createAPropertyType(sessionToken, dataType); + final DateFormat dateFormat = dataType == DataType.DATE ? DATE_FORMAT : DATE_HOURS_MINUTES_SECONDS_FORMAT; + final String formattedValue = dateFormat.format(value); + final MaterialPermId entityPermId = createMaterial(sessionToken, propertyTypeId, formattedValue); + final MaterialFetchOptions emptyFetchOptions = new MaterialFetchOptions(); + + // Given + final MaterialSearchCriteria dateSearchCriteria = new MaterialSearchCriteria(); + new AbstractSearchPropertyTest.DateQueryInjector(dateSearchCriteria, propertyTypeId, dateFormat) + .buildCriteria(queryString); + + // When + final List<? extends IPermIdHolder> dateEntities = searchMaterials(sessionToken, dateSearchCriteria, + emptyFetchOptions); + + // Then + assertEquals(dateEntities.size(), found ? 1 : 0); + if (found) + { + assertEquals(dateEntities.get(0).getPermId().toString(), entityPermId.toString()); + } + + // Given + final MaterialSearchCriteria dateSearchStringPropertyCriteria = new MaterialSearchCriteria(); + new AbstractSearchPropertyTest.StringQueryInjector(dateSearchStringPropertyCriteria, propertyTypeId, false) + .buildCriteria(queryString); + + // When + final List<? extends IPermIdHolder> dateEntitiesFromStringPropertyCriteria = searchMaterials(sessionToken, + dateSearchStringPropertyCriteria, emptyFetchOptions); + + // Then + assertEquals(dateEntitiesFromStringPropertyCriteria.size(), found ? 1 : 0); + if (found) + { + assertEquals(dateEntitiesFromStringPropertyCriteria.get(0).getPermId().toString(), entityPermId.toString()); + } + + if (dataType == DataType.TIMESTAMP) + { + // Given + final MaterialSearchCriteria timestampSearchCriteria = new MaterialSearchCriteria(); + new AbstractSearchPropertyTest.DateQueryInjector(timestampSearchCriteria, propertyTypeId, null) + .buildCriteria(queryString); + + // When + final List<? extends IPermIdHolder> timestampEntities = searchMaterials(sessionToken, + timestampSearchCriteria, emptyFetchOptions); + + // Then + assertEquals(timestampEntities.size(), found ? 1 : 0); + if (found) + { + assertEquals(timestampEntities.get(0).getPermId().toString(), entityPermId.toString()); + } + + // Given + final MaterialSearchCriteria timestampSearchStringPropertyCriteria = new MaterialSearchCriteria(); + new AbstractSearchPropertyTest.StringQueryInjector(timestampSearchStringPropertyCriteria, propertyTypeId, + false).buildCriteria(queryString); + + // When + final List<? extends IPermIdHolder> timestampEntitiesFromStringPropertyCriteria = + searchMaterials(sessionToken, timestampSearchStringPropertyCriteria, emptyFetchOptions); + + // Then + assertEquals(timestampEntitiesFromStringPropertyCriteria.size(), found ? 1 : 0); + if (found) + { + assertEquals(timestampEntitiesFromStringPropertyCriteria.get(0).getPermId().toString(), + entityPermId.toString()); + } + } + } + +// @Test(dataProvider = "withDateOrTimestampPropertyExamples") +// public void testWithDateOrTimestampPropertyUsingWithProperty(final DataType dataType, final Date value, final String queryString, +// final boolean found) +// { +// // Given +// final String sessionToken = v3api.login(TEST_USER, PASSWORD); +// final PropertyTypePermId propertyTypeId = createAPropertyType(sessionToken, dataType); +// final DateFormat dateFormat = dataType == DataType.DATE ? DATE_FORMAT : DATE_HOURS_MINUTES_SECONDS_FORMAT; +// final String formattedValue = dateFormat.format(value); +// +// final MaterialPermId entityPermId = createMaterial(sessionToken, propertyTypeId, formattedValue); +// final MaterialSearchCriteria searchCriteria1 = new MaterialSearchCriteria(); +// new AbstractSearchPropertyTest.DateQueryInjector(searchCriteria1, propertyTypeId, dateFormat) +// .buildCriteria(queryString); +// final MaterialFetchOptions emptyFetchOptions = new MaterialFetchOptions(); +// +// // When +// final List<? extends IPermIdHolder> entities1 = searchMaterials(sessionToken, searchCriteria1, +// emptyFetchOptions); +// +// // Then +// assertEquals(entities1.size(), found ? 1 : 0); +// if (found) +// { +// assertEquals(entities1.get(0).getPermId().toString(), entityPermId.toString()); +// } +// +// if (dataType == DataType.TIMESTAMP) +// { +// // Given +// final MaterialSearchCriteria searchCriteria2 = new MaterialSearchCriteria(); +// new AbstractSearchPropertyTest.DateQueryInjector(searchCriteria2, propertyTypeId, null) +// .buildCriteria(queryString); +// +// // When +// final List<? extends IPermIdHolder> entities2 = searchMaterials(sessionToken, searchCriteria2, +// emptyFetchOptions); +// +// // Then +// assertEquals(entities2.size(), found ? 1 : 0); +// if (found) +// { +// assertEquals(entities2.get(0).getPermId().toString(), entityPermId.toString()); +// } +// } +// } + + private MaterialPermId createMaterial(final String sessionToken, final PropertyTypePermId propertyType, + final String formattedValue) + { + final EntityTypePermId materialType = createAMaterialType(sessionToken, false, propertyType); + + final MaterialCreation materialCreation = new MaterialCreation(); + materialCreation.setCode("TEST-MATERIAL-" + System.currentTimeMillis()); + materialCreation.setTypeId(materialType); + materialCreation.setProperty(propertyType.getPermId(), formattedValue); + + return v3api.createMaterials(sessionToken, Collections.singletonList(materialCreation)).get(0); + } + private List<Material> searchMaterials(final String sessionToken, final MaterialSearchCriteria criteria, final MaterialFetchOptions options) { -- GitLab