package org.finra.herd.dao.helper;
import static org.finra.herd.dao.helper.ElasticsearchHelper.RESULT_TYPE_AGGS;
import static org.finra.herd.dao.helper.ElasticsearchHelper.TAGTYPE_NAME_AGGREGATION;
import static org.finra.herd.dao.helper.ElasticsearchHelper.TAG_CODE_AGGREGATION;
import static org.finra.herd.dao.helper.ElasticsearchHelper.TAG_TYPE_FACET_AGGS;
import static org.finra.herd.dao.helper.ElasticsearchHelper.TAG_NAME_AGGREGATION;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.finra.herd.dao.AbstractDaoTest;
import org.finra.herd.model.api.xml.Facet;
import org.finra.herd.model.dto.ElasticsearchResponseDto;
import org.finra.herd.model.dto.ResultTypeIndexSearchResponseDto;
import org.finra.herd.model.dto.TagIndexSearchResponseDto;
import org.finra.herd.model.dto.TagTypeIndexSearchResponseDto;
public class ElasticSearchHelperTest extends AbstractDaoTest
{
public static final String TAG_TYPE_CODE = "Tag Type Code 1";
public static final String TAG_TYPE_CODE_2 = "Tag Type Code 2";
public static final String TAG_TYPE_CODE_3 = "Tag Type Code 3";
public static final String TAG_TYPE_DISPLAY_NAME = "Tag Type DisplayName";
public static final String TAG_TYPE_DISPLAY_NAME_2 = "Tag Type DisplayName 2";
public static final String TAG_TYPE_DISPLAY_NAME_3 = "Tag Type DisplayName 3";
public static final int TAG_TYPE_CODE_COUNT = 1;
public static final int TAG_TYPE_CODE_COUNT_2 = 2;
public static final int TAG_TYPE_CODE_COUNT_3 = 2;
public static final String TAG_CODE = "Tag Code 1";
public static final String TAG_CODE_2 = "Tag Code 2";
public static final int TAG_CODE_COUNT_2 = 1;
public static final int TAG_CODE_COUNT = 1;
public static final String TAG_CODE_DISPLAY_NAME = "Tag Code DisplayName";
public static final String TAG_CODE_DISPLAY_NAME_2 = "Tag Code DisplayName 2";
@Autowired
ElasticsearchHelper elasticSearchHelper;
@Test
public void testGetFacetsResponseWithEmptyResponseDto()
{
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<Facet> facets = elasticSearchHelper.getFacetsResponse(elasticsearchResponseDto, false);
Assert.isTrue(facets.size() == 0 );
facets = elasticSearchHelper.getFacetsResponse(elasticsearchResponseDto, true);
Assert.isTrue(facets.size() == 0 );
}
@Test
public void testGetFacetsResponse()
{
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<TagTypeIndexSearchResponseDto> nestTagTypeIndexSearchResponseDtos = new ArrayList<>();
TagTypeIndexSearchResponseDto tagType1 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, TAG_TYPE_CODE_COUNT, null, TAG_TYPE_DISPLAY_NAME);
TagTypeIndexSearchResponseDto tagType2 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, TAG_TYPE_CODE_COUNT_2, Arrays.asList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
nestTagTypeIndexSearchResponseDtos.add(tagType1);
nestTagTypeIndexSearchResponseDtos.add(tagType2);
elasticsearchResponseDto.setNestTagTypeIndexSearchResponseDtos(nestTagTypeIndexSearchResponseDtos);
List<Facet> facets = elasticSearchHelper.getFacetsResponse(elasticsearchResponseDto, false);
List<Facet> expectedFacets = new ArrayList<>();
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME,(long)TAG_TYPE_CODE_COUNT, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE, new ArrayList<Facet>()));
List<Facet> tagFacet = new ArrayList<>();
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME, (long) TAG_CODE_COUNT, TagIndexSearchResponseDto.getFacetType(), TAG_CODE, null));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_2,(long)TAG_TYPE_CODE_COUNT_2, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE_2, tagFacet));
assertEquals(expectedFacets, facets);
}
@Test
public void testGetFacetsResponseIncludingTag()
{
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<TagTypeIndexSearchResponseDto> nestTagTypeIndexSearchResponseDtos = new ArrayList<>();
TagTypeIndexSearchResponseDto tagType1 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, TAG_TYPE_CODE_COUNT, null, TAG_TYPE_DISPLAY_NAME);
TagTypeIndexSearchResponseDto tagType2 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, TAG_TYPE_CODE_COUNT_2, Arrays.asList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
nestTagTypeIndexSearchResponseDtos.add(tagType1);
nestTagTypeIndexSearchResponseDtos.add(tagType2);
elasticsearchResponseDto.setNestTagTypeIndexSearchResponseDtos(nestTagTypeIndexSearchResponseDtos);
TagTypeIndexSearchResponseDto tagType3 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, TAG_TYPE_CODE_COUNT_2, Arrays.asList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
List<TagTypeIndexSearchResponseDto> tagTypeIndexSearchResponseDtos = new ArrayList<>();
tagTypeIndexSearchResponseDtos.add(tagType3);
elasticsearchResponseDto.setTagTypeIndexSearchResponseDtos(tagTypeIndexSearchResponseDtos);
List<Facet> facets = elasticSearchHelper.getFacetsResponse(elasticsearchResponseDto, false);
List<Facet> expectedFacets = new ArrayList<>();
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME,(long)TAG_TYPE_CODE_COUNT, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE, new ArrayList<Facet>()));
List<Facet> tagFacet = new ArrayList<>();
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME, (long) TAG_CODE_COUNT + 1, TagIndexSearchResponseDto.getFacetType(), TAG_CODE, null));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_2,(long)TAG_TYPE_CODE_COUNT_2, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE_2, tagFacet));
assertEquals(expectedFacets, facets);
}
@Test
public void testGetFacetsResponseIncludingTagWithNoAssociatedBdefs()
{
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<TagTypeIndexSearchResponseDto> nestTagTypeIndexSearchResponseDtos = new ArrayList<>();
TagTypeIndexSearchResponseDto tagType1 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, TAG_TYPE_CODE_COUNT, null, TAG_TYPE_DISPLAY_NAME);
TagTypeIndexSearchResponseDto tagType2 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, TAG_TYPE_CODE_COUNT_2, Arrays.asList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
nestTagTypeIndexSearchResponseDtos.add(tagType1);
nestTagTypeIndexSearchResponseDtos.add(tagType2);
elasticsearchResponseDto.setNestTagTypeIndexSearchResponseDtos(nestTagTypeIndexSearchResponseDtos);
TagTypeIndexSearchResponseDto tagType3 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, TAG_TYPE_CODE_COUNT_2, Arrays.asList(new TagIndexSearchResponseDto(TAG_CODE_2, 1, TAG_CODE_DISPLAY_NAME_2)), TAG_TYPE_DISPLAY_NAME_2);
List<TagTypeIndexSearchResponseDto> tagTypeIndexSearchResponseDtos = new ArrayList<>();
tagTypeIndexSearchResponseDtos.add(tagType3);
elasticsearchResponseDto.setTagTypeIndexSearchResponseDtos(tagTypeIndexSearchResponseDtos);
List<Facet> facets = elasticSearchHelper.getFacetsResponse(elasticsearchResponseDto, false);
List<Facet> expectedFacets = new ArrayList<>();
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME,(long)TAG_TYPE_CODE_COUNT, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE, new ArrayList<Facet>()));
List<Facet> tagFacet = new ArrayList<>();
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME, (long) TAG_CODE_COUNT, TagIndexSearchResponseDto.getFacetType(), TAG_CODE, null));
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME_2, (long) TAG_CODE_COUNT_2, TagIndexSearchResponseDto.getFacetType(), TAG_CODE_2, null));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_2,(long)TAG_TYPE_CODE_COUNT_2, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE_2, tagFacet));
assertEquals(expectedFacets, facets);
}
@Test
public void testGetFacetsResponseIncludingTagWithNoAssociatedBdefsNewTagType()
{
ElasticsearchResponseDto elasticsearchResponseDto = new ElasticsearchResponseDto();
List<TagTypeIndexSearchResponseDto> nestTagTypeIndexSearchResponseDtos = new ArrayList<>();
TagTypeIndexSearchResponseDto tagType1 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, TAG_TYPE_CODE_COUNT, null, TAG_TYPE_DISPLAY_NAME);
TagTypeIndexSearchResponseDto tagType2 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_2, TAG_TYPE_CODE_COUNT_2, Arrays.asList(new TagIndexSearchResponseDto(TAG_CODE, 1, TAG_CODE_DISPLAY_NAME)), TAG_TYPE_DISPLAY_NAME_2);
nestTagTypeIndexSearchResponseDtos.add(tagType1);
nestTagTypeIndexSearchResponseDtos.add(tagType2);
elasticsearchResponseDto.setNestTagTypeIndexSearchResponseDtos(nestTagTypeIndexSearchResponseDtos);
TagTypeIndexSearchResponseDto tagType3 = new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE_3, TAG_TYPE_CODE_COUNT_3, Arrays.asList(new TagIndexSearchResponseDto(TAG_CODE_2, 1, TAG_CODE_DISPLAY_NAME_2)), TAG_TYPE_DISPLAY_NAME_3);
List<TagTypeIndexSearchResponseDto> tagTypeIndexSearchResponseDtos = new ArrayList<>();
tagTypeIndexSearchResponseDtos.add(tagType3);
elasticsearchResponseDto.setTagTypeIndexSearchResponseDtos(tagTypeIndexSearchResponseDtos);
List<Facet> facets = elasticSearchHelper.getFacetsResponse(elasticsearchResponseDto, false);
List<Facet> expectedFacets = new ArrayList<>();
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME,(long)TAG_TYPE_CODE_COUNT, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE, new ArrayList<Facet>()));
List<Facet> tagFacet = new ArrayList<>();
tagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME, (long) TAG_CODE_COUNT, TagIndexSearchResponseDto.getFacetType(), TAG_CODE, null));
List<Facet> newTagFacet = new ArrayList<>();
newTagFacet.add(new Facet(TAG_CODE_DISPLAY_NAME_2, (long) TAG_CODE_COUNT_2, TagIndexSearchResponseDto.getFacetType(), TAG_CODE_2, null));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_2,(long)TAG_TYPE_CODE_COUNT_2, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE_2, tagFacet));
expectedFacets.add(new Facet(TAG_TYPE_DISPLAY_NAME_3,(long)TAG_TYPE_CODE_COUNT_3, TagTypeIndexSearchResponseDto.getFacetType(),TAG_TYPE_CODE_3, newTagFacet));
assertEquals(expectedFacets, facets);
}
@Test
public void testGetResultTypeIndexSearchResponseDto()
{
SearchResponse searchResponse = mock(SearchResponse.class);
Terms terms = mock(Terms.class);
Aggregations aggregations = mock(Aggregations.class);
Terms.Bucket bucket = mock(Terms.Bucket.class);
List<Terms.Bucket> buckets = Arrays.asList(bucket);
when(searchResponse.getAggregations()).thenReturn(aggregations);
when(aggregations.get(RESULT_TYPE_AGGS)).thenReturn(terms);
when(terms.getBuckets()).thenReturn(buckets);
when(bucket.getKeyAsString()).thenReturn(TAG_CODE);
when(bucket.getDocCount()).thenReturn(TAG_COUNT);
List<ResultTypeIndexSearchResponseDto> expectedList = new ArrayList<>();
expectedList.add(new ResultTypeIndexSearchResponseDto(TAG_CODE, TAG_COUNT, TAG_CODE));
List<ResultTypeIndexSearchResponseDto> resultList = elasticSearchHelper.getResultTypeIndexSearchResponseDto(searchResponse);
assertEquals(expectedList, resultList);
}
@Test
public void testAddFacetFieldAggregations()
{
Set<String> facetSet = new HashSet<>();
//it is ok to pass a null search request builder, as empty facet set bypass the processing
elasticSearchHelper.addFacetFieldAggregations(facetSet, null);
}
@Test
public void testGetTagTagIndexSearchResponseDto()
{
SearchResponse searchResponse = mock(SearchResponse.class);
Terms terms = mock(Terms.class);
Aggregations aggregations = mock(Aggregations.class);
Terms.Bucket tagTypeCodeEntry = mock(Terms.Bucket.class);
List<Terms.Bucket> tagTypeCodeEntryList = Arrays.asList(tagTypeCodeEntry);
when(searchResponse.getAggregations()).thenReturn(aggregations);
when(aggregations.get(TAG_TYPE_FACET_AGGS)).thenReturn(terms);
when(terms.getBuckets()).thenReturn(tagTypeCodeEntryList);
when(tagTypeCodeEntry.getKeyAsString()).thenReturn(TAG_TYPE_CODE);
when(tagTypeCodeEntry.getDocCount()).thenReturn((long)TAG_TYPE_CODE_COUNT);
when(tagTypeCodeEntry.getAggregations()).thenReturn(aggregations);
Terms tagTypeDisplayNameAggs = mock(Terms.class);
Terms.Bucket tagTypeDisplayNameEntry = mock(Terms.Bucket.class);
List<Terms.Bucket> tagTypeDisplayNameEntryList = Arrays.asList(tagTypeDisplayNameEntry);
when(aggregations.get(TAGTYPE_NAME_AGGREGATION)).thenReturn(tagTypeDisplayNameAggs);
when(tagTypeDisplayNameEntry.getAggregations()).thenReturn(aggregations);
when(tagTypeDisplayNameAggs.getBuckets()).thenReturn(tagTypeDisplayNameEntryList);
when(tagTypeDisplayNameEntry.getKeyAsString()).thenReturn(TAG_TYPE_DISPLAY_NAME);
Terms tagCodeAggs = mock(Terms.class);
Terms.Bucket tagCodeEntry = mock(Terms.Bucket.class);
List<Terms.Bucket> tagCodeEntryList = Arrays.asList(tagCodeEntry) ;
when(aggregations.get(TAG_CODE_AGGREGATION)).thenReturn(tagCodeAggs);
when(tagCodeAggs.getBuckets()).thenReturn(tagCodeEntryList);
when(tagCodeEntry.getAggregations()).thenReturn(aggregations);
when(tagCodeEntry.getKeyAsString()).thenReturn(TAG_CODE);
when(tagCodeEntry.getDocCount()).thenReturn((long)TAG_CODE_COUNT);
Terms tagNameAggs = mock(Terms.class);
Terms.Bucket tagNameEntry = mock(Terms.Bucket.class);
List<Terms.Bucket> tagNameEntryList = Arrays.asList(tagNameEntry) ;
when(tagNameEntry.getAggregations()).thenReturn(aggregations);
when(aggregations.get(TAG_NAME_AGGREGATION)).thenReturn(tagNameAggs);
when(tagNameAggs.getBuckets()).thenReturn(tagNameEntryList);
when(tagNameEntry.getKeyAsString()).thenReturn(TAG_DISPLAY_NAME);
List<TagTypeIndexSearchResponseDto> resultList = elasticSearchHelper.getTagTagIndexSearchResponseDto(searchResponse);
List<TagTypeIndexSearchResponseDto> expectedList = new ArrayList<>();
List<TagIndexSearchResponseDto> expectedTagList = new ArrayList<>();
expectedTagList.add(new TagIndexSearchResponseDto(TAG_CODE, TAG_CODE_COUNT, TAG_DISPLAY_NAME));
expectedList.add(new TagTypeIndexSearchResponseDto(TAG_TYPE_CODE, TAG_TYPE_CODE_COUNT, expectedTagList, TAG_TYPE_DISPLAY_NAME));
assertEquals(expectedList, resultList);
}
}