package org.atomhopper.jdbc.query; import static junit.framework.Assert.*; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import java.util.HashMap; import java.util.List; import java.util.Map; @RunWith(Enclosed.class) public class SearchToSqlConverterTest { public static class WhenCallingSearchToSqlConverter { private String bad_cat1 = "(cat=\")"; private String bad_cat2 = "(cat=ab\"cd)"; private String bad_cat3 = "(cat=\"ab\")"; private String bad_cat4 = "(cat=,)"; private String bad_classic1 = "+\""; private String bad_classic2 = "+\"abcd\""; private String bad_classic3 = "+a\"b\"c"; private String bad_classic4 = "+,"; private String single_search = "(cat=D)"; private String single_search_result = " categories @> ?::varchar[] "; private String and_search = "(&(cat=A)(cat=B))"; private String and_curl_search = "(AND(cat=A)(cat=B))"; private String and_search_result = "( categories @> ?::varchar[] AND categories @> ?::varchar[] )"; private String or_search = "(|(cat=A)(cat=B))"; private String or_curl_search = "(OR(cat=A)(cat=B))"; private String or_search_result = "( categories @> ?::varchar[] OR categories @> ?::varchar[] )"; private String not_search = "(!(cat=A))"; private String not_curl_search = "(NOT(cat=A))"; private String not_search_result = " NOT categories @> ?::varchar[] "; private String classic_search = "+A"; private String classic_search_result = "( categories && ?::varchar[] )"; private String no_plus_or_parens_search = "search"; private String bad_ldap_search = "(cat=D"; private String incorrect_category_term = ("search=A)"); private String prefix_single_search= "(cat=tid:D)"; private String prefix_single_search_result = " tenantId = ? "; private String prefix_and_search = "(&(cat=tid:A)(cat=B))"; private String prefix_and_search_result = "( tenantId = ? AND categories @> ?::varchar[] )"; private String prefix_or_search = "(|(cat=tid:A)(cat=B))"; private String prefix_or_search_result = "( tenantId = ? OR categories @> ?::varchar[] )"; private String prefix_not_search = "(!(cat=tid:A))"; private String prefix_not_search_result = " NOT tenantId = ? "; private String prefix_classic_search = "+tid:A+B"; private String prefix_classic_search_result = "( tenantId = ? OR categories && ?::varchar[] )"; private String prefix_classic_search_3 = "+B+tid:A+C"; private String prefix_classic_search_result_3 = "( categories && ?::varchar[] OR tenantId = ? OR categories && ?::varchar[] )"; private String classic_search_or = "+A+B"; private String classic_search_result_or = "( categories && ?::varchar[] )"; private static Map<String, String> prefixMapper = new HashMap<String, String>(); static { prefixMapper.put( "tid", "tenantId" ); prefixMapper.put( "type", "eventtype" ); } private static String PREFIX_SPLIT = ":"; @Test public void ShouldGetCats() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); List<String> result = searchToSqlConverter.getParamsFromSearchString(single_search); assertTrue(result.size() == 1); } @Test public void ShouldGetCatsPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_single_search); assertTrue(result.size() == 1); assertEquals( result.get( 0 ), "D" ); } @Test public void ShouldGetCatsForAnd() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); List<String> result = searchToSqlConverter.getParamsFromSearchString(and_search); assertTrue(result.size() == 2); } @Test public void ShouldGetCatsForAndPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_and_search); assertTrue(result.size() == 2); assertEquals( result.get( 0 ), "A" ); assertEquals( result.get( 1 ), "{b}" ); } @Test public void ShouldGetCatsForOr() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); List<String> result = searchToSqlConverter.getParamsFromSearchString(or_search); assertTrue(result.size() == 2); } @Test public void ShouldGetCatsForOrPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_or_search); assertTrue(result.size() == 2); assertEquals( result.get( 0 ), "A" ); assertEquals( result.get( 1 ), "{b}" ); } @Test public void ShouldGetCatsForNot() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); List<String> result = searchToSqlConverter.getParamsFromSearchString(not_search); assertTrue(result.size() == 1); } @Test public void ShouldGetCatsForNotPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_not_search); assertTrue(result.size() == 1); assertEquals( result.get( 0 ), "A" ); } @Test public void ShouldGetSqlForSingle() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(single_search); assertEquals(single_search_result, result); } @Test public void ShouldGetSqlForSinglePrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); String result = searchToSqlConverter.getSqlFromSearchString(prefix_single_search); assertEquals(prefix_single_search_result, result); } @Test public void ShouldGetSqlForAnd() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(and_search); assertEquals(and_search_result, result); } @Test public void ShouldGetSqlForAndPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); String result = searchToSqlConverter.getSqlFromSearchString(prefix_and_search); assertEquals(prefix_and_search_result, result); } @Test public void ShouldGetSqlForOr() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(or_search); assertEquals(or_search_result, result); } @Test public void ShouldGetSqlForOrPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); String result = searchToSqlConverter.getSqlFromSearchString(prefix_or_search); assertEquals(prefix_or_search_result, result); } @Test public void ShouldGetSqlForNot() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(not_search); assertEquals(not_search_result, result); } @Test public void ShouldGetSqlForNotPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); String result = searchToSqlConverter.getSqlFromSearchString(prefix_not_search); assertEquals(prefix_not_search_result, result); } @Test public void ShouldGetSqlForAndCurl() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(and_curl_search); assertEquals(and_search_result, result); } @Test public void ShouldGetSqlForOrCurl() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(or_curl_search); assertEquals(or_search_result, result); } @Test public void ShouldGetSqlForNotCurl() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(not_curl_search); assertEquals(not_search_result, result); } @Test public void ShouldGetSqlForClassic() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(classic_search); assertEquals(classic_search_result, result); } @Test public void ShouldGetSqlForClassicPrefix() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); String result = searchToSqlConverter.getSqlFromSearchString(prefix_classic_search); assertEquals(prefix_classic_search_result, result); } @Test public void ShouldGetSqlForClassicPrefixThree() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); String result = searchToSqlConverter.getSqlFromSearchString(prefix_classic_search_3); assertEquals(prefix_classic_search_result_3, result); } @Test public void ShouldGetSqlForClassicOr() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); String result = searchToSqlConverter.getSqlFromSearchString(classic_search_or); assertEquals(classic_search_result_or, result); } @Test(expected = IllegalArgumentException.class) public void ShouldErrorForInvalidSearchNoOpeningPlusOrParens() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(no_plus_or_parens_search); } @Test(expected = IllegalArgumentException.class) public void ShouldErrorForInvalidSearchBadLdap() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(bad_ldap_search); } @Test(expected = IllegalArgumentException.class) public void ShouldErrorForIncorrectCategoryTerm() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(incorrect_category_term); } @Test public void ShouldReturnNullForBlank() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter(); String result = searchToSqlConverter.getSqlFromSearchString(null); assertNull(result); } @Test public void ShouldGetPrefixCats() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_single_search); assertTrue(result.size() == 1); } @Test public void ShouldGetPrefixCatsForAnd() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_and_search); assertTrue(result.size() == 2); } @Test public void ShouldGetPrefixCatsForOr() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_or_search); assertTrue(result.size() == 2); } @Test public void ShouldGetPrefixCatsForNot() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_not_search); assertTrue(result.size() == 1); } @Test public void ShouldGetPrefixCatsClassic() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); List<String> result = searchToSqlConverter.getParamsFromSearchString(prefix_classic_search); assertTrue(result.size() == 2); assertEquals( result.get( 0 ), "a" ); assertEquals( result.get( 1 ), "{b}" ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadCat1() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_cat1 ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadCat2() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_cat2 ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadCat3() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_cat3 ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadCat4() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_cat4 ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadClassic1() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_classic1 ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadClassic2() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_classic2 ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadClassic3() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_classic3 ); } @Test( expected = IllegalArgumentException.class ) public void ShouldThrowExceptionBadClassic4() throws Exception { SearchToSqlConverter searchToSqlConverter = new SearchToSqlConverter( prefixMapper, PREFIX_SPLIT ); searchToSqlConverter.getParamsFromSearchString( bad_classic4 ); } } }