/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 gobblin.ingestion.google.webmaster;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.mockito.ArgumentMatcher;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.api.services.webmasters.model.ApiDimensionFilter;
import gobblin.configuration.WorkUnitState;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
class CollectionEquals extends ArgumentMatcher<Collection> {
private final Collection _expected;
public CollectionEquals(Collection expected) {
_expected = expected;
}
@Override
public boolean matches(Object actual) {
return CollectionUtils.isEqualCollection((Collection) actual, _expected);
}
}
@Test(groups = {"gobblin.source.extractor.extract.google.webmaster"})
public class GoogleWebmasterExtractorIteratorTest {
String siteProperty = "https://www.abc.com/";
/**
* Test the GoogleWebmasterExtractorIterator to make sure that it first gets all pages based on the filters
* and then for each page, it asks for the queries.
* @throws IOException
*/
@Test
public void testIterator()
throws IOException {
GoogleWebmasterDataFetcher client = Mockito.mock(GoogleWebmasterDataFetcher.class);
String country = "USA";
String date = "2016-11-01";
ArrayList<GoogleWebmasterFilter.Dimension> requestedDimensions = new ArrayList<>();
ArrayList<GoogleWebmasterDataFetcher.Metric> requestedMetrics = new ArrayList<>();
ArrayDeque<ProducerJob> allJobs = new ArrayDeque<>();
String page1 = siteProperty + "a/1";
String page2 = siteProperty + "b/1";
allJobs.add(new SimpleProducerJob(page1, date, date));
allJobs.add(new SimpleProducerJob(page2, date, date));
Mockito.when(client.getAllPages(eq(date), eq(date), eq(country), eq(GoogleWebmasterClient.API_ROW_LIMIT)))
.thenReturn(allJobs);
//Set performSearchAnalyticsQuery Mock1
String[] a1 = {"r1-c1", "r1-c2"};
List<String[]> results1 = new ArrayList<>();
results1.add(a1);
List<ApiDimensionFilter> filters1 = new ArrayList<>();
filters1.add(GoogleWebmasterFilter.countryEqFilter(country));
filters1.add(GoogleWebmasterFilter.pageFilter(GoogleWebmasterFilter.FilterOperator.EQUALS, page1));
Mockito.when(client.performSearchAnalyticsQuery(eq(date), eq(date), eq(GoogleWebmasterClient.API_ROW_LIMIT),
eq(requestedDimensions), eq(requestedMetrics), argThat(new CollectionEquals(filters1)))).thenReturn(results1);
//Set performSearchAnalyticsQuery Mock2
String[] a2 = {"r2-c1", "r2-c2"};
List<String[]> results2 = new ArrayList<>();
results2.add(a2);
List<ApiDimensionFilter> filters2 = new ArrayList<>();
filters2.add(GoogleWebmasterFilter.countryEqFilter(country));
filters2.add(GoogleWebmasterFilter.pageFilter(GoogleWebmasterFilter.FilterOperator.EQUALS, page2));
Mockito.when(client
.performSearchAnalyticsQuery(eq(date), eq(date), eq(5000), eq(requestedDimensions), eq(requestedMetrics),
argThat(new CollectionEquals(filters2)))).thenReturn(results2);
Map<GoogleWebmasterFilter.Dimension, ApiDimensionFilter> map = new HashMap<>();
map.put(GoogleWebmasterFilter.Dimension.COUNTRY, GoogleWebmasterFilter.countryEqFilter(country));
WorkUnitState defaultState = GoogleWebmasterExtractorTest.getWorkUnitState1();
defaultState.setProp(GoogleWebMasterSource.KEY_QUERIES_TUNING_BATCH_SIZE, 1);
GoogleWebmasterExtractorIterator iterator =
new GoogleWebmasterExtractorIterator(client, date, date, requestedDimensions, requestedMetrics, map,
defaultState);
List<String[]> response = new ArrayList<>();
response.add(iterator.next());
response.add(iterator.next());
Assert.assertTrue(!iterator.hasNext());
Assert.assertTrue(response.contains(a1));
Assert.assertTrue(response.contains(a2));
Mockito.verify(client, Mockito.times(1)).getAllPages(eq(date), eq(date), eq(country), eq(5000));
Mockito.verify(client, Mockito.times(1))
.performSearchAnalyticsQuery(eq(date), eq(date), eq(5000), eq(requestedDimensions), eq(requestedMetrics),
argThat(new CollectionEquals(filters1)));
Mockito.verify(client, Mockito.times(1))
.performSearchAnalyticsQuery(eq(date), eq(date), eq(5000), eq(requestedDimensions), eq(requestedMetrics),
argThat(new CollectionEquals(filters2)));
}
}