package alien4cloud.rest.component;
import static org.junit.Assert.*;
import java.util.*;
import javax.annotation.Resource;
import alien4cloud.common.AlienConstants;
import org.alien4cloud.tosca.model.definitions.CapabilityDefinition;
import org.alien4cloud.tosca.model.definitions.RequirementDefinition;
import org.alien4cloud.tosca.model.types.AbstractToscaType;
import org.alien4cloud.tosca.model.types.NodeType;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.mapping.ElasticSearchClient;
import org.elasticsearch.mapping.MappingBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import alien4cloud.dao.ElasticSearchDAO;
import alien4cloud.dao.IGenericSearchDAO;
import alien4cloud.dao.model.FacetedSearchResult;
import alien4cloud.rest.model.RestResponse;
import lombok.extern.slf4j.Slf4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application-context-search-test.xml")
@Slf4j
public class SearchTest {
private final ObjectMapper jsonMapper = new ObjectMapper();
@Resource
ElasticSearchClient esclient;
Client nodeClient;
@Resource(name = "alien-es-dao")
IGenericSearchDAO dao;
@Resource
ComponentController componentController;
List<NodeType> dataTest = new ArrayList<>();
NodeType indexedNodeTypeTest = null;
NodeType indexedNodeTypeTest2 = null;
NodeType indexedNodeTypeTest3 = null;
NodeType indexedNodeTypeTest4 = null;
private static final int NUMBER_ELEMENT = 10;
@Before
public void before() throws JsonProcessingException, InterruptedException {
nodeClient = esclient.getClient();
prepareToscaElement();
saveDataToES(true);
}
@Test
public void searchPostTest() {
String query = "positive";
RestResponse<FacetedSearchResult<? extends AbstractToscaType>> response;
SearchRequest req;
FacetedSearchResult data;
String[] ids;
// without filters
req = new SearchRequest(QueryComponentType.NODE_TYPE, query, 0, NUMBER_ELEMENT, null);
response = componentController.search(req);
assertNotNull(response);
assertNotNull(response.getData());
assertNull(response.getError());
data = response.getData();
assertEquals(2, data.getTotalResults());
assertEquals(2, data.getTypes().length);
assertEquals(2, data.getData().length);
ids = new String[] { indexedNodeTypeTest.getId(), indexedNodeTypeTest4.getId() };
for (int i = 0; i < data.getData().length; i++) {
NodeType idnt = (NodeType) data.getData()[i];
assertElementIn(idnt.getId(), ids);
}
// filter based test
Map<String, String[]> filters = new HashMap<String, String[]>();
filters.put("capabilities.type", new String[] { "container", "banana" });
req = new SearchRequest(QueryComponentType.NODE_TYPE, query, 0, NUMBER_ELEMENT, filters);
response = componentController.search(req);
assertNotNull(response);
assertNotNull(response.getData());
assertNull(response.getError());
data = response.getData();
assertEquals(1, data.getTotalResults());
assertEquals(1, data.getTypes().length);
assertEquals(1, data.getData().length);
NodeType idnt = (NodeType) data.getData()[0];
assertElementIn(idnt.getId(), new String[] { indexedNodeTypeTest.getId() });
// test nothing found
query = "pacpac";
req = new SearchRequest(QueryComponentType.NODE_TYPE, query, 0, NUMBER_ELEMENT, null);
response = componentController.search(req);
assertNotNull(response);
assertNotNull(response.getData());
assertNull(response.getError());
data = response.getData();
assertNotNull(data.getTypes());
assertEquals(0, data.getTotalResults());
assertEquals(0, data.getData().length);
assertEquals(0, data.getTypes().length);
}
private void prepareToscaElement() {
List<CapabilityDefinition> capa = Lists.newArrayList(new CapabilityDefinition("container", "container", 1),
new CapabilityDefinition("container1", "container1", 1), new CapabilityDefinition("container2", "container2", 1),
new CapabilityDefinition("container3", "container3", 1), new CapabilityDefinition("war", "war", 1));
List<RequirementDefinition> req = Lists.newArrayList(new RequirementDefinition("Runtime", "Runtime"), new RequirementDefinition("server", "server"),
new RequirementDefinition("blob", "blob"));
List<String> der = Lists.newArrayList("Parent1", "Parent2");
indexedNodeTypeTest = createIndexedNodeType("1", "positive", "1.0", "", capa, req, der, new ArrayList<String>());
indexedNodeTypeTest.setId("1");
dataTest.add(indexedNodeTypeTest);
capa = Lists.newArrayList(new CapabilityDefinition("banana", "banana", 1), new CapabilityDefinition("banana1", "banana1", 1),
new CapabilityDefinition("container", "container", 1), new CapabilityDefinition("banana3", "banana3", 1),
new CapabilityDefinition("zar", "zar", 1));
req = Lists.newArrayList(new RequirementDefinition("Pant", "Pant"), new RequirementDefinition("DBZ", "DBZ"),
new RequirementDefinition("Animes", "Animes"));
der = Lists.newArrayList("Songoku", "Kami");
indexedNodeTypeTest2 = createIndexedNodeType("2", "pokerFace", "1.0", "", capa, req, der, new ArrayList<String>());
dataTest.add(indexedNodeTypeTest2);
capa = Lists.newArrayList(new CapabilityDefinition("potatoe", "potatoe", 1), new CapabilityDefinition("potatoe2", "potatoe2", 1),
new CapabilityDefinition("potatoe3", "potatoe3", 1), new CapabilityDefinition("potatoe4", "potatoe4", 1),
new CapabilityDefinition("zor", "zor", 1));
req = Lists.newArrayList(new RequirementDefinition("OnePiece", "OnePiece"), new RequirementDefinition("beelzebub", "beelzebub"),
new RequirementDefinition("DBGT", "DBGT"));
der = Lists.newArrayList("Jerome", "Sandrini");
indexedNodeTypeTest3 = createIndexedNodeType("3", "nagative", "1.5", "", capa, req, der, new ArrayList<String>());
dataTest.add(indexedNodeTypeTest3);
capa = Lists.newArrayList(new CapabilityDefinition("yams", "yams", 1), new CapabilityDefinition("yams1", "yams1", 1),
new CapabilityDefinition("positiveYes", "positiveYes", 1), new CapabilityDefinition("yams3", "yams3", 1),
new CapabilityDefinition("war world", "war world", 1));
req = Lists.newArrayList(new RequirementDefinition("Naruto", "Naruto"), new RequirementDefinition("FT", "FT"),
new RequirementDefinition("Bleach", "Bleach"));
der = Lists.newArrayList("Luc", "Boutier");
indexedNodeTypeTest4 = createIndexedNodeType("4", "pokerFace", "2.0", "", capa, req, der, new ArrayList<String>());
dataTest.add(indexedNodeTypeTest4);
}
private void saveDataToES(boolean refresh) throws JsonProcessingException {
for (NodeType datum : dataTest) {
String json = jsonMapper.writeValueAsString(datum);
String typeName = MappingBuilder.indexTypeFromClass(datum.getClass());
nodeClient.prepareIndex(ElasticSearchDAO.TOSCA_ELEMENT_INDEX, typeName).setSource(json).setRefresh(refresh).execute().actionGet();
}
}
private void clearIndex(String indexName, Class<?> clazz) throws InterruptedException {
String typeName = clazz.getSimpleName();
log.info("Cleaning ES Index " + ElasticSearchDAO.TOSCA_ELEMENT_INDEX + " and type " + typeName);
nodeClient.prepareDeleteByQuery(indexName).setQuery(QueryBuilders.matchAllQuery()).setTypes(typeName).execute().actionGet();
}
private void assertElementIn(String element, String[] elements) {
assertTrue(Arrays.asList(elements).contains(element));
}
@After
public void cleanup() throws InterruptedException {
clearIndex(ElasticSearchDAO.TOSCA_ELEMENT_INDEX, NodeType.class);
}
private static NodeType createIndexedNodeType(String id, String archiveName, String archiveVersion, String description,
List<CapabilityDefinition> capabilities, List<RequirementDefinition> requirements, List<String> derivedFroms, List<String> defaultCapabilities) {
NodeType nodeType = new NodeType();
nodeType.setElementId(id);
nodeType.setArchiveName(archiveName);
nodeType.setArchiveVersion(archiveVersion);
nodeType.setWorkspace(AlienConstants.GLOBAL_WORKSPACE_ID);
nodeType.setCapabilities(capabilities);
nodeType.setDescription(description);
nodeType.setDefaultCapabilities(defaultCapabilities);
nodeType.setRequirements(requirements);
nodeType.setDerivedFrom(derivedFroms);
return nodeType;
}
}