// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.api.ads.dfp.lib.utils; import static org.junit.Assert.assertEquals; import com.google.common.collect.Maps; import org.hamcrest.Matchers; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.Map; /** * Test for the {@link QueryBuilderTest} class. */ @RunWith(JUnit4.class) public class QueryBuilderTest { @Rule public ExpectedException thrown = ExpectedException.none(); public QueryBuilderTest() {} @Test public void testRemoveKeyword_matches() { assertEquals(QueryBuilder.removeKeyword("FROM table", "FROM"), "table"); assertEquals(QueryBuilder.removeKeyword("from table", "FROM"), "table"); assertEquals(QueryBuilder.removeKeyword("fRom table", "FROM"), "table"); assertEquals(QueryBuilder.removeKeyword("FROM ", "FROM"), ""); assertEquals(QueryBuilder.removeKeyword("FROM ", "FROM"), " "); } @Test public void testRemoveKeyword_doesntMatch() { assertEquals(QueryBuilder.removeKeyword("FROM table", "SELECT"), "FROM table"); assertEquals(QueryBuilder.removeKeyword("table", "FROM"), "table"); } @Test public void testSelect_null() { thrown.expect(NullPointerException.class); thrown.expectMessage(Matchers.equalTo("SELECT clause cannot be null")); QueryBuilder<Object> builder = new QueryBuilder<Object>(); builder.select(null); } @Test public void testFrom_null() { QueryBuilder<Object> builder = new QueryBuilder<Object>(); thrown.expect(NullPointerException.class); thrown.expectMessage("FROM clause cannot be null"); builder.from(null); } @Test public void testWhere_null() { QueryBuilder<Object> builder = new QueryBuilder<Object>(); thrown.expect(NullPointerException.class); thrown.expectMessage("WHERE clause cannot be null"); builder.where(null); } @Test public void testOrderBy_null() { QueryBuilder<Object> builder = new QueryBuilder<Object>(); thrown.expect(NullPointerException.class); thrown.expectMessage("ORDER BY clause cannot be null"); builder.orderBy(null); } @Test public void testBuildQuery_pqlTable() { String expectedQuery = "SELECT * FROM table WHERE a = b AND b = c ORDER BY a ASC, b DESC LIMIT 200 OFFSET 0"; String query = new QueryBuilder<Object>() .select("*") .from("table") .where("a = b AND b = c") .orderBy("a ASC, b DESC") .limit(200) .offset(0) .buildQuery(); assertEquals(expectedQuery, query); } @Test public void testBuildQuery_notPqlTable() { String expectedQuery = "WHERE a = b AND b = c ORDER BY a ASC, b DESC LIMIT 200 OFFSET 0"; String query = new QueryBuilder<Object>() .where("a = b AND b = c") .orderBy("a ASC, b DESC") .limit(200) .offset(0) .buildQuery(); assertEquals(expectedQuery, query); } @Test public void testBuildQuery_noOffset() { String expectedQuery = "WHERE a = b AND b = c ORDER BY a ASC, b DESC LIMIT 200"; String query = new QueryBuilder<Object>() .where("a = b AND b = c") .orderBy("a ASC, b DESC") .limit(200) .buildQuery(); assertEquals(expectedQuery, query); } @Test public void testBuildQuery_justLimit() { String expectedQuery = "LIMIT 500"; String query = new QueryBuilder<Object>() .limit(500) .buildQuery(); assertEquals(expectedQuery, query); } @Test public void testBuildQuery_limitAndOffset() { String expectedQuery = "LIMIT 500 OFFSET 0"; String query = new QueryBuilder<Object>() .limit(500) .offset(0) .buildQuery(); assertEquals(expectedQuery, query); } @Test public void testBuildQuery_removeLimitAndOffset() { String expectedQueryBefore = "WHERE a = b ORDER BY a LIMIT 500 OFFSET 0"; String expectedQueryAfter = "WHERE a = b ORDER BY a"; QueryBuilder<Object> queryBuilder = new QueryBuilder<Object>() .limit(500) .offset(0) .where("a = b") .orderBy("a"); assertEquals(expectedQueryBefore, queryBuilder.buildQuery()); queryBuilder.removeLimitAndOffset(); assertEquals(expectedQueryAfter, queryBuilder.buildQuery()); } @Test public void testBuildQuery_empty() { String expectedQuery = ""; String query = new QueryBuilder<Object>() .buildQuery(); assertEquals(expectedQuery, query); } @Test public void testBuildQuery_OffsetWithoutLimit() { QueryBuilder<Object> builder = new QueryBuilder<Object>().offset(500); thrown.expect(IllegalStateException.class); thrown.expectMessage("OFFSET cannot be set if LIMIT is not set."); builder.buildQuery(); } @Test public void testBuildQuery_withBindingVariable() { String key = "key"; String value = "value"; QueryBuilder<Object> builder = new QueryBuilder<Object>(); builder.withBindVariableValue(key, value); assertEquals(value, builder.getBindVariableMap().get(key)); } @Test public void testBuildQuery_withBindVariableValues() { String key = "key"; String value = "value"; String key2 = "key2"; String value2 = "value2"; Map<String, Object> valueMap = Maps.newHashMap(); valueMap.put(key, value); valueMap.put(key2, value2); QueryBuilder<Object> builder = new QueryBuilder<Object>(); builder.withBindVariableValues(valueMap); assertEquals(value, builder.getBindVariableMap().get(key)); assertEquals(value2, builder.getBindVariableMap().get(key2)); } }