package org.apache.streams.twitter.test.api;
import org.apache.streams.twitter.TwitterOAuthConfiguration;
import org.apache.streams.twitter.api.TwitterOAuthRequestInterceptor;
import org.apache.streams.twitter.test.utils.TwitterActivityConvertersTest;
import org.apache.http.HttpHost;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestWrapper;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.protocol.HttpCoreContext;
import org.junit.Test;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import static org.apache.streams.twitter.api.TwitterOAuthRequestInterceptor.encode;
import static org.junit.Assert.assertEquals;
/**
* Created by sblackmon on 3/26/17.
*/
public class TwitterOAuthRequestInterceptorTest {
private static final Logger LOGGER = LoggerFactory.getLogger(TwitterActivityConvertersTest.class);
@Test
public void testEncode() {
assertEquals( "Ladies%20%2B%20Gentlemen", encode("Ladies + Gentlemen"));
assertEquals( "An%20encoded%20string%21", encode("An encoded string!"));
assertEquals( "Dogs%2C%20Cats%20%26%20Mice", encode("Dogs, Cats & Mice"));
assertEquals( "%E2%98%83", encode("☃"));
}
@Test
public void testGenerateSignatureBaseString() {
Map<String,String> testParamMap = new HashMap<>();
testParamMap.put("status", encode("Hello Ladies + Gentlemen, a signed OAuth request!"));
testParamMap.put("include_entities", "true");
testParamMap.put("oauth_consumer_key", "xvz1evFS4wEEPTGEFPHBog");
testParamMap.put("oauth_nonce", "kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg");
testParamMap.put("oauth_signature_method", "HMAC-SHA1");
testParamMap.put("oauth_timestamp", "1318622958");
testParamMap.put("oauth_token", "370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb");
testParamMap.put("oauth_version", "1.0");
String signature_parameter_string = TwitterOAuthRequestInterceptor.generateSignatureParameterString(testParamMap);
String signature_base_string = TwitterOAuthRequestInterceptor.generateSignatureBaseString("POST", "https://api.twitter.com/1/statuses/update.json", signature_parameter_string);
String expected = "POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521";
assertEquals(expected, signature_base_string);
}
/**
* @see <a href=https://dev.twitter.com/oauth/overview/creating-signatures">https://dev.twitter.com/oauth/overview/creating-signatures</a>
*/
@Test
public void testGenerateSignatureParameterString() {
Map<String,String> testParamMap = new HashMap<>();
testParamMap.put("status", encode("Hello Ladies + Gentlemen, a signed OAuth request!"));
testParamMap.put("include_entities", "true");
testParamMap.put("oauth_consumer_key", "xvz1evFS4wEEPTGEFPHBog");
testParamMap.put("oauth_nonce", "kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg");
testParamMap.put("oauth_signature_method", "HMAC-SHA1");
testParamMap.put("oauth_timestamp", "1318622958");
testParamMap.put("oauth_token", "370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb");
testParamMap.put("oauth_version", "1.0");
String signature_parameter_string = TwitterOAuthRequestInterceptor.generateSignatureParameterString(testParamMap);
String expected = "include_entities=true&oauth_consumer_key=xvz1evFS4wEEPTGEFPHBog&oauth_nonce=kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1318622958&oauth_token=370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb&oauth_version=1.0&status=Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21";
assertEquals(expected, signature_parameter_string);
}
@Test
public void testGenerateAuthorizationHeaderString() {
Map<String,String> oauthParamMap = new HashMap<>();
oauthParamMap.put("oauth_consumer_key", "xvz1evFS4wEEPTGEFPHBog");
oauthParamMap.put("oauth_nonce", "kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg");
oauthParamMap.put("oauth_signature", "tnnArxj06cWHq44gCs1OSKk/jLY=");
oauthParamMap.put("oauth_signature_method", "HMAC-SHA1");
oauthParamMap.put("oauth_timestamp", "1318622958");
oauthParamMap.put("oauth_token", "370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb");
oauthParamMap.put("oauth_version", "1.0");
String expected = "OAuth oauth_consumer_key=\"xvz1evFS4wEEPTGEFPHBog\", oauth_nonce=\"kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg\", oauth_signature=\"tnnArxj06cWHq44gCs1OSKk%2FjLY%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1318622958\", oauth_token=\"370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb\", oauth_version=\"1.0\"";
String authorization_header_string = TwitterOAuthRequestInterceptor.generateAuthorizationHeaderString(oauthParamMap);
assertEquals(expected, authorization_header_string);
}
@Test
public void testComputeSignature() throws Exception {
String signature_base_string = "POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521";
String signing_key = "kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE";
String expected = "tnnArxj06cWHq44gCs1OSKk/jLY=";
String oauth_signature = TwitterOAuthRequestInterceptor.computeSignature(signature_base_string, signing_key);
assertEquals(expected, oauth_signature);
}
@Test
public void testProcess() throws Exception {
URI testURI = new URIBuilder()
.setPath("/1/statuses/update.json")
.setParameter("include_entities", "true")
.build();
HttpPost testRequest = new HttpPost(testURI);
testRequest.setEntity(new StringEntity("status="+encode("Hello Ladies + Gentlemen, a signed OAuth request!")));
HttpHost host = new HttpHost("api.twitter.com", -1, "https");
HttpRequestWrapper wrapper = HttpRequestWrapper.wrap(testRequest, host);
TwitterOAuthConfiguration testOauthConfiguration = new TwitterOAuthConfiguration()
.withConsumerKey("xvz1evFS4wEEPTGEFPHBog")
.withConsumerSecret("kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw")
.withAccessToken("370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb")
.withAccessTokenSecret("LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE");
TwitterOAuthRequestInterceptor interceptor = Mockito.spy(new TwitterOAuthRequestInterceptor(testOauthConfiguration));
Mockito.when(interceptor.generateNonce()).thenReturn("kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg");
Mockito.when(interceptor.generateTimestamp()).thenReturn("1318622958");
interceptor.process(wrapper, new HttpCoreContext());
assertEquals(1, wrapper.getHeaders("Authorization").length);
String actual = wrapper.getFirstHeader("Authorization").getValue();
String expected = "OAuth oauth_consumer_key=\"xvz1evFS4wEEPTGEFPHBog\", oauth_nonce=\"kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg\", oauth_signature=\"tnnArxj06cWHq44gCs1OSKk%2FjLY%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1318622958\", oauth_token=\"370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb\", oauth_version=\"1.0\"";
assertEquals(expected, actual);
}
}