// Copyright 2017 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.adwords.axis.utils.v201702; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import com.google.api.ads.adwords.axis.v201702.cm.CampaignStatus; import com.google.api.ads.adwords.axis.v201702.cm.DateRange; import com.google.api.ads.adwords.axis.v201702.cm.OrderBy; import com.google.api.ads.adwords.axis.v201702.cm.Predicate; import com.google.api.ads.adwords.axis.v201702.cm.PredicateOperator; import com.google.api.ads.adwords.axis.v201702.cm.Selector; import com.google.api.ads.adwords.axis.v201702.cm.SortOrder; import com.google.api.ads.adwords.lib.selectorfields.EntityField; import com.google.api.ads.adwords.lib.selectorfields.v201702.cm.CampaignField; import com.google.api.ads.adwords.lib.utils.AdWordsInternals; import com.google.api.ads.common.lib.utils.AdsUtility; import com.google.common.collect.Sets; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Set; import org.joda.time.DateTime; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Test case for the Axis implementation of the selector builder. */ @RunWith(JUnit4.class) public class SelectorBuilderTest { /** * Indicates if this test invokes any of the methods on SelectorBuilder with an * {@link EntityField} argument. */ private boolean isTestUsingFieldEnums; @Before public void setUp() { isTestUsingFieldEnums = false; AdWordsInternals.getInstance().getAdsUtilityRegistry().removeUtilities( AdWordsInternals.getInstance().getAdsUtilityRegistry().getRegisteredUtilities()); } @After public void tearDown() { Set<AdsUtility> expectedUtilities = Sets.<AdsUtility>newTreeSet(); expectedUtilities.add(AdsUtility.SELECTOR_BUILDER); if (isTestUsingFieldEnums) { expectedUtilities.add(AdsUtility.SELECTOR_FIELD); } assertEquals(expectedUtilities, AdWordsInternals.getInstance().getAdsUtilityRegistry().getRegisteredUtilities()); } /** * Tests the immutability of the selector */ @Test @SuppressWarnings("unchecked") public void testSelectorBuilderImmutability() { DateFormat dateFormat = new SimpleDateFormat(SelectorBuilderImpl.DEFAULT_DATE_FORMAT); SelectorBuilder builder = new SelectorBuilder(); DateTime start = new DateTime(2013, 3, 25, 0, 0, 0, 0); DateTime end = new DateTime(2013, 3, 26, 0, 0, 0, 0); String formatStart = dateFormat.format(start.toDate()); String formatEnd = dateFormat.format(end.toDate()); builder = builder.fields("Id", "Name", "Status").forDateRange(start, end); Selector selector = builder.build(); assertEquals(formatStart, selector.getDateRange().getMin()); assertEquals(formatEnd, selector.getDateRange().getMax()); String formatEndPlusOne = dateFormat.format(end.plusDays(1).toDate()); DateRange dateRange = new DateRange(); dateRange.setMin(formatStart); dateRange.setMax(formatEndPlusOne); selector.setDateRange(dateRange); assertEquals(formatStart, selector.getDateRange().getMin()); assertEquals(formatEndPlusOne, selector.getDateRange().getMax()); Selector selectorRebuilt = builder.fields("Id", "Name", "Status").forDateRange(start, end).build(); assertEquals(formatStart, selectorRebuilt.getDateRange().getMin()); assertEquals(formatEnd, selectorRebuilt.getDateRange().getMax()); } /** * Tests the adding of a new field */ @Test @SuppressWarnings("unchecked") public void testFieldsBuild() { SelectorBuilder builder = new SelectorBuilder(); isTestUsingFieldEnums = true; builder = builder.fields("Id", "Name", "Status", "StartDate", "EndDate", "ServingStatus", "Settings"); Selector selector = builder.build(); assertEquals(7, selector.getFields().length); assertEquals("Id", selector.getFields()[0]); assertEquals("Name", selector.getFields()[1]); assertEquals("Status", selector.getFields()[2]); assertEquals("StartDate", selector.getFields()[3]); assertEquals("EndDate", selector.getFields()[4]); assertEquals("ServingStatus", selector.getFields()[5]); assertEquals("Settings", selector.getFields()[6]); selector = builder.fields(CampaignField.Id, CampaignField.Name, CampaignField.Status, CampaignField.StartDate, CampaignField.EndDate, CampaignField.ServingStatus, CampaignField.Settings, CampaignField.Id, CampaignField.Amount).build(); assertEquals(8, selector.getFields().length); assertEquals("Id", selector.getFields()[0]); assertEquals("Name", selector.getFields()[1]); assertEquals("Status", selector.getFields()[2]); assertEquals("StartDate", selector.getFields()[3]); assertEquals("EndDate", selector.getFields()[4]); assertEquals("ServingStatus", selector.getFields()[5]); assertEquals("Settings", selector.getFields()[6]); assertEquals("Amount", selector.getFields()[7]); } /** * Tests the removal of a new field */ @Test @SuppressWarnings("unchecked") public void testFieldsRemove() { SelectorBuilder builder = new SelectorBuilder(); builder = builder.fields("Id", "Name", "Status", "StartDate", "EndDate", "ServingStatus", "Settings"); Selector selector = builder.build(); assertEquals(7, selector.getFields().length); assertEquals("Id", selector.getFields()[0]); assertEquals("Name", selector.getFields()[1]); assertEquals("Status", selector.getFields()[2]); assertEquals("StartDate", selector.getFields()[3]); assertEquals("EndDate", selector.getFields()[4]); assertEquals("ServingStatus", selector.getFields()[5]); assertEquals("Settings", selector.getFields()[6]); } /** * Tests the predicate build for the ID field */ @Test public void testPredicatesBuild() { SelectorBuilder builder = new SelectorBuilder(); builder = builder.equalsId(10L); Selector selector = builder.build(); assertNotNull(selector.getPredicates()); assertEquals(1, selector.getPredicates().length); Predicate predicate = selector.getPredicates()[0]; assertEquals("Id", predicate.getField()); assertEquals(PredicateOperator.EQUALS, predicate.getOperator()); assertNotNull(predicate.getValues()); assertEquals(1, predicate.getValues().length); assertEquals("10", predicate.getValues()[0]); } /** * Tests the predicate with the IN clause */ @Test public void testPredicatesInBuild() { SelectorBuilder builder = new SelectorBuilder(); isTestUsingFieldEnums = true; builder = builder.in(CampaignField.Status, CampaignStatus.ENABLED.toString(), CampaignStatus.REMOVED.toString()); Selector selector = builder.build(); assertNotNull(selector.getPredicates()); assertEquals(1, selector.getPredicates().length); Predicate predicate = selector.getPredicates()[0]; assertEquals("Status", predicate.getField()); assertEquals(PredicateOperator.IN, predicate.getOperator()); assertNotNull(predicate.getValues()); assertEquals(2, predicate.getValues().length); assertEquals(CampaignStatus.ENABLED.toString(), predicate.getValues()[0]); assertEquals(CampaignStatus.REMOVED.toString(), predicate.getValues()[1]); } /** * Tests the order by criteria */ @Test public void testOrderByBuild() { SelectorBuilder builder = new SelectorBuilder(); isTestUsingFieldEnums = true; builder = builder.orderAscBy(CampaignField.BidType); Selector selector = builder.build(); assertNotNull(selector.getOrdering()); assertEquals(1, selector.getOrdering().length); OrderBy orderBy = selector.getOrdering()[0]; assertEquals("BidType", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); builder.orderAscBy(CampaignField.Amount).orderDescBy(CampaignField.BidType); selector = builder.build(); assertNotNull(selector.getOrdering()); assertEquals(3, selector.getOrdering().length); orderBy = selector.getOrdering()[0]; assertEquals("BidType", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); orderBy = selector.getOrdering()[1]; assertEquals("Amount", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); orderBy = selector.getOrdering()[2]; assertEquals("BidType", orderBy.getField()); assertEquals(SortOrder.DESCENDING, orderBy.getSortOrder()); // Removing the OrderBy for BidType selector = builder.removeOrderBy("BidType").build(); assertNotNull(selector.getOrdering()); assertEquals(1, selector.getOrdering().length); orderBy = selector.getOrdering()[0]; assertEquals("Amount", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); } /** * Tests that when a repeated ORDER BY clause is added to the selector, it is actually ignored. */ @Test public void testOrderBySubstitution() { SelectorBuilder builder = new SelectorBuilder(); isTestUsingFieldEnums = true; builder = builder.orderAscBy(CampaignField.BidType).orderDescBy(CampaignField.Amount); Selector selector = builder.build(); assertNotNull(selector.getOrdering()); assertEquals(2, selector.getOrdering().length); builder.orderAscBy(CampaignField.BidType); selector = builder.build(); assertNotNull(selector.getOrdering()); assertEquals(2, selector.getOrdering().length); OrderBy orderBy = selector.getOrdering()[0]; assertEquals("BidType", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); orderBy = selector.getOrdering()[1]; assertEquals("Amount", orderBy.getField()); assertEquals(SortOrder.DESCENDING, orderBy.getSortOrder()); } /** * Tests the date range setting */ @Test public void testDateRangeBuild() { DateFormat dateFormat = new SimpleDateFormat(SelectorBuilderImpl.DEFAULT_DATE_FORMAT); SelectorBuilder builder = new SelectorBuilder(); DateTime start = new DateTime(2013, 3, 25, 0, 0, 0, 0); DateTime end = new DateTime(2013, 3, 26, 0, 0, 0, 0); String formatStart = dateFormat.format(start.toDate()); String formatEnd = dateFormat.format(end.toDate()); builder = builder.forDateRange(start, end); Selector selector = builder.build(); assertEquals(formatStart, selector.getDateRange().getMin()); assertEquals(formatEnd, selector.getDateRange().getMax()); } /** * Tests the offset, limit and paging logic of the builder. */ @Test public void testPagingAndLimits() { SelectorBuilder builder = new SelectorBuilder(); builder = builder.offset(10); Selector selector = builder.build(); assertNotNull(selector.getPaging()); assertNotNull(selector.getPaging().getStartIndex()); assertNull(selector.getPaging().getNumberResults()); assertEquals(10, selector.getPaging().getStartIndex().intValue()); selector = builder.offset(10).limit(20).build(); assertNotNull(selector.getPaging()); assertNotNull(selector.getPaging().getStartIndex()); assertNotNull(selector.getPaging().getNumberResults()); assertEquals(10, selector.getPaging().getStartIndex().intValue()); assertEquals(20, selector.getPaging().getNumberResults().intValue()); selector = builder.offset(10).limit(20).increaseOffsetBy(5).build(); assertNotNull(selector.getPaging()); assertNotNull(selector.getPaging().getStartIndex()); assertNotNull(selector.getPaging().getNumberResults()); assertEquals(15, selector.getPaging().getStartIndex().intValue()); assertEquals(20, selector.getPaging().getNumberResults().intValue()); selector = builder.offset(10).limit(20).increaseOffsetBy(5).removeLimitAndOffset().build(); assertNull(selector.getPaging()); selector = builder .offset(10) .limit(20) .increaseOffsetBy(5) .removeLimitAndOffset() .offset(55) .limit(4) .build(); assertNotNull(selector.getPaging()); assertNotNull(selector.getPaging().getStartIndex()); assertNotNull(selector.getPaging().getNumberResults()); assertEquals(55, selector.getPaging().getStartIndex().intValue()); assertEquals(4, selector.getPaging().getNumberResults().intValue()); } /** * Tests that the built selectors don't share internal Paging state. */ @Test public void testUniqueInternalPagingState() { SelectorBuilder builder = new SelectorBuilder(); isTestUsingFieldEnums = true; Selector selectorOne = builder.fields("Id").offset(10).build(); Selector selectorTwo = builder.fields(CampaignField.Status).offset(345).build(); assertEquals(10, selectorOne.getPaging().getStartIndex().intValue()); assertEquals(345, selectorTwo.getPaging().getStartIndex().intValue()); } /** * Tests that the built selectors don't share internal OrderBy state. */ @Test public void testUniqueInternalOrderByState() { SelectorBuilder builder = new SelectorBuilder(); isTestUsingFieldEnums = true; Selector selectorOne = builder.orderAscBy(CampaignField.Id).build(); Selector selectorTwo = builder.build(); OrderBy orderTwo = selectorTwo.getOrdering(0); orderTwo.setField("Status"); assertEquals("Id", selectorOne.getOrdering(0).getField()); assertEquals("Status", selectorTwo.getOrdering(0).getField()); } /** * Tests that the built selectors don't share internal Predicate state. */ @Test public void testUniqueInternalPredicateState() { SelectorBuilder builder = new SelectorBuilder(); Selector selectorOne = builder.equals("Id", "test").build(); Selector selectorTwo = builder.build(); Predicate predicateTwo = selectorTwo.getPredicates(0); predicateTwo.setField("Status"); assertEquals("Id", selectorOne.getPredicates(0).getField()); assertEquals("Status", selectorTwo.getPredicates(0).getField()); } /** * Tests that the built selectors don't share internal DateRange state. */ @Test public void testUniqueInternalDateRangeState() { SelectorBuilder builder = new SelectorBuilder(); DateFormat dateFormat = new SimpleDateFormat(SelectorBuilderImpl.DEFAULT_DATE_FORMAT); DateTime startOne = new DateTime(2013, 1, 1, 0, 0, 0, 0); DateTime endOne = new DateTime(2013, 1, 31, 0, 0, 0, 0); DateTime startTwo = new DateTime(2013, 2, 1, 0, 0, 0, 0); DateTime endTwo = new DateTime(2013, 2, 28, 0, 0, 0, 0); Selector selectorOne = builder.forDateRange(startOne, endOne).build(); Selector selectorTwo = builder.forDateRange(startTwo, endTwo).build(); assertEquals(dateFormat.format(startOne.toDate()), selectorOne.getDateRange().getMin()); assertEquals(dateFormat.format(endOne.toDate()), selectorOne.getDateRange().getMax()); assertEquals(dateFormat.format(startTwo.toDate()), selectorTwo.getDateRange().getMin()); assertEquals(dateFormat.format(endTwo.toDate()), selectorTwo.getDateRange().getMax()); } }