blob: 7be6ef8c568471dd5171724f5c0a12a2ab62d17f [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.businessobjects.control.search;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.Mockito.when;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import org.eclipse.mdm.api.base.adapter.Attribute;
import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.adapter.EntityType;
import org.eclipse.mdm.api.base.adapter.ModelManager;
import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.base.model.EnumRegistry;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.model.Value;
import org.eclipse.mdm.api.base.model.ValueType;
import org.eclipse.mdm.api.base.query.Filter;
import org.eclipse.mdm.api.base.search.SearchService;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
public class SearchMockHelper {
public static final int ITEM_COUNT = 27;
private SearchMockHelper() {
}
public static ApplicationContext createContextMock() throws Exception {
ApplicationContext context = Mockito.mock(ApplicationContext.class);
List<EntityType> etResultMock = createETListMock();
Optional<SearchService> mockedSearchService = createSearchServiceMock(etResultMock);
when(context.getSearchService()).thenReturn(mockedSearchService);
Optional<ModelManager> mockedModelManager = createModelManagerMock(etResultMock);
when(context.getModelManager()).thenReturn(mockedModelManager);
return context;
}
public static Optional<ModelManager> createModelManagerMock(List<EntityType> etResultMock) {
ModelManager modelManager = Mockito.mock(ModelManager.class);
when(modelManager.getEntityType("Test")).thenReturn(etResultMock.get(0));
when(modelManager.getEntityType("TestStep")).thenReturn(etResultMock.get(1));
when(modelManager.getEntityType("Measurement")).thenReturn(etResultMock.get(2));
return Optional.of(modelManager);
}
public static Optional<SearchService> createSearchServiceMock(List<EntityType> etResultMock) throws Exception {
SearchService searchService = Mockito.mock(SearchService.class);
when(searchService.listEntityTypes(TestStep.class)).thenReturn(etResultMock);
List<Attribute> attrList = new ArrayList<>();
attrList.add(Mockito.mock(Attribute.class));
List<Entity> mockedSearchResult = createMockedSearchRes(TestStep.class, "TestStep");
when(searchService.fetch(any(), anyList(), any(Filter.class))).thenReturn(mockedSearchResult);
return Optional.of(searchService);
}
public static <T extends Entity> List<Entity> createMockedSearchRes(Class<T> clazz, String entityTypeName)
throws Exception {
List<Entity> mockedRes = new ArrayList<>();
for (int i = 1; i <= ITEM_COUNT; i++) {
T etMock = createEntityMock(clazz, entityTypeName + "_" + i, "Environment", Integer.toString(i));
mockedRes.add(etMock);
}
return mockedRes;
}
public static List<EntityType> createETListMock() {
List<EntityType> mockedEntityList = new ArrayList<>();
EntityType mockedETTest = createEntityTypeMock("Test");
EntityType mockedETTestStep = createEntityTypeMock("TestStep");
EntityType mockedETMeasurement = createEntityTypeMock("Measurement");
mockedEntityList.add(mockedETTest);
mockedEntityList.add(mockedETTestStep);
mockedEntityList.add(mockedETMeasurement);
return mockedEntityList;
}
private static EntityType createEntityTypeMock(String entityName) {
EntityType mockedETTest = Mockito.mock(EntityType.class);
List<Attribute> mockedAttributes = new ArrayList<>();
// Initialize enums or else ValueType.name() returns null
EnumRegistry.getInstance();
mockedAttributes.add(createAttributeMock(mockedETTest, "Name", ValueType.STRING));
mockedAttributes.add(createAttributeMock(mockedETTest, "DateAttribute", ValueType.DATE));
mockedAttributes.add(createAttributeMock(mockedETTest, "BooleanAttribute", ValueType.BOOLEAN));
mockedAttributes.add(createAttributeMock(mockedETTest, "ByteAttribute", ValueType.BYTE));
mockedAttributes.add(createAttributeMock(mockedETTest, "ShortAttribute", ValueType.SHORT));
mockedAttributes.add(createAttributeMock(mockedETTest, "IntegerAttribute", ValueType.INTEGER));
mockedAttributes.add(createAttributeMock(mockedETTest, "LongAttribute", ValueType.LONG));
mockedAttributes.add(createAttributeMock(mockedETTest, "FloatAttribute", ValueType.FLOAT));
mockedAttributes.add(createAttributeMock(mockedETTest, "DoubleAttribute", ValueType.DOUBLE));
when(mockedETTest.getName()).thenReturn(entityName);
when(mockedETTest.getAttributes()).thenReturn(mockedAttributes);
when(mockedETTest.getAttribute(any())).thenAnswer((InvocationOnMock invocation) -> (Attribute) mockedAttributes
.stream().filter(a -> a.getName().equals(invocation.getArgument(0))).findAny().get());
return mockedETTest;
}
private static Attribute createAttributeMock(EntityType entity, String attributeName, ValueType<?> valueType) {
Attribute attributeMock = Mockito.mock(Attribute.class);
when(attributeMock.getName()).thenReturn(attributeName);
when(attributeMock.getValueType()).thenReturn(valueType);
when(attributeMock.createValue(any())).thenCallRealMethod();
when(attributeMock.createValue(any(), any())).thenCallRealMethod();
when(attributeMock.createValue(any(), anyBoolean(), any())).thenCallRealMethod();
when(attributeMock.createValueSeq(any(), any())).thenCallRealMethod();
when(attributeMock.getEntityType()).thenReturn(entity);
return attributeMock;
}
private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id)
throws Exception {
HashMap<String, Value> map = new HashMap<String, Value>();
map.put("Name", ValueType.STRING.create("Name", name));
Core core = Mockito.mock(Core.class);
when(core.getSourceName()).thenReturn(sourceName);
when(core.getValues()).thenReturn(map);
when(core.getID()).thenReturn(id);
Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
constructor.setAccessible(true);
T instance = constructor.newInstance(core);
constructor.setAccessible(false);
return instance;
}
}