blob: d61b38b2bf67e722d34a32e73b86fd08b2e7a8a2 [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
package org.eclipse.mdm.query.boundary;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.assertj.core.groups.Tuple;
import org.eclipse.mdm.api.base.adapter.Attribute;
import org.eclipse.mdm.api.base.adapter.EntityType;
import org.eclipse.mdm.api.base.adapter.ModelManager;
import org.eclipse.mdm.api.base.model.Test;
import org.eclipse.mdm.api.base.model.ValueType;
import org.eclipse.mdm.api.base.query.DataAccessException;
import org.eclipse.mdm.api.base.query.Query;
import org.eclipse.mdm.api.base.query.Record;
import org.eclipse.mdm.api.base.query.Result;
import org.eclipse.mdm.api.base.search.SearchService;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.api.dflt.model.Pool;
import org.eclipse.mdm.connector.boundary.ConnectorService;
import org.eclipse.mdm.connector.boundary.ConnectorServiceException;
import org.eclipse.mdm.query.entity.Column;
import org.eclipse.mdm.query.entity.QueryRequest;
import org.eclipse.mdm.query.entity.Row;
import org.eclipse.mdm.query.entity.SourceFilter;
import org.eclipse.mdm.query.entity.SuggestionRequest;
import org.mockito.Mockito;
public class QueryServiceTest {
@org.junit.Test
public void testQuery() throws DataAccessException {
ApplicationContext context = mockContext();
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
when(connectorService.getContextByName("env1")).thenReturn(context);
QueryService queryService = new QueryService();
queryService.connectorService = connectorService;
SourceFilter filter = new SourceFilter();
filter.setSourceName("env1");
filter.setFilter("Test.Name lk \"*\"");
QueryRequest request = new QueryRequest();
request.setResultType("Test");
request.setColumns(Arrays.asList("Test.Id", "Test.Name"));
request.setFilters(Arrays.asList(filter));
Row expectedRow = new Row();
expectedRow.setSource("env1");
expectedRow.setType("Test");
expectedRow.setId("id1");
expectedRow.addColumns(
Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
assertThat(queryService.queryRows(request)).contains(expectedRow);
}
@org.junit.Test
public void testQuerySingleQuote() throws DataAccessException {
ApplicationContext context = mockContext();
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
when(connectorService.getContextByName("env1")).thenReturn(context);
QueryService queryService = new QueryService();
queryService.connectorService = connectorService;
SourceFilter filter = new SourceFilter();
filter.setSourceName("env1");
filter.setFilter("Test.Name lk '*'");
QueryRequest request = new QueryRequest();
request.setResultType("Test");
request.setColumns(Arrays.asList("Test.Id", "Test.Name"));
request.setFilters(Arrays.asList(filter));
Row expectedRow = new Row();
expectedRow.setSource("env1");
expectedRow.setType("Test");
expectedRow.setId("id1");
expectedRow.addColumns(
Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
assertThat(queryService.queryRows(request)).contains(expectedRow);
}
@org.junit.Test
public void testQueryMissingEnvironmentShouldByIgnored() throws DataAccessException {
ApplicationContext context = mockContext();
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
when(connectorService.getContextByName("env1")).thenReturn(context);
doThrow(ConnectorServiceException.class).when(connectorService).getContextByName("env2");
QueryService queryService = new QueryService();
queryService.connectorService = connectorService;
SourceFilter filterEnv1 = new SourceFilter();
filterEnv1.setSourceName("env1");
filterEnv1.setFilter("Test.Name lk '*'");
SourceFilter filterEnv2 = new SourceFilter();
filterEnv2.setSourceName("env2");
filterEnv2.setFilter("Test.Name lk '*'");
QueryRequest request = new QueryRequest();
request.setResultType("Test");
request.setColumns(Arrays.asList("Test.Id", "Test.Name", "Pool.Name"));
request.setFilters(Arrays.asList(filterEnv1, filterEnv2));
Row expectedRow = new Row();
expectedRow.setSource("env1");
expectedRow.setType("Test");
expectedRow.setId("id1");
expectedRow.addColumns(
Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
assertThat(queryService.queryRows(request)).contains(expectedRow);
}
@org.junit.Test
public void testQueryMissingEntitiesShouldBeIgnored() throws DataAccessException {
ApplicationContext context1 = mockContext();
ApplicationContext context2 = mockContext();
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
when(connectorService.getContextByName("env1")).thenReturn(context1);
when(connectorService.getContextByName("env2")).thenReturn(context2);
EntityType type = mockEntity("env2", "Test");
EntityType pool = mockEntity("env2", "Pool");
when(context2.getModelManager().get().getEntityType(Test.class)).thenReturn(type);
when(context2.getModelManager().get().getEntityType("Test")).thenReturn(type);
when(context2.getModelManager().get().getEntityType(Pool.class)).thenReturn(pool);
when(context2.getModelManager().get().getEntityType("Pool")).thenReturn(pool);
SearchService ss = mock(SearchService.class);
EntityType test = context2.getModelManager().get().getEntityType(Test.class);
when(ss.listEntityTypes(Mockito.eq(Test.class))).thenReturn(Arrays.asList(test, pool));
when(ss.listSearchableTypes()).thenReturn(Arrays.asList(Test.class));
Record recordTest = new Record(context2.getModelManager().get().getEntityType(Test.class));
recordTest.addValue(ValueType.STRING.create("Id", "id1"));
recordTest.addValue(ValueType.STRING.create("Name", "Test-Name"));
Record recordPool = new Record(context2.getModelManager().get().getEntityType(Pool.class));
recordPool.addValue(ValueType.STRING.create("Name", "Pool-Name"));
Result result = new Result();
result.addRecord(recordPool);
result.addRecord(recordTest);
when(context2.getSearchService().get().fetchResults(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Arrays.asList(result));
QueryService queryService = new QueryService();
queryService.connectorService = connectorService;
SourceFilter filterEnv1 = new SourceFilter();
filterEnv1.setSourceName("env1");
filterEnv1.setFilter("Test.Name lk '*'");
SourceFilter filterEnv2 = new SourceFilter();
filterEnv2.setSourceName("env2");
filterEnv2.setFilter("Test.Name lk '*'");
QueryRequest request = new QueryRequest();
request.setResultType("Test");
request.setColumns(Arrays.asList("Test.Id", "Test.Name", "Pool.Name"));
request.setFilters(Arrays.asList(filterEnv1, filterEnv2));
Row expectedRowEnv1 = new Row();
expectedRowEnv1.setSource("env1");
expectedRowEnv1.setType("Test");
expectedRowEnv1.setId("id1");
expectedRowEnv1.addColumns(
Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
Row expectedRowEnv2 = new Row();
expectedRowEnv2.setSource("env2");
expectedRowEnv2.setType("Test");
expectedRowEnv2.setId("id1");
expectedRowEnv2.addColumns(Arrays.asList(new Column("Test", "Id", "id1", null),
new Column("Test", "Name", "Test-Name", null), new Column("Pool", "Name", "Pool-Name", null)));
List<Row> list = queryService.queryRows(request);
assertThat(list).extracting("source", "type", "id").containsOnly(new Tuple("env1", "Test", "id1"),
new Tuple("env2", "Test", "id1"));
assertThat(list.get(0).getColumns()).containsOnlyElementsOf(expectedRowEnv1.getColumns());
assertThat(list.get(1).getColumns()).containsOnlyElementsOf(expectedRowEnv2.getColumns());
}
public static EntityType mockEntity(String sourceName, String name) {
Attribute attrId = mock(Attribute.class);
when(attrId.getName()).thenReturn("Id");
when(attrId.getValueType()).thenReturn(ValueType.LONG);
Attribute attrName = mock(Attribute.class);
when(attrName.getName()).thenReturn("Name");
when(attrName.getValueType()).thenReturn(ValueType.STRING);
EntityType entity = mock(EntityType.class);
when(entity.getSourceName()).thenReturn(sourceName);
when(entity.getName()).thenReturn(name);
when(entity.getAttributes()).thenReturn(Arrays.asList(attrId, attrName));
when(entity.getAttribute("Name")).thenReturn(attrName);
when(entity.getNameAttribute()).thenReturn(attrName);
when(entity.getIDAttribute()).thenReturn(attrId);
when(attrId.getEntityType()).thenReturn(entity);
when(attrName.getEntityType()).thenReturn(entity);
return entity;
}
public static ApplicationContext mockContext() {
ModelManager mm = mockModelManager();
EntityManager em = Mockito.mock(EntityManager.class);
SearchService ss = mock(SearchService.class);
EntityType type = mm.getEntityType(Test.class);
when(ss.listEntityTypes(Mockito.eq(Test.class))).thenReturn(Arrays.asList(type));
when(ss.listSearchableTypes()).thenReturn(Arrays.asList(Test.class));
Record record = new Record(mm.getEntityType(Test.class));
record.addValue(ValueType.STRING.create("Id", "id1"));
record.addValue(ValueType.STRING.create("Name", "Test-Name"));
Result result = new Result();
result.addRecord(record);
when(ss.fetchResults(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Arrays.asList(result));
ApplicationContext context = Mockito.mock(ApplicationContext.class);
when(context.getEntityManager()).thenReturn(Optional.of(em));
when(context.getModelManager()).thenReturn(Optional.of(mm));
when(context.getSearchService()).thenReturn(Optional.of(ss));
return context;
}
public static ModelManager mockModelManager() {
EntityType type = mockEntity("env1", "Test");
ModelManager mm = mock(ModelManager.class);
when(mm.getEntityType(Test.class)).thenReturn(type);
when(mm.getEntityType("Test")).thenReturn(type);
return mm;
}
@org.junit.Test
public void testGetSuggestions() throws Exception {
ApplicationContext context = mockContext();
Record record = new Record(context.getModelManager().get().getEntityType(Test.class));
record.addValue(ValueType.LONG.create("Id", 1L));
record.addValue(ValueType.STRING.create("Name", "Test-Name"));
Result result = new Result();
result.addRecord(record);
Query query = mock(Query.class);
when(query.select(Mockito.any(Attribute.class))).thenReturn(query);
when(query.group(Mockito.any(Attribute.class))).thenReturn(query);
when(query.fetch()).thenReturn(Arrays.asList(result));
org.eclipse.mdm.api.base.query.QueryService qs = mock(org.eclipse.mdm.api.base.query.QueryService.class);
when(qs.createQuery()).thenReturn(query);
when(context.getQueryService()).thenReturn(Optional.of(qs));
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
when(connectorService.getContextByName("env1")).thenReturn(context);
QueryService queryService = new QueryService();
queryService.connectorService = connectorService;
SuggestionRequest request = new SuggestionRequest();
request.setSourceNames(Arrays.asList("env1"));
request.setType("Test");
request.setAttrName("Name");
assertThat(queryService.getSuggestions(request)).contains("Test-Name");
}
}