/* * #%L * ACS AEM Commons Bundle * %% * Copyright (C) 2017 Adobe * %% * 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. * #L% */ package com.adobe.acs.commons.twitter.impl; import com.adobe.acs.commons.twitter.TwitterClient; import com.adobe.cq.commerce.common.ValueMapDecorator; import com.day.cq.wcm.api.Page; import com.day.cq.wcm.webservicesupport.ConfigurationConstants; import com.day.cq.wcm.webservicesupport.ConfigurationManager; import junitx.util.PrivateAccessor; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ValueMap; import org.junit.Before; import org.junit.Test; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.conf.Configuration; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class TwitterAdapterFactoryTest { public static final String VALID_OAUTH_CLIENT_ID = "abcd"; public static final String VALID_OAUTH_SECRET = "efgh"; private ValueMap validOauthValueMap; @Test public void activateWithoutProxy() throws Exception { TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory(); adapterFactory.activate(Collections.emptyMap()); TwitterFactory factory = (TwitterFactory) PrivateAccessor.getField(adapterFactory, "factory"); Twitter twitter = factory.getInstance(); Configuration configuration = (Configuration) PrivateAccessor.getField(twitter, "conf"); assertEquals(-1, configuration.getHttpProxyPort()); assertNull(configuration.getHttpProxyHost()); } @Test public void activateWithProxyPortWithoutHost() throws Exception { TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory(); adapterFactory.activate(Collections.singletonMap("http.proxy.port", 8080));; TwitterFactory factory = (TwitterFactory) PrivateAccessor.getField(adapterFactory, "factory"); Twitter twitter = factory.getInstance(); Configuration configuration = (Configuration) PrivateAccessor.getField(twitter, "conf"); assertEquals(-1, configuration.getHttpProxyPort()); assertNull(configuration.getHttpProxyHost()); } @Test public void activateWithProxyHostWithoutPort() throws Exception { TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory(); adapterFactory.activate(Collections.singletonMap("http.proxy.host", "myproxy"));; TwitterFactory factory = (TwitterFactory) PrivateAccessor.getField(adapterFactory, "factory"); Twitter twitter = factory.getInstance(); Configuration configuration = (Configuration) PrivateAccessor.getField(twitter, "conf"); assertEquals(-1, configuration.getHttpProxyPort()); assertNull(configuration.getHttpProxyHost()); } @Test public void activateWithProxy() throws Exception { TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory(); Map<String, Object> config = new HashMap<String, Object>(); config.put("http.proxy.host", "myproxy"); config.put("http.proxy.port", 8080); adapterFactory.activate(config);; TwitterFactory factory = (TwitterFactory) PrivateAccessor.getField(adapterFactory, "factory"); Twitter twitter = factory.getInstance(); Configuration configuration = (Configuration) PrivateAccessor.getField(twitter, "conf"); assertEquals(8080, configuration.getHttpProxyPort()); assertEquals("myproxy", configuration.getHttpProxyHost()); } @Test public void testAdaptFromValidConfiguration() throws Exception { com.day.cq.wcm.webservicesupport.Configuration config = setupConfiguration(validOauthValueMap); Twitter twitter = mock(Twitter.class); TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory() { @Override Twitter getInstance() { return twitter; } }; TwitterClient client = adapterFactory.getAdapter(config, TwitterClient.class); assertNotNull(client); Twitter adapterTwitter = adapterFactory.getAdapter(config, Twitter.class); assertEquals(twitter, adapterTwitter); verify(twitter, times(2)).setOAuthConsumer(VALID_OAUTH_CLIENT_ID, VALID_OAUTH_SECRET); verify(twitter, times(2)).getOAuth2Token(); verifyNoMoreInteractions(twitter); } @Test public void testAdaptFromInvalidConfiguration() throws Exception { com.day.cq.wcm.webservicesupport.Configuration config = setupConfiguration(ValueMap.EMPTY); TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory(); TwitterClient client = adapterFactory.getAdapter(config, TwitterClient.class); assertNull(client); } @Test public void testAdaptFromValidConfigurationUnableToCreateClient() throws Exception { com.day.cq.wcm.webservicesupport.Configuration config = setupConfiguration(validOauthValueMap); Twitter twitter = mock(Twitter.class); doThrow(new TwitterException("test")).when(twitter).getOAuth2Token(); TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory() { @Override Twitter getInstance() { return twitter; } }; TwitterClient client = adapterFactory.getAdapter(config, TwitterClient.class); assertNull(client); verify(twitter, times(1)).setOAuthConsumer(VALID_OAUTH_CLIENT_ID, VALID_OAUTH_SECRET); verify(twitter, times(1)).getOAuth2Token(); verifyNoMoreInteractions(twitter); } @Test public void testAdaptFromValidPage() throws Exception { Page page = setupPage(validOauthValueMap); Twitter twitter = mock(Twitter.class); TwitterAdapterFactory adapterFactory = new TwitterAdapterFactory() { @Override Twitter getInstance() { return twitter; } }; TwitterClient client = adapterFactory.getAdapter(page, TwitterClient.class); assertNotNull(client); Twitter adapterTwitter = adapterFactory.getAdapter(page, Twitter.class); assertEquals(twitter, adapterTwitter); verify(twitter, times(2)).setOAuthConsumer(VALID_OAUTH_CLIENT_ID, VALID_OAUTH_SECRET); verify(twitter, times(2)).getOAuth2Token(); verifyNoMoreInteractions(twitter); } private Page setupPage(ValueMap configData) { com.day.cq.wcm.webservicesupport.Configuration config = setupConfiguration(configData); String[] configPath = new String[] { "configpath "}; Page page = mock(Page.class); Resource contentResource = mock(Resource.class); when(page.getContentResource()).thenReturn(contentResource); ResourceResolver resourceResolver = mock(ResourceResolver.class); when(contentResource.getResourceResolver()).thenReturn(resourceResolver); ConfigurationManager configurationManager = mock(ConfigurationManager.class); when(resourceResolver.adaptTo(ConfigurationManager.class)).thenReturn(configurationManager); when(contentResource.getValueMap()).thenReturn(new ValueMapDecorator(Collections.singletonMap(ConfigurationConstants.PN_CONFIGURATIONS, configPath))); when(configurationManager.getConfiguration("twitterconnect", configPath)).thenReturn(config); return page; } @Before public void setup() { Map<String, Object> validOAuthConfig = new HashMap<>(); validOAuthConfig.put("oauth.client.id", VALID_OAUTH_CLIENT_ID); validOAuthConfig.put("oauth.client.secret", VALID_OAUTH_SECRET); this.validOauthValueMap = new ValueMapDecorator(validOAuthConfig); } private com.day.cq.wcm.webservicesupport.Configuration setupConfiguration(ValueMap configData) { com.day.cq.wcm.webservicesupport.Configuration config = mock(com.day.cq.wcm.webservicesupport.Configuration.class); Resource contentResource = mock(Resource.class); Resource oauthResource = mock(Resource.class); when(config.getContentResource()).thenReturn(contentResource); when(contentResource.listChildren()).thenAnswer(i -> Collections.singleton(oauthResource).iterator()); when(oauthResource.getValueMap()).thenReturn(configData); return config; } }