package com.braintreegateway.integrationtest;
import com.braintreegateway.*;
import com.braintreegateway.exceptions.AuthenticationException;
import com.braintreegateway.testhelpers.TestHelper;
import org.junit.Test;
import org.junit.Before;
import java.util.*;
import java.net.URL;
import static org.junit.Assert.*;
public class OAuthIT extends IntegrationTest {
@Before
public void createGateway() {
this.gateway = new BraintreeGateway("client_id$development$integration_client_id",
"client_secret$development$integration_client_secret"
);
}
@Test
public void createTokenFromCodeReturnsOAuthCredentials() {
String code = TestHelper.createOAuthGrant(gateway, "integration_merchant_id", "read_write");
OAuthCredentialsRequest oauthCredentials = new OAuthCredentialsRequest().
code(code).
scope("read_write");
Result<OAuthCredentials> result = gateway.oauth().createTokenFromCode(oauthCredentials);
assertTrue(result.isSuccess());
assertTrue(result.getTarget().getAccessToken().startsWith("access_token"));
assertTrue(result.getTarget().getExpiresAt().after(Calendar.getInstance()));
assertTrue(result.getTarget().getRefreshToken().startsWith("refresh_token"));
assertEquals("bearer", result.getTarget().getTokenType());
}
@Test
public void createTokenFromBadCodeReturnsOAuthCredentials() {
OAuthCredentialsRequest oauthCredentials = new OAuthCredentialsRequest().
code("bad_code").
scope("read_write");
Result<OAuthCredentials> result = gateway.oauth().createTokenFromCode(oauthCredentials);
ValidationErrors errors = result.getErrors();
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.OAUTH_INVALID_GRANT, errors.forObject("credentials").onField("code").get(0).getCode());
assertEquals("Invalid grant: code not found", errors.forObject("credentials").onField("code").get(0).getMessage());
}
@Test
public void createTokenFromRefreshToken() {
String code = TestHelper.createOAuthGrant(gateway, "integration_merchant_id", "read_write");
OAuthCredentialsRequest oauthCredentials = new OAuthCredentialsRequest().
code(code).
scope("read_write");
Result<OAuthCredentials> result = gateway.oauth().createTokenFromCode(oauthCredentials);
OAuthCredentialsRequest refreshTokenRequest = new OAuthCredentialsRequest().
refreshToken(result.getTarget().getRefreshToken()).
scope("read_write");
Result<OAuthCredentials> refreshTokenResult = gateway.oauth().createTokenFromRefreshToken(refreshTokenRequest);
assertTrue(refreshTokenResult.isSuccess());
assertNotNull(refreshTokenResult.getTarget().getAccessToken());
assertNotNull(refreshTokenResult.getTarget().getRefreshToken());
assertNotNull(refreshTokenResult.getTarget().getExpiresAt());
assertEquals("bearer", refreshTokenResult.getTarget().getTokenType());
}
@Test(expected = AuthenticationException.class)
public void revokeAccessToken() {
String code = TestHelper.createOAuthGrant(gateway, "integration_merchant_id", "read_write");
OAuthCredentialsRequest oauthCredentials = new OAuthCredentialsRequest().
code(code).
scope("read_write");
Result<OAuthCredentials> result = gateway.oauth().createTokenFromCode(oauthCredentials);
String accessToken = result.getTarget().getAccessToken();
Result<OAuthResult> revokeAccessTokenResult = gateway.oauth().revokeAccessToken(accessToken);
assertTrue(revokeAccessTokenResult.isSuccess());
assertTrue(revokeAccessTokenResult.getTarget().getResult());
gateway = new BraintreeGateway(accessToken);
gateway.customer().create(new CustomerRequest());
}
@Test
public void connectUrlReturnsCorrectUrl() {
OAuthConnectUrlRequest request = new OAuthConnectUrlRequest().
merchantId("integration_merchant_id").
redirectUri("http://bar.example.com").
scope("read_write").
state("baz_state").
landingPage("login").
user().
country("USA").
email("foo@example.com").
firstName("Bob").
lastName("Jones").
phone("555-555-5555").
dobYear("1970").
dobMonth("01").
dobDay("01").
streetAddress("222 W Merchandise Mart").
locality("Chicago").
region("IL").
postalCode("60606").
done().
business().
name("14 Ladders").
registeredAs("14.0 Ladders").
industry("Ladders").
description("We sell the best ladders").
streetAddress("111 N Canal").
locality("Chicago").
region("IL").
postalCode("60606").
country("USA").
annualVolumeAmount("1000000").
averageTransactionAmount("100").
maximumTransactionAmount("10000").
shipPhysicalGoods(true).
fulfillmentCompletedIn(7).
currency("USD").
website("http://example.com").
establishedOn("1988-10").
done();
String urlString = gateway.oauth().connectUrl(request);
URL url;
try {
url = new URL(urlString);
assertEquals("localhost", url.getHost());
assertEquals("/oauth/connect", url.getPath());
Map<String, String> query = TestHelper.splitQuery(url);
assertEquals("integration_merchant_id", query.get("merchant_id"));
assertEquals("client_id$development$integration_client_id", query.get("client_id"));
assertEquals("http://bar.example.com", query.get("redirect_uri"));
assertEquals("read_write", query.get("scope"));
assertEquals("baz_state", query.get("state"));
assertEquals("login", query.get("landing_page"));
assertEquals("USA", query.get("user[country]"));
assertEquals("USA", query.get("user[country]"));
assertEquals("foo@example.com", query.get("user[email]"));
assertEquals("Bob", query.get("user[first_name]"));
assertEquals("Jones", query.get("user[last_name]"));
assertEquals("555-555-5555", query.get("user[phone]"));
assertEquals("1970", query.get("user[dob_year]"));
assertEquals("01", query.get("user[dob_month]"));
assertEquals("01", query.get("user[dob_day]"));
assertEquals("222 W Merchandise Mart", query.get("user[street_address]"));
assertEquals("Chicago", query.get("user[locality]"));
assertEquals("IL", query.get("user[region]"));
assertEquals("60606", query.get("user[postal_code]"));
assertEquals("14 Ladders", query.get("business[name]"));
assertEquals("14.0 Ladders", query.get("business[registered_as]"));
assertEquals("Ladders", query.get("business[industry]"));
assertEquals("We sell the best ladders", query.get("business[description]"));
assertEquals("111 N Canal", query.get("business[street_address]"));
assertEquals("Chicago", query.get("business[locality]"));
assertEquals("IL", query.get("business[region]"));
assertEquals("60606", query.get("business[postal_code]"));
assertEquals("USA", query.get("business[country]"));
assertEquals("1000000", query.get("business[annual_volume_amount]"));
assertEquals("100", query.get("business[average_transaction_amount]"));
assertEquals("10000", query.get("business[maximum_transaction_amount]"));
assertEquals("true", query.get("business[ship_physical_goods]"));
assertEquals("7", query.get("business[fulfillment_completed_in]"));
assertEquals("USD", query.get("business[currency]"));
assertEquals("http://example.com", query.get("business[website]"));
assertEquals("1988-10", query.get("business[established_on]"));
assertEquals(64, query.get("signature").length());
assertTrue(query.get("signature").matches("^[a-f0-9]+$"));
assertEquals("SHA256", query.get("algorithm"));
} catch (java.io.UnsupportedEncodingException e) {
fail("unsupported encoding");
} catch (java.net.MalformedURLException e) {
fail("malformed url");
}
}
@Test
public void connectUrlReturnsCorrectUrlWithoutOptionalParams() {
OAuthConnectUrlRequest request = new OAuthConnectUrlRequest();
String urlString = gateway.oauth().connectUrl(request);
URL url;
try {
url = new URL(urlString);
Map<String, String> query = TestHelper.splitQuery(url);
assertNull(query.get("redirect_uri"));
} catch (java.io.UnsupportedEncodingException e) {
fail("unsupported encoding");
} catch (java.net.MalformedURLException e) {
fail("malformed url");
}
}
@Test
public void connectUrlReturnsCorrectPaymentMethods() {
OAuthConnectUrlRequest request = new OAuthConnectUrlRequest().
paymentMethods(new String[] {"credit_card", "paypal"});
String urlString = gateway.oauth().connectUrl(request);
URL url;
try {
url = new URL(urlString);
Map<String, String> query = TestHelper.splitQuery(url);
assertNull(query.get("redirect_uri"));
assertEquals("credit_card, paypal", query.get("payment_methods[]"));
} catch (java.io.UnsupportedEncodingException e) {
fail("unsupported encoding");
} catch (java.net.MalformedURLException e) {
fail("malformed url");
}
}
@Test
public void computeSignatureReturnsCorrectSignature() {
String url = "http://localhost:3000/oauth/connect?business%5Bname%5D=We+Like+Spaces&client_id=client_id%24development%24integration_client_id";
String signature = gateway.oauth().computeSignature(url);
assertEquals("a36bcf10dd982e2e47e0d6a2cb930aea47ade73f954b7d59c58dae6167894d41", signature);
}
}