// Copyright 2016 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.jaxws.utils.v201609; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import com.google.api.ads.adwords.jaxws.v201609.cm.CampaignStatus; import com.google.api.ads.adwords.jaxws.v201609.cm.DateRange; import com.google.api.ads.adwords.jaxws.v201609.cm.OrderBy; import com.google.api.ads.adwords.jaxws.v201609.cm.Predicate; import com.google.api.ads.adwords.jaxws.v201609.cm.PredicateOperator; import com.google.api.ads.adwords.jaxws.v201609.cm.Selector; import com.google.api.ads.adwords.jaxws.v201609.cm.SortOrder; import com.google.api.ads.adwords.lib.selectorfields.EntityField; import com.google.api.ads.adwords.lib.selectorfields.v201609.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 JAXWS 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(); builder = builder.fields("Id", "Name", "Status", "StartDate", "EndDate", "ServingStatus", "Settings"); Selector selector = builder.build(); assertEquals(7, selector.getFields().size()); assertEquals("Id", selector.getFields().get(0)); assertEquals("Name", selector.getFields().get(1)); assertEquals("Status", selector.getFields().get(2)); assertEquals("StartDate", selector.getFields().get(3)); assertEquals("EndDate", selector.getFields().get(4)); assertEquals("ServingStatus", selector.getFields().get(5)); assertEquals("Settings", selector.getFields().get(6)); selector = builder.fields("Id", "Name", "Status", "StartDate", "EndDate", "ServingStatus", "Settings", "Id", "AverageCpc").build(); assertEquals(8, selector.getFields().size()); assertEquals("Id", selector.getFields().get(0)); assertEquals("Name", selector.getFields().get(1)); assertEquals("Status", selector.getFields().get(2)); assertEquals("StartDate", selector.getFields().get(3)); assertEquals("EndDate", selector.getFields().get(4)); assertEquals("ServingStatus", selector.getFields().get(5)); assertEquals("Settings", selector.getFields().get(6)); assertEquals("AverageCpc", selector.getFields().get(7)); } /** * Tests the removal of fields */ @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().size()); assertEquals("Id", selector.getFields().get(0)); assertEquals("Name", selector.getFields().get(1)); assertEquals("Status", selector.getFields().get(2)); assertEquals("StartDate", selector.getFields().get(3)); assertEquals("EndDate", selector.getFields().get(4)); assertEquals("ServingStatus", selector.getFields().get(5)); assertEquals("Settings", selector.getFields().get(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().size()); Predicate predicate = selector.getPredicates().get(0); assertEquals("Id", predicate.getField()); assertEquals(PredicateOperator.EQUALS, predicate.getOperator()); assertNotNull(predicate.getValues()); assertEquals(1, predicate.getValues().size()); assertEquals("10", predicate.getValues().get(0)); } /** * Tests the predicate with the IN clause */ @Test public void testPredicatesInBuild() { SelectorBuilder builder = new SelectorBuilder(); builder = builder.in("Status", CampaignStatus.ENABLED.toString(), CampaignStatus.REMOVED.toString()); Selector selector = builder.build(); assertNotNull(selector.getPredicates()); assertEquals(1, selector.getPredicates().size()); Predicate predicate = selector.getPredicates().get(0); assertEquals("Status", predicate.getField()); assertEquals(PredicateOperator.IN, predicate.getOperator()); assertNotNull(predicate.getValues()); assertEquals(2, predicate.getValues().size()); assertEquals(CampaignStatus.ENABLED.toString(), predicate.getValues().get(0)); assertEquals(CampaignStatus.REMOVED.toString(), predicate.getValues().get(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().size()); OrderBy orderBy = selector.getOrdering().get(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().size()); orderBy = selector.getOrdering().get(0); assertEquals("BidType", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); orderBy = selector.getOrdering().get(1); assertEquals("Amount", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); orderBy = selector.getOrdering().get(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().size()); orderBy = selector.getOrdering().get(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().size()); builder.orderAscBy(CampaignField.BidType); selector = builder.build(); assertNotNull(selector.getOrdering()); assertEquals(2, selector.getOrdering().size()); OrderBy orderBy = selector.getOrdering().get(0); assertEquals("BidType", orderBy.getField()); assertEquals(SortOrder.ASCENDING, orderBy.getSortOrder()); orderBy = selector.getOrdering().get(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).removeLimitAndOffset().build(); assertNull(selector.getPaging()); selector = builder.offset(10).limit(20).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(); Selector selectorOne = builder.fields("Id").offset(10).build(); Selector selectorTwo = builder.fields("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(); Selector selectorOne = builder.orderAscBy("Id").build(); Selector selectorTwo = builder.build(); OrderBy orderTwo = selectorTwo.getOrdering().get(0); orderTwo.setField("Status"); assertEquals("Id", selectorOne.getOrdering().get(0).getField()); assertEquals("Status", selectorTwo.getOrdering().get(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().get(0); predicateTwo.setField("Status"); assertEquals("Id", selectorOne.getPredicates().get(0).getField()); assertEquals("Status", selectorTwo.getPredicates().get(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()); } }