package org.finra.herd.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.springframework.util.Assert;
import org.finra.herd.model.api.xml.AttributeValueFilter;
import org.finra.herd.model.api.xml.BusinessObjectData;
import org.finra.herd.model.api.xml.BusinessObjectDataSearchFilter;
import org.finra.herd.model.api.xml.BusinessObjectDataSearchKey;
import org.finra.herd.model.api.xml.BusinessObjectDataSearchRequest;
import org.finra.herd.model.api.xml.BusinessObjectDataSearchResult;
import org.finra.herd.model.api.xml.LatestAfterPartitionValue;
import org.finra.herd.model.api.xml.LatestBeforePartitionValue;
import org.finra.herd.model.api.xml.PartitionValueFilter;
/**
* Test Business Object Data Search service
*/
public class BusinessObjectDataSearchServiceTest extends AbstractServiceTest
{
@Test
public void testSearchBusinessObjectData()
{
businessObjectDataServiceTestHelper.createDatabaseEntitiesForBusinessObjectDataSearchTesting();
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest();
List<BusinessObjectDataSearchFilter> filters = new ArrayList<>();
List<BusinessObjectDataSearchKey> businessObjectDataSearchKeys = new ArrayList<>();
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace(NAMESPACE);
key.setBusinessObjectDefinitionName(BDEF_NAME);
businessObjectDataSearchKeys.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(businessObjectDataSearchKeys);
filters.add(filter);
request.setBusinessObjectDataSearchFilters(filters);
BusinessObjectDataSearchResult result = this.businessObjectDataService.searchBusinessObjectData(request);
Assert.isTrue(result.getBusinessObjectDataElements().size() == 2);
for (BusinessObjectData data : result.getBusinessObjectDataElements())
{
Assert.isTrue(NAMESPACE.equals(data.getNamespace()));
Assert.isTrue(BDEF_NAME.equals(data.getBusinessObjectDefinitionName()));
}
}
@Test
public void testSearchBusinessObjectDataWithPartitionFilterValues()
{
businessObjectDataServiceTestHelper.createDatabaseEntitiesForBusinessObjectDataSearchTesting();
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest();
List<BusinessObjectDataSearchFilter> filters = new ArrayList<>();
List<BusinessObjectDataSearchKey> businessObjectDataSearchKeys = new ArrayList<>();
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace(NAMESPACE);
key.setBusinessObjectDefinitionName(BDEF_NAME);
List<PartitionValueFilter> partitionValueFilters = new ArrayList<PartitionValueFilter>();
PartitionValueFilter partitionValueFilter = new PartitionValueFilter();
partitionValueFilters.add(partitionValueFilter);
partitionValueFilter.setPartitionKey(PARTITION_KEY);
List<String> values = new ArrayList<String>();
values.add(PARTITION_VALUE);
partitionValueFilter.setPartitionValues(values);
key.setPartitionValueFilters(partitionValueFilters);
businessObjectDataSearchKeys.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(businessObjectDataSearchKeys);
filters.add(filter);
request.setBusinessObjectDataSearchFilters(filters);
BusinessObjectDataSearchResult result = this.businessObjectDataService.searchBusinessObjectData(request);
//this should be zero, as no schema column is registered
Assert.isTrue(result.getBusinessObjectDataElements().size() == 0);
}
@Test
public void testSearchBusinessObjectDataWithPartitionFilterBadRequest()
{
businessObjectDataServiceTestHelper.createDatabaseEntitiesForBusinessObjectDataSearchTesting();
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest();
List<BusinessObjectDataSearchFilter> filters = new ArrayList<>();
List<BusinessObjectDataSearchKey> businessObjectDataSearchKeys = new ArrayList<>();
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace(NAMESPACE);
key.setBusinessObjectDefinitionName(BDEF_NAME);
List<PartitionValueFilter> partitionValueFilters = new ArrayList<PartitionValueFilter>();
PartitionValueFilter partitionValueFilter = new PartitionValueFilter();
partitionValueFilters.add(partitionValueFilter);
partitionValueFilter.setLatestAfterPartitionValue(new LatestAfterPartitionValue("A"));
partitionValueFilter.setLatestBeforePartitionValue(new LatestBeforePartitionValue("B"));
key.setPartitionValueFilters(partitionValueFilters);
businessObjectDataSearchKeys.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(businessObjectDataSearchKeys);
filters.add(filter);
request.setBusinessObjectDataSearchFilters(filters);
try
{
businessObjectDataService.searchBusinessObjectData(request);
fail("Should not get here, as IllegalArgumentException should be thrown");
}
catch (IllegalArgumentException ex)
{
}
}
@Test
public void testSearchBusinessObjectDataWithAttributeFilterBadRequest()
{
businessObjectDataServiceTestHelper.createDatabaseEntitiesForBusinessObjectDataSearchTesting();
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest();
List<BusinessObjectDataSearchFilter> filters = new ArrayList<>();
List<BusinessObjectDataSearchKey> businessObjectDataSearchKeys = new ArrayList<>();
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace(NAMESPACE);
key.setBusinessObjectDefinitionName(BDEF_NAME);
List<AttributeValueFilter> attributeValueFilters = new ArrayList<>();
//null attribute name and value
attributeValueFilters.add(new AttributeValueFilter(null, null));
key.setAttributeValueFilters(attributeValueFilters);
businessObjectDataSearchKeys.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(businessObjectDataSearchKeys);
filters.add(filter);
request.setBusinessObjectDataSearchFilters(filters);
try
{
businessObjectDataService.searchBusinessObjectData(request);
fail("Should not get here, as IllegalArgumentException should be thrown");
}
catch (IllegalArgumentException ex)
{
assertEquals("Either attribute name or value filter must exist.", ex.getMessage());
}
//empty attribute name and null attribute value
attributeValueFilters = new ArrayList<>();
attributeValueFilters.add(new AttributeValueFilter(" ", null));
key.setAttributeValueFilters(attributeValueFilters);
try
{
businessObjectDataService.searchBusinessObjectData(request);
fail("Should not get here, as IllegalArgumentException should be thrown");
}
catch (IllegalArgumentException ex)
{
assertEquals("Either attribute name or value filter must exist.", ex.getMessage());
}
//empty attribute name and empty attribute value
attributeValueFilters = new ArrayList<>();
attributeValueFilters.add(new AttributeValueFilter(" ", ""));
key.setAttributeValueFilters(attributeValueFilters);
try
{
businessObjectDataService.searchBusinessObjectData(request);
fail("Should not get here, as IllegalArgumentException should be thrown");
}
catch (IllegalArgumentException ex)
{
assertEquals("Either attribute name or value filter must exist.", ex.getMessage());
}
}
@Test
public void testSearchBusinessObjectDataWithAttributeFilterValues()
{
businessObjectDataServiceTestHelper.createDatabaseEntitiesForBusinessObjectDataSearchTesting();
businessObjectDataAttributeDaoTestHelper
.createBusinessObjectDataAttributeEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE,
null, DATA_VERSION, ATTRIBUTE_NAME_1_MIXED_CASE, ATTRIBUTE_VALUE_1);
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest();
List<BusinessObjectDataSearchFilter> filters = new ArrayList<>();
List<BusinessObjectDataSearchKey> businessObjectDataSearchKeys = new ArrayList<>();
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace(NAMESPACE);
key.setBusinessObjectDefinitionName(BDEF_NAME);
List<AttributeValueFilter> attributeValueFilters = new ArrayList<>();
attributeValueFilters.add(new AttributeValueFilter(ATTRIBUTE_NAME_1_MIXED_CASE, ATTRIBUTE_VALUE_1));
key.setAttributeValueFilters(attributeValueFilters);
businessObjectDataSearchKeys.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(businessObjectDataSearchKeys);
filters.add(filter);
request.setBusinessObjectDataSearchFilters(filters);
BusinessObjectDataSearchResult result = this.businessObjectDataService.searchBusinessObjectData(request);
List<BusinessObjectData> resultList = result.getBusinessObjectDataElements();
assertEquals(1, resultList.size());
for (BusinessObjectData data : resultList)
{
Assert.isTrue(NAMESPACE.equals(data.getNamespace()));
Assert.isTrue(BDEF_NAME.equals(data.getBusinessObjectDefinitionName()));
Assert.isTrue(ATTRIBUTE_NAME_1_MIXED_CASE.equals(data.getAttributes().get(0).getName()));
Assert.isTrue(ATTRIBUTE_VALUE_1.equals(data.getAttributes().get(0).getValue()));
}
}
@Test
public void testSearchBusinessObjectDataWithAttributeFilterValuesWithMixedCaseAndSpace()
{
businessObjectDataServiceTestHelper.createDatabaseEntitiesForBusinessObjectDataSearchTesting();
businessObjectDataAttributeDaoTestHelper
.createBusinessObjectDataAttributeEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE,
null, DATA_VERSION, ATTRIBUTE_NAME_1_MIXED_CASE, ATTRIBUTE_VALUE_1);
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest();
List<BusinessObjectDataSearchFilter> filters = new ArrayList<>();
List<BusinessObjectDataSearchKey> businessObjectDataSearchKeys = new ArrayList<>();
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace(NAMESPACE);
key.setBusinessObjectDefinitionName(BDEF_NAME);
List<AttributeValueFilter> attributeValueFilters = new ArrayList<>();
attributeValueFilters.add(new AttributeValueFilter(" " + ATTRIBUTE_NAME_1_MIXED_CASE.toLowerCase() + " ", ATTRIBUTE_VALUE_1));
key.setAttributeValueFilters(attributeValueFilters);
businessObjectDataSearchKeys.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(businessObjectDataSearchKeys);
filters.add(filter);
request.setBusinessObjectDataSearchFilters(filters);
BusinessObjectDataSearchResult result = this.businessObjectDataService.searchBusinessObjectData(request);
List<BusinessObjectData> resultList = result.getBusinessObjectDataElements();
assertEquals(1, resultList.size());
for (BusinessObjectData data : resultList)
{
Assert.isTrue(NAMESPACE.equals(data.getNamespace()));
Assert.isTrue(BDEF_NAME.equals(data.getBusinessObjectDefinitionName()));
Assert.isTrue(ATTRIBUTE_NAME_1_MIXED_CASE.equals(data.getAttributes().get(0).getName()));
Assert.isTrue(ATTRIBUTE_VALUE_1.equals(data.getAttributes().get(0).getValue()));
}
}
@Test
public void testSearchBusinessObjectDataWithAttributeFilterValuesWithMultipleFilters()
{
businessObjectDataServiceTestHelper.createDatabaseEntitiesForBusinessObjectDataSearchTesting();
businessObjectDataAttributeDaoTestHelper
.createBusinessObjectDataAttributeEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE,
null, DATA_VERSION, ATTRIBUTE_NAME_1_MIXED_CASE, ATTRIBUTE_VALUE_1);
businessObjectDataAttributeDaoTestHelper
.createBusinessObjectDataAttributeEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE,
null, DATA_VERSION, ATTRIBUTE_NAME_2_MIXED_CASE, ATTRIBUTE_VALUE_2);
businessObjectDataAttributeDaoTestHelper
.createBusinessObjectDataAttributeEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE,
null, DATA_VERSION, ATTRIBUTE_NAME_3_MIXED_CASE, ATTRIBUTE_VALUE_3);
businessObjectDataAttributeDaoTestHelper
.createBusinessObjectDataAttributeEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE_2, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE,
null, DATA_VERSION, ATTRIBUTE_NAME_1_MIXED_CASE, ATTRIBUTE_VALUE_1);
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest();
List<BusinessObjectDataSearchFilter> filters = new ArrayList<>();
List<BusinessObjectDataSearchKey> businessObjectDataSearchKeys = new ArrayList<>();
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace(NAMESPACE);
key.setBusinessObjectDefinitionName(BDEF_NAME);
List<AttributeValueFilter> attributeValueFilters = new ArrayList<>();
attributeValueFilters.add(new AttributeValueFilter(ATTRIBUTE_NAME_1_MIXED_CASE, ATTRIBUTE_VALUE_1));
attributeValueFilters.add(new AttributeValueFilter(ATTRIBUTE_NAME_2_MIXED_CASE, null));
key.setAttributeValueFilters(attributeValueFilters);
businessObjectDataSearchKeys.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(businessObjectDataSearchKeys);
filters.add(filter);
request.setBusinessObjectDataSearchFilters(filters);
BusinessObjectDataSearchResult result = this.businessObjectDataService.searchBusinessObjectData(request);
List<BusinessObjectData> resultList = result.getBusinessObjectDataElements();
assertEquals(1, resultList.size());
for (BusinessObjectData data : resultList)
{
Assert.isTrue(NAMESPACE.equals(data.getNamespace()));
Assert.isTrue(BDEF_NAME.equals(data.getBusinessObjectDefinitionName()));
assertEquals(2, data.getAttributes().size());
boolean foundCase1 = false, foundCase2 = false;
for (int i = 0; i < data.getAttributes().size(); i++)
{
if (ATTRIBUTE_NAME_1_MIXED_CASE.equals(data.getAttributes().get(i).getName()))
{
assertEquals(ATTRIBUTE_VALUE_1, data.getAttributes().get(i).getValue());
foundCase1 = true;
}
if (ATTRIBUTE_NAME_2_MIXED_CASE.equals(data.getAttributes().get(i).getName()))
{
assertEquals(ATTRIBUTE_VALUE_2, data.getAttributes().get(i).getValue());
foundCase2 = true;
}
}
assertTrue(foundCase1 && foundCase2);
}
}
}