package org.finra.herd.service.helper;
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.BusinessObjectDataSearchFilter;
import org.finra.herd.model.api.xml.BusinessObjectDataSearchKey;
import org.finra.herd.model.api.xml.BusinessObjectDataSearchRequest;
import org.finra.herd.model.api.xml.LatestAfterPartitionValue;
import org.finra.herd.model.api.xml.PartitionValueFilter;
import org.finra.herd.service.AbstractServiceTest;
public class BusinessObjectDataSearchHelperTest extends AbstractServiceTest
{
@Test
public void testValidateBusinessObjectDataSearchRequestFilterNegative()
{
BusinessObjectDataSearchRequest request = null;
handleExpectedExceptionValidateSearchRequest(request, "Null BusinessObjectDataSearchRequest should fail!");
request = new BusinessObjectDataSearchRequest();
handleExpectedExceptionValidateSearchRequest(request, "Empty BusinessObjectDataSearchRequest should fail");
List<BusinessObjectDataSearchFilter> businessObjectDataSearchFilters = new ArrayList<>();
request = new BusinessObjectDataSearchRequest();
request.setBusinessObjectDataSearchFilters(businessObjectDataSearchFilters);
handleExpectedExceptionValidateSearchRequest(request, "No BusinessObjectDataSearchFilter should fail");
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter();
businessObjectDataSearchFilters.add(filter);
request = new BusinessObjectDataSearchRequest();
request.setBusinessObjectDataSearchFilters(businessObjectDataSearchFilters);
handleExpectedExceptionValidateSearchRequest(request, "One filter with no namespace, defination name should fail!");
BusinessObjectDataSearchFilter filter2 = new BusinessObjectDataSearchFilter();
businessObjectDataSearchFilters.add(filter2);
request = new BusinessObjectDataSearchRequest();
request.setBusinessObjectDataSearchFilters(businessObjectDataSearchFilters);
handleExpectedExceptionValidateSearchRequest(request, "two filters should fail!");
}
@Test
public void testValidateBusinessObjectDataSearchRequestFilterTwoKeys()
{
// one filter, two keys
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
BusinessObjectDataSearchKey key2 = new BusinessObjectDataSearchKey();
List<BusinessObjectDataSearchKey> keyList = new ArrayList<>();
keyList.add(key);
keyList.add(key2);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(keyList);
List<BusinessObjectDataSearchFilter> filterList = new ArrayList<>();
filterList.add(filter);
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest(filterList);
handleExpectedExceptionValidateSearchRequest(request, "One fileter with two business data search key should fail");
}
@Test
public void testValidateBusinessObjectDataSearchRequestKeyNegative()
{
BusinessObjectDataSearchKey key = null;
handleExpectedExceptionValidateSearchRequestKey(key, "A business object data key must be specified.");
key = new BusinessObjectDataSearchKey();
key.setNamespace(null);
handleExpectedExceptionValidateSearchRequestKey(key, "A namespace must be specified.");
key.setNamespace("SOME NAMESPACE");
key.setBusinessObjectDefinitionName(null);
handleExpectedExceptionValidateSearchRequestKey(key, "A business object definition name must be specified.");
}
@Test
public void testValidateBusinessObjectDataSearchRequestKeyBadFilter()
{
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace("NAMESPACE");
key.setBusinessObjectDefinitionName("DEF");
PartitionValueFilter filter = new PartitionValueFilter();
List<PartitionValueFilter> partitionValueFilters = new ArrayList<>();
partitionValueFilters.add(filter);
key.setPartitionValueFilters(partitionValueFilters);
filter.setLatestAfterPartitionValue(new LatestAfterPartitionValue("NA"));
filter.setPartitionKey("NA");
handleExpectedExceptionValidateSearchRequestKey(key, "Only partition values or partition range are supported in partition value filters.");
}
@Test
public void testValidateBusinessObjectDataSearchRequestKeyPositiveWithRequiredFieldsOnly()
{
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
try
{
key.setNamespace("NAMESPACE");
key.setBusinessObjectDefinitionName("DEF");
businessObjectDataSearchHelper.validateBusinessObjectDataKey(key);
}
catch (IllegalArgumentException ex)
{
// catch Exception as expected
fail("No exception should be thrown, but got " + ex.getMessage());
}
}
@Test
public void testValidateBusinessObjectDataSearchRequestKeyPositive()
{
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
try
{
key.setNamespace("NAMESPACE");
key.setBusinessObjectDefinitionName("DEF");
key.setBusinessObjectFormatFileType("BIZ");
key.setBusinessObjectFormatUsage("PRC");
key.setBusinessObjectFormatVersion(0);
businessObjectDataSearchHelper.validateBusinessObjectDataKey(key);
//empty partition value filters
key.setPartitionValueFilters(new ArrayList<PartitionValueFilter>());
businessObjectDataSearchHelper.validateBusinessObjectDataKey(key);
}
catch (IllegalArgumentException ex)
{
// catch Exception as expected
fail("No exception should be thrown, but got " + ex.getMessage());
}
}
@Test
public void testValidateBusinessObjectDataSearchRequestPositive()
{
BusinessObjectDataSearchKey key = new BusinessObjectDataSearchKey();
key.setNamespace("NAMESPACE");
key.setBusinessObjectDefinitionName("DEF");
key.setBusinessObjectFormatUsage("FORMAT");
key.setBusinessObjectFormatUsage("PRC");
key.setBusinessObjectFormatVersion(0);
List<BusinessObjectDataSearchKey> keyList = new ArrayList<>();
keyList.add(key);
BusinessObjectDataSearchFilter filter = new BusinessObjectDataSearchFilter(keyList);
List<BusinessObjectDataSearchFilter> filterList = new ArrayList<>();
filterList.add(filter);
BusinessObjectDataSearchRequest request = new BusinessObjectDataSearchRequest(filterList);
request.setBusinessObjectDataSearchFilters(filterList);
try
{
businessObjectDataSearchHelper.validateBusinesObjectDataSearchRequest(request);
}
catch (IllegalArgumentException ex)
{
// catch Exception as expected
fail("No exception should be thrown, but got " + ex.getMessage());
}
}
/**
* call the validation with expectation of validation failure; if now, the assert the exception message
*
* @param request search request
* @param message message to assert
*/
private void handleExpectedExceptionValidateSearchRequest(BusinessObjectDataSearchRequest request, String message)
{
boolean caughtException = false;
try
{
businessObjectDataSearchHelper.validateBusinesObjectDataSearchRequest(request);
}
catch (IllegalArgumentException ex)
{
caughtException = true;
}
Assert.isTrue(caughtException, message);
}
/**
* handleExpectedExceptionValidateSearchRequestKey
*
* @param key business data search key
* @param message assert message
*/
private void handleExpectedExceptionValidateSearchRequestKey(BusinessObjectDataSearchKey key, String message)
{
boolean caughtException = false;
try
{
businessObjectDataSearchHelper.validateBusinessObjectDataKey(key);
}
catch (IllegalArgumentException ex)
{
caughtException = true;
Assert.isTrue(message.equals(ex.getMessage()));
}
Assert.isTrue(caughtException, "exception should be thrown and caught.");
}
}