| /** |
| * 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 org.apache.camel.component.facebook; |
| |
| import java.lang.reflect.Method; |
| import java.text.SimpleDateFormat; |
| import java.util.Arrays; |
| import java.util.Date; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| import java.util.concurrent.TimeUnit; |
| |
| import facebook4j.FacebookException; |
| import facebook4j.api.SearchMethods; |
| |
| import org.apache.camel.Consumer; |
| import org.apache.camel.Endpoint; |
| import org.apache.camel.Route; |
| import org.apache.camel.builder.RouteBuilder; |
| import org.apache.camel.component.mock.MockEndpoint; |
| import org.apache.camel.impl.DefaultPollingConsumerPollStrategy; |
| import org.apache.camel.impl.ScheduledPollConsumer; |
| import org.junit.Test; |
| |
| public class FacebookComponentConsumerTest extends CamelFacebookTestSupport { |
| public static final String APACHE_FOUNDATION_PAGE_ID = "6538157161"; |
| |
| private final Set<String> searchNames = new HashSet<String>(); |
| private List<String> excludedNames; |
| |
| public FacebookComponentConsumerTest() throws Exception { |
| // find search methods for consumer tests |
| for (Method method : SearchMethods.class.getDeclaredMethods()) { |
| String name = getShortName(method.getName()); |
| if (!"locations".equals(name) && !"checkins".equals(name)) { |
| searchNames.add(name); |
| } |
| } |
| |
| excludedNames = Arrays.asList("places", "users", "search", "pages", "searchPosts"); |
| } |
| |
| @Test |
| public void testConsumers() throws InterruptedException { |
| for (String name : searchNames) { |
| MockEndpoint mock; |
| if (!excludedNames.contains(name)) { |
| mock = getMockEndpoint("mock:consumeResult" + name); |
| mock.expectedMinimumMessageCount(1); |
| } |
| |
| mock = getMockEndpoint("mock:consumeQueryResult" + name); |
| mock.expectedMinimumMessageCount(1); |
| } |
| |
| assertMockEndpointsSatisfied(); |
| } |
| |
| @Test |
| public void testJsonStoreEnabled() throws Exception { |
| final MockEndpoint mock = getMockEndpoint("mock:testJsonStoreEnabled"); |
| mock.expectedMinimumMessageCount(1); |
| mock.assertIsSatisfied(); |
| |
| final String rawJSON = mock.getExchanges().get(0).getIn().getHeader(FacebookConstants.RAW_JSON_HEADER, String.class); |
| assertNotNull("Null rawJSON", rawJSON); |
| assertFalse("Empty rawJSON", rawJSON.isEmpty()); |
| } |
| |
| @Test |
| public void testPage() throws Exception { |
| final MockEndpoint mock = getMockEndpoint("mock:testPage"); |
| mock.expectedMinimumMessageCount(1); |
| mock.assertIsSatisfied(); |
| } |
| |
| @Override |
| protected void doPostSetup() throws Exception { |
| ignoreDeprecatedApiError(); |
| } |
| |
| private void ignoreDeprecatedApiError() { |
| for (final Route route : context().getRoutes()) { |
| ((ScheduledPollConsumer)route.getConsumer()).setPollStrategy(new DefaultPollingConsumerPollStrategy() { |
| @Override |
| public boolean rollback(Consumer consumer, Endpoint endpoint, int retryCounter, Exception e) throws Exception { |
| if (e.getCause() instanceof FacebookException) { |
| FacebookException facebookException = (FacebookException) e.getCause(); |
| if (facebookException.getErrorCode() == 11 || facebookException.getErrorCode() == 12 || facebookException.getErrorCode() == 1) { |
| context().stopRoute(route.getId()); |
| String method = ((FacebookEndpoint) route.getEndpoint()).getMethod(); |
| MockEndpoint mock = getMockEndpoint("mock:consumeQueryResult" + method); |
| mock.expectedMinimumMessageCount(0); |
| MockEndpoint mock2 = getMockEndpoint("mock:consumeResult" + method); |
| mock2.expectedMinimumMessageCount(0); |
| log.warn("Ignoring failed Facebook deprecated API call", facebookException); |
| } |
| } |
| return super.rollback(consumer, endpoint, retryCounter, e); |
| } |
| }); |
| } |
| } |
| |
| @Override |
| protected RouteBuilder createRouteBuilder() throws Exception { |
| return new RouteBuilder() { |
| public void configure() throws Exception { |
| // start with a 30 day window for the first delayed poll |
| String since = "RAW(" + new SimpleDateFormat(FacebookConstants.FACEBOOK_DATE_FORMAT).format( |
| new Date(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(30, TimeUnit.DAYS))) + ")"; |
| |
| for (String name : searchNames) { |
| if (!excludedNames.contains(name)) { |
| // consumer.sendEmptyMessageWhenIdle is true since user may not have some items like events |
| from("facebook://" + name + "?reading.limit=10&reading.locale=en.US&reading.since=" |
| + since + "&consumer.initialDelay=1000&consumer.sendEmptyMessageWhenIdle=true&" |
| + getOauthParams()) |
| .to("mock:consumeResult" + name); |
| } |
| |
| from("facebook://" + name + "?query=cheese&reading.limit=10&reading.locale=en.US&reading.since=" |
| + since + "&consumer.initialDelay=1000&" + getOauthParams()) |
| .to("mock:consumeQueryResult" + name); |
| } |
| |
| from("facebook://me?jsonStoreEnabled=true&" + getOauthParams()) |
| .to("mock:testJsonStoreEnabled"); |
| |
| // test unix timestamp support |
| long unixSince = TimeUnit.SECONDS.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS) |
| - TimeUnit.SECONDS.convert(30, TimeUnit.DAYS); |
| from("facebook://page?pageId=" + APACHE_FOUNDATION_PAGE_ID + "&reading.limit=10&reading.since=" + unixSince + "&" + getOauthParams()) |
| .to("mock:testPage"); |
| |
| // TODO add tests for the rest of the supported methods |
| } |
| }; |
| } |
| |
| } |