package com.github.scribejava.core.oauth;
import com.github.scribejava.core.builder.ServiceBuilder;
import com.github.scribejava.core.model.OAuth2AccessToken;
import com.github.scribejava.core.model.OAuth2Authorization;
import com.github.scribejava.core.model.OAuthConstants;
import com.github.scribejava.core.services.Base64Encoder;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.concurrent.ExecutionException;
public class OAuth20ServiceTest {
@Test
public void shouldProduceCorrectRequestSync() throws IOException, InterruptedException, ExecutionException {
final OAuth20Service service = new ServiceBuilder()
.apiKey("your_api_key")
.apiSecret("your_api_secret")
.build(new OAuth20ApiUnit());
final OAuth2AccessToken token = service.getAccessTokenPasswordGrant("user1", "password1");
final Gson json = new Gson();
assertNotNull(token);
final Map<String, String> map = json.fromJson(token.getRawResponse(), new TypeTokenImpl().getType());
assertEquals(OAuth20ServiceUnit.TOKEN, map.get(OAuthConstants.ACCESS_TOKEN));
assertEquals(OAuth20ServiceUnit.STATE, map.get(OAuthConstants.STATE));
assertEquals(OAuth20ServiceUnit.EXPIRES, map.get("expires_in"));
final String authorize = Base64Encoder.getInstance()
.encode(String.format("%s:%s", service.getConfig().getApiKey(), service.getConfig().getApiSecret())
.getBytes(Charset.forName("UTF-8")));
assertEquals(OAuthConstants.BASIC + " " + authorize, map.get(OAuthConstants.HEADER));
assertEquals("user1", map.get("query-username"));
assertEquals("password1", map.get("query-password"));
assertEquals("password", map.get("query-grant_type"));
}
@Test
public void shouldProduceCorrectRequestAsync() throws ExecutionException, InterruptedException {
final OAuth20Service service = new ServiceBuilder()
.apiKey("your_api_key")
.apiSecret("your_api_secret")
.build(new OAuth20ApiUnit());
final OAuth2AccessToken token = service.getAccessTokenPasswordGrantAsync("user1", "password1", null).get();
final Gson json = new Gson();
assertNotNull(token);
final Map<String, String> map = json.fromJson(token.getRawResponse(), new TypeTokenImpl().getType());
assertEquals(OAuth20ServiceUnit.TOKEN, map.get(OAuthConstants.ACCESS_TOKEN));
assertEquals(OAuth20ServiceUnit.STATE, map.get(OAuthConstants.STATE));
assertEquals(OAuth20ServiceUnit.EXPIRES, map.get("expires_in"));
final String authorize = Base64Encoder.getInstance()
.encode(String.format("%s:%s", service.getConfig().getApiKey(), service.getConfig().getApiSecret())
.getBytes(Charset.forName("UTF-8")));
assertEquals(OAuthConstants.BASIC + " " + authorize, map.get(OAuthConstants.HEADER));
assertEquals("user1", map.get("query-username"));
assertEquals("password1", map.get("query-password"));
assertEquals("password", map.get("query-grant_type"));
}
@Test
public void testOAuthExtractAuthorization() {
final OAuth20Service service = new ServiceBuilder()
.apiKey("your_api_key")
.apiSecret("your_api_secret")
.build(new OAuth20ApiUnit());
OAuth2Authorization authorization = service.extractAuthorization("https://cl.ex.com/cb?code=SplxlOB&state=xyz");
assertEquals("SplxlOB", authorization.getCode());
assertEquals("xyz", authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?state=xyz&code=SplxlOB");
assertEquals("SplxlOB", authorization.getCode());
assertEquals("xyz", authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?key=value&state=xyz&code=SplxlOB");
assertEquals("SplxlOB", authorization.getCode());
assertEquals("xyz", authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?state=xyz&code=SplxlOB&key=value&");
assertEquals("SplxlOB", authorization.getCode());
assertEquals("xyz", authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?code=SplxlOB&state=");
assertEquals("SplxlOB", authorization.getCode());
assertEquals(null, authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?code=SplxlOB");
assertEquals("SplxlOB", authorization.getCode());
assertEquals(null, authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?code=");
assertEquals(null, authorization.getCode());
assertEquals(null, authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?code");
assertEquals(null, authorization.getCode());
assertEquals(null, authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb?");
assertEquals(null, authorization.getCode());
assertEquals(null, authorization.getState());
authorization = service.extractAuthorization("https://cl.ex.com/cb");
assertEquals(null, authorization.getCode());
assertEquals(null, authorization.getState());
}
private static class TypeTokenImpl extends TypeToken<Map<String, String>> {
private TypeTokenImpl() {
}
}
}