package alien4cloud.component.dao;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.mapping.MappingBuilder;
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 alien4cloud.dao.ElasticSearchDAO;
import alien4cloud.dao.IGenericSearchDAO;
import alien4cloud.dao.model.GetMultipleDataResult;
import alien4cloud.exception.IndexingServiceException;
import alien4cloud.model.application.Application;
import alien4cloud.model.common.Tag;
import org.alien4cloud.tosca.model.types.ArtifactType;
import org.alien4cloud.tosca.model.types.CapabilityType;
import org.alien4cloud.tosca.model.types.NodeType;
import org.alien4cloud.tosca.model.types.RelationshipType;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
/**
* Test class for suggestion operation on ElasticSearch
*
* @author 'Igor Ngouagna'
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application-context-test.xml")
@Slf4j
public class EsDaoSuggestionTest extends AbstractDAOTest {
private static final String APPLICATION_INDEX = Application.class.getSimpleName().toLowerCase();
private static final String FETCH_CONTEXT = "tag_suggestion";
private static final String TAG_NAME_PATH = "tags.name";
private final ObjectMapper jsonMapper = new ObjectMapper();
@Resource(name = "alien-es-dao")
IGenericSearchDAO dao;
List<NodeType> dataTest = new ArrayList<>();
NodeType indexedNodeTypeTest = null;
NodeType indexedNodeTypeTest2 = null;
NodeType indexedNodeTypeTest3 = null;
NodeType indexedNodeTypeTest4 = null;
private List<Tag> Tags1 = Lists.newArrayList(new Tag("icon", "my-icon.png"), new Tag("potatoe", "patate"), new Tag("potatoe_version", "version de patate"));
private List<Tag> Tags2 = Lists.newArrayList(new Tag("icon", "my-icon.png"), new Tag("version", "My free tag with my free content (tag-0)"), new Tag(
"version_1", "Tag2 content"));
private List<Tag> Tags3 = Lists.newArrayList(new Tag("icon", "my-icon.png"), new Tag("version", "My free tag with my free content (tag-0)"), new Tag(
"version_1", "Tag2 content"), new Tag("potatoe", "patate"), new Tag("potatoe_version", "de patate"));
@Before
public void before() throws Exception {
super.before();
prepareToscaElement();
saveDataToES(true);
}
@Test
public void simpleSearchTest() throws IndexingServiceException, InterruptedException, IOException {
String searchText = "ver";
GetMultipleDataResult searchResp = dao.suggestSearch(new String[] { APPLICATION_INDEX, ElasticSearchDAO.TOSCA_ELEMENT_INDEX }, new Class<?>[] {
Application.class, NodeType.class, ArtifactType.class, CapabilityType.class, RelationshipType.class },
TAG_NAME_PATH, searchText, FETCH_CONTEXT, 0, 10);
System.out.println(searchResp.getData().length);
assertNotNull(searchResp);
assertNotNull(searchResp.getTypes());
assertNotNull(searchResp.getData());
assertEquals(2, searchResp.getTypes().length);
assertEquals(2, searchResp.getData().length);
assertElementIn("nodetype", searchResp.getTypes());
}
private void assertElementIn(Object element, Object[] elements) {
assertTrue(Arrays.asList(elements).contains(element));
}
private void prepareToscaElement() {
indexedNodeTypeTest = TestModelUtil.createIndexedNodeType("1", "positive", "1.0", "", null, null, null, null, Tags1, new Date(), new Date());
dataTest.add(indexedNodeTypeTest);
indexedNodeTypeTest2 = TestModelUtil.createIndexedNodeType("2", "pokerFace", "1.0", "", null, null, null, null, Tags2, new Date(), new Date());
dataTest.add(indexedNodeTypeTest2);
indexedNodeTypeTest3 = TestModelUtil.createIndexedNodeType("3", "positive5", "1.5", "", null, null, null, null, Tags3, new Date(), new Date());
dataTest.add(indexedNodeTypeTest3);
indexedNodeTypeTest4 = TestModelUtil.createIndexedNodeType("4", "pakerFace", "2.0", "", null, null, null, null, null, new Date(), new Date());
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();
assertDocumentExisit(ElasticSearchDAO.TOSCA_ELEMENT_INDEX, typeName, datum.getId(), true);
}
refresh();
}
private void assertDocumentExisit(String indexName, String typeName, String id, boolean expected) {
GetResponse response = getDocument(indexName, typeName, id);
assertEquals(expected, response.isExists());
assertEquals(expected, !response.isSourceEmpty());
}
private GetResponse getDocument(String indexName, String typeName, String id) {
return nodeClient.prepareGet(indexName, typeName, id).execute().actionGet();
}
}