blob: af379820bfa0d2bd0ce4276bd2a53f9eb7b19740 [file] [log] [blame]
package org.eclipse.mdm.api.odsadapter.search;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.eclipse.mdm.api.odsadapter.ODSEntityManagerFactory.PARAM_NAMESERVICE;
import static org.eclipse.mdm.api.odsadapter.ODSEntityManagerFactory.PARAM_PASSWORD;
import static org.eclipse.mdm.api.odsadapter.ODSEntityManagerFactory.PARAM_SERVICENAME;
import static org.eclipse.mdm.api.odsadapter.ODSEntityManagerFactory.PARAM_USER;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.assertj.core.api.iterable.Extractor;
import org.assertj.core.groups.Tuple;
import org.eclipse.mdm.api.base.ConnectionException;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.query.EntityType;
import org.eclipse.mdm.api.base.query.Filter;
import org.eclipse.mdm.api.base.query.FilterItem;
import org.eclipse.mdm.api.base.query.ModelManager;
import org.eclipse.mdm.api.base.query.BracketOperator;
import org.eclipse.mdm.api.base.query.ComparisonOperator;
import org.eclipse.mdm.api.base.query.BooleanOperator;
import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.api.odsadapter.ODSEntityManagerFactory;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
import com.google.common.collect.ImmutableMap;
@Ignore
// FIXME 10.7.2017: this test needs a running ODS Server, that is not suitable for continous build in Jenkins.
// Comment this in for local tests only.
public class ODSSearchServiceTest {
/*
* ATTENTION: ==========
*
* To run this test make sure the target service is running a MDM default
* model and any database constraint which enforces a relation of Test to a
* parent entity is deactivated!
*/
private static final String NAME_SERVICE = "corbaloc::1.2@%s:%s/NameService";
private static final String USER = "sa";
private static final String PASSWORD = "sa";
private static EntityManager entityManager;
private static ModelManager modelManager;
@BeforeClass
public static void setUpBeforeClass() throws ConnectionException {
String nameServiceHost = System.getProperty("host");
String nameServicePort = System.getProperty("port");
String serviceName = System.getProperty("service");
if (nameServiceHost == null || nameServiceHost.isEmpty()) {
throw new IllegalArgumentException("name service host is unknown: define system property 'host'");
}
nameServicePort = nameServicePort == null || nameServicePort.isEmpty() ? String.valueOf(2809) : nameServicePort;
if (nameServicePort == null || nameServicePort.isEmpty()) {
throw new IllegalArgumentException("name service port is unknown: define system property 'port'");
}
if (serviceName == null || serviceName.isEmpty()) {
throw new IllegalArgumentException("service name is unknown: define system property 'service'");
}
Map<String, String> connectionParameters = new HashMap<>();
connectionParameters.put(PARAM_NAMESERVICE, String.format(NAME_SERVICE, nameServiceHost, nameServicePort));
connectionParameters.put(PARAM_SERVICENAME, serviceName + ".ASAM-ODS");
connectionParameters.put(PARAM_USER, USER);
connectionParameters.put(PARAM_PASSWORD, PASSWORD);
entityManager = new ODSEntityManagerFactory().connect(connectionParameters);
modelManager = entityManager.getModelManager()
.orElseThrow(() -> new IllegalStateException("No ModelManager available!"));
}
@AfterClass
public static void tearDownAfterClass() throws ConnectionException {
if (entityManager != null) {
entityManager.close();
}
}
private Extractor<FilterItem, Tuple> filterExtractors = new Extractor<FilterItem, Tuple>() {
@Override
public Tuple extract(FilterItem f) {
return tuple(f.isBooleanOperator() ? f.getBooleanOperator() : null,
f.isCondition() ? f.getCondition().getAttribute().getName() : null,
f.isCondition() ? f.getCondition().getComparisonOperator() : null,
f.isCondition() ? f.getCondition().getValue().extract() : null,
f.isBracketOperator() ?f.getBracketOperator() : null);
}
};
@Test
public void testGetMergedFilter() throws Exception {
ODSSearchService service = Mockito.spy((ODSSearchService) entityManager.getSearchService()
.orElseThrow(() -> new IllegalStateException("No SearchService available!")));
Mockito.doReturn(ImmutableMap.of(TestStep.class, Arrays.asList("10"))).when(service)
.fetchIds(Mockito.anyString());
EntityType testStep = modelManager.getEntityType(TestStep.class);
assertThat(service.getMergedFilter(Filter.idOnly(testStep, "11"), "query")).hasSize(7)
.extracting(filterExtractors).containsExactly(tuple(null, null, null, null, BracketOperator.OPEN),
tuple(null, "Id", ComparisonOperator.EQUAL, "10"),
tuple(null, null, null, null, BracketOperator.CLOSE),
tuple(BooleanOperator.AND, null, null, null, null),
tuple(null, null, null, null, BracketOperator.OPEN),
tuple(null, "Id", ComparisonOperator.IN_SET, new String[] { "10" }, null),
tuple(null, null, null, null, BracketOperator.CLOSE));
}
@Test
public void testGetMergedFilterNoAttributeFilter() throws Exception {
ODSSearchService service = Mockito.spy((ODSSearchService) entityManager.getSearchService().get());
Mockito.doReturn(ImmutableMap.of(TestStep.class, Arrays.asList("10"))).when(service)
.fetchIds(Mockito.anyString());
assertThat(service.getMergedFilter(Filter.and(), "query")).extracting(filterExtractors)
.containsExactly(tuple(null, "Id", ComparisonOperator.IN_SET, new String[] { "10" }));
}
@Test
public void testGetMergedFilterNoFreetextResult() throws Exception {
ODSSearchService service = Mockito.spy((ODSSearchService) entityManager.getSearchService().get());
Mockito.doReturn(Collections.emptyMap()).when(service).fetchIds(Mockito.anyString());
EntityType testStep = modelManager.getEntityType(TestStep.class);
assertThat(service.getMergedFilter(Filter.idOnly(testStep, "11"), "")).extracting(filterExtractors)
.containsExactly(tuple(null, "Id", ComparisonOperator.EQUAL, "11"));
}
@Test
public void testGetMergedFilterNoAttributeFilterAndNoFreetextResult() throws Exception {
ODSSearchService service = Mockito.spy((ODSSearchService) entityManager.getSearchService().get());
Mockito.doReturn(Collections.emptyMap()).when(service).fetchIds(Mockito.anyString());
assertThat(service.getMergedFilter(Filter.and(), null)).isEmpty();
assertThat(service.getMergedFilter(Filter.and(), "")).isEmpty();
}
}