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