From 50356b72ebf06021f020eb57d266e849b228de06 Mon Sep 17 00:00:00 2001 From: Viktor Kovtun <viktor.kovtun@id.ethz.ch> Date: Tue, 22 Sep 2020 17:55:15 +0200 Subject: [PATCH] SSDM-10151 Added tests for searching by any property. --- .../asapi/v3/AbstractSearchPropertyTest.java | 170 +++++++++++++++++- 1 file changed, 164 insertions(+), 6 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 b3ba709064a..ecfebd5cc9f 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 @@ -19,8 +19,7 @@ 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 ch.ethz.sis.openbis.generic.server.asapi.v3.search.translator.condition.utils.TranslatorUtils.parseDate; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; +import static org.testng.Assert.*; import java.text.DateFormat; import java.util.Calendar; @@ -28,15 +27,12 @@ import java.util.Date; import java.util.List; import java.util.Map; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.DatePropertySearchCriteria; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.*; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.ObjectPermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPermIdHolder; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractEntitySearchCriteria; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.NumberPropertySearchCriteria; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.StringPropertySearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.DataType; import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyTypePermId; @@ -312,6 +308,125 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest } } + @DataProvider + protected Object[][] withAnyPropertyExamples() + { + final String formattedDate = DATE_FORMAT.format(createDate(2020, Calendar.FEBRUARY, 15, 0, 0, 0)); + final String formattedTimestamp = DATE_HOURS_MINUTES_SECONDS_FORMAT.format(createDate(2020, Calendar.FEBRUARY, 15, 10, 0, 1)); + return new Object[][] { + { DataType.VARCHAR, "12", "== 12", true }, + { DataType.VARCHAR, "ab", "<= abc", true }, + { DataType.VARCHAR, "12", "> 100", true }, + { DataType.VARCHAR, "ac3", "contains bc and endsWith 4", false }, + { DataType.VARCHAR, "abc3", "contains bc and endsWith 4", false }, + { DataType.VARCHAR, "ab34", "contains bc and endsWith 4", false }, + { DataType.VARCHAR, "abc34", "contains bc and endsWith 4", true }, + { DataType.MULTILINE_VARCHAR, "ac3", "contains bc or endsWith 4", false }, + { DataType.MULTILINE_VARCHAR, "abc3", "contains bc or endsWith 4", true }, + { DataType.MULTILINE_VARCHAR, "ab4", "contains bc or endsWith 4", true }, + { DataType.MULTILINE_VARCHAR, "abc4", "contains bc or endsWith 4", true }, + { DataType.MULTILINE_VARCHAR, "12", "> 100 and <= 13", true }, + { DataType.BOOLEAN, "true", "== true", true }, + { DataType.BOOLEAN, "true", "== false", false }, + { DataType.BOOLEAN, "false", "contains rue", false }, + { DataType.BOOLEAN, "true", "contains rue", true }, + { DataType.BOOLEAN, "false", "contains als", true }, + { DataType.BOOLEAN, "true", "contains als", false }, + + { DataType.INTEGER, "12", "== 12", true }, + { DataType.REAL, "12.5", "== 12.5", true }, + { DataType.INTEGER, "13", "> 13", false }, + { DataType.INTEGER, "13", ">= 13", true }, + { DataType.INTEGER, "13", "< 13", false }, + { DataType.INTEGER, "13", "<= 13", true }, + { DataType.INTEGER, "13", "<= 13.0", true }, + { DataType.INTEGER, "13", "< 13.001", true }, + { DataType.INTEGER, "999999999999", "< 999999999999.001", true }, + { DataType.INTEGER, "999999999999", "> 999999999999.001", false }, + { DataType.REAL, "999999999999", "> 999999999999", false }, + { DataType.REAL, "1", "< 1", false }, + { DataType.REAL, "0.999", "< 1", true }, + { DataType.INTEGER, "12", "> 13", false }, + { DataType.INTEGER, "14", "> 13 and <= 19.5", true }, + { DataType.INTEGER, "19", "> 13 and <= 19.5", true }, + { DataType.REAL, "19", "> 13 and <= 19.5", true }, + { DataType.REAL, "19.5", "> 13 and <= 19.5", true }, + { DataType.REAL, "19.6", ">= 23.5 or <= 19.5", false }, + { DataType.REAL, "19", ">= 23.5 or <= 19.5", true }, + { DataType.REAL, "23.5", ">= 23.5 or <= 19.5", true }, + { DataType.INTEGER, "19", ">= 23.5 or <= 19.5", true }, + { DataType.INTEGER, "24", ">= 23.5 or <= 19.5", true }, + { DataType.INTEGER, "19", ">= 24 or <= 19", true }, + { DataType.INTEGER, "24", ">= 24 or <= 19", true }, + { DataType.INTEGER, "12345", "startsWith 12 and endsWith 45", true }, + { DataType.INTEGER, "12345", "startsWith 13 and endsWith 45", false }, + { DataType.INTEGER, "12345", "startsWith 12 and endsWith 55", false }, + { DataType.INTEGER, "12345", "startsWith 11 and endsWith 55", false }, + { DataType.INTEGER, "12345", "startsWith 12 or endsWith 45", true }, + { DataType.INTEGER, "12345", "startsWith 13 or endsWith 45", true }, + { DataType.INTEGER, "12345", "startsWith 12 or endsWith 55", true }, + { DataType.INTEGER, "12345", "startsWith 11 or endsWith 55", false }, + { DataType.INTEGER, "12345", "contains 23", true }, + { DataType.INTEGER, "12345", "contains 43", false }, + { DataType.REAL, "12.345", "startsWith 12. and endsWith 45", true }, + { DataType.REAL, "12.345", "startsWith 13. and endsWith 45", false }, + { DataType.REAL, "12.345", "startsWith 12. and endsWith 55", false }, + { DataType.REAL, "12.345", "startsWith 11. and endsWith 55", false }, + { DataType.REAL, "12.345", "startsWith 12. or endsWith 45", true }, + { DataType.REAL, "12.345", "startsWith 13. or endsWith 45", true }, + { DataType.REAL, "12.345", "startsWith 12. or endsWith 55", true }, + { DataType.REAL, "12.345", "startsWith 11. or endsWith 55", false }, + { DataType.REAL, "12.345", "contains .", true }, + { DataType.REAL, "12.345", "contains 9", false }, + + { DataType.DATE, formattedDate, "== 2020-02-15", true }, + { DataType.DATE, formattedDate, "== 2020-02-14", false }, + { DataType.DATE, formattedDate, ">= 2020-02-16", false }, + { DataType.DATE, formattedDate, ">= 2020-02-15", true }, + { DataType.DATE, formattedDate, ">= 2020-02-14", true }, + { DataType.DATE, formattedDate, "<= 2020-02-16", true }, + { DataType.DATE, formattedDate, "<= 2020-02-15", true }, + { DataType.DATE, formattedDate, "<= 2020-02-14", false }, + { DataType.DATE, formattedDate, "> 2020-02-16", false }, + { DataType.DATE, formattedDate, "> 2020-02-15", false }, + { DataType.DATE, formattedDate, "> 2020-02-14", true }, + { DataType.DATE, formattedDate, "< 2020-02-16", true }, + { DataType.DATE, formattedDate, "< 2020-02-15", false }, + { DataType.DATE, formattedDate, "< 2020-02-14", false }, + + { DataType.TIMESTAMP, formattedTimestamp, "startsWith 2020-02-15 10:00:01", true }, + { DataType.TIMESTAMP, formattedTimestamp, "startsWith 2020-02-15 10:00:00", false }, + { DataType.TIMESTAMP, formattedTimestamp, ">= 2020-02-15 10:00:02 +0100", false }, + { DataType.TIMESTAMP, formattedTimestamp, ">= 2020-02-15 10:00:00 +0100", true }, + { DataType.TIMESTAMP, formattedTimestamp, "<= 2020-02-15 10:00:02 +0100", true }, + { DataType.TIMESTAMP, formattedTimestamp, "<= 2020-02-15 10:00:00 +0100", false }, + { DataType.TIMESTAMP, formattedTimestamp, "> 2020-02-15 10:00:02 +0100", false }, + { DataType.TIMESTAMP, formattedTimestamp, "> 2020-02-15 10:00:00 +0100", true }, + { DataType.TIMESTAMP, formattedTimestamp, "< 2020-02-15 10:00:02 +0100", true }, + { DataType.TIMESTAMP, formattedTimestamp, "< 2020-02-15 10:00:00 +0100", false }, + }; + } + + @Test(dataProvider = "withAnyPropertyExamples") + public void testWithAnyProperty(final DataType dataType, final String value, final String queryString, + final boolean found) + { + // Given + final String sessionToken = v3api.login(TEST_USER, PASSWORD); + final PropertyTypePermId propertyTypeId = createAPropertyType(sessionToken, dataType); + final ObjectPermId entityPermId = createEntity(sessionToken, propertyTypeId, value); + final AbstractEntitySearchCriteria<?> searchCriteria = createSearchCriteria(); + new AnyPropertyQueryInjector(searchCriteria).buildCriteria(queryString); + + // When + final List<? extends IPermIdHolder> entities = search(sessionToken, searchCriteria); + + // Then + final boolean hasMatch = entities.stream().anyMatch( + entity -> entity.getPermId().toString().equals(entityPermId.getPermId())); + assertEquals(hasMatch, found); + } + private Date createDate(final int year, final int month, final int date, final int hrs, final int min, final int sec) { @@ -565,5 +680,48 @@ public abstract class AbstractSearchPropertyTest extends AbstractTest } } } + + private static final class AnyPropertyQueryInjector extends AbstractQueryInjector + { + AnyPropertyQueryInjector(final AbstractEntitySearchCriteria<?> searchCriteria) + { + super(searchCriteria, null); + } + + @Override + protected void injectQuery(final Operator operator, final String operand) + { + final AnyPropertySearchCriteria criteria = searchCriteria.withAnyProperty(); + switch (operator) + { + case CONTAINS: + criteria.thatContains(operand); + break; + case STARTS_WITH: + criteria.thatStartsWith(operand); + break; + case ENDS_WITH: + criteria.thatEndsWith(operand); + break; + case EQUAL: + criteria.thatEquals(operand); + break; + case GREATER: + criteria.thatIsGreaterThan(operand); + break; + case GREATER_OR_EQUAL: + criteria.thatIsGreaterThanOrEqualTo(operand); + break; + case LESS: + criteria.thatIsLessThan(operand); + break; + case LESS_OR_EQUAL: + criteria.thatIsLessThanOrEqualTo(operand); + break; + default: + throw new IllegalArgumentException("Unsupported operator " + operator); + } + } + } } -- GitLab