package com.braintreegateway.integrationtest; import java.net.URLEncoder; import java.util.List; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.braintreegateway.testhelpers.HttpHelper; import com.braintreegateway.testhelpers.TestHelper; import com.braintreegateway.util.Http; import com.braintreegateway.util.QueryString; import com.braintreegateway.util.NodeWrapper; import com.braintreegateway.*; public class ClientTokenIT extends IntegrationTest { private String urlencode(String string) { String encodedString = ""; try { encodedString = URLEncoder.encode(string, "UTF-8"); } catch (Exception e) { throw new RuntimeException(e); } return encodedString; } private int postResponseCode(String url, QueryString payload) { int responseCode = -1; try { responseCode = HttpHelper.postResponseCode(url, payload.toString()); } catch (java.net.MalformedURLException e) { throw new RuntimeException(e); } catch (java.io.IOException e) { throw new RuntimeException(e); } return responseCode; } private String _getFingerprint(String rawClientToken) { String decodedClientToken = TestHelper.decodeClientToken(rawClientToken); return TestHelper.extractParamFromJson("authorizationFingerprint", decodedClientToken); } @Test public void fingerprintIsAcceptedByTheGateway() { String clientToken = gateway.clientToken().generate(); String authorizationFingerprint = _getFingerprint(clientToken); String encodedFingerprint = ""; try { encodedFingerprint = URLEncoder.encode(authorizationFingerprint, "UTF-8"); } catch (Exception e) { throw new RuntimeException(e); } Configuration configuration = gateway.getConfiguration(); String url = configuration.getBaseURL() + configuration.getMerchantPath() + "/client_api/nonces.json?"; url += "authorizationFingerprint=" + encodedFingerprint; url += "&sharedCustomerIdentifierType=testing&sharedCustomerIdentifier=test-identifier"; int responseCode = -1; try { responseCode = HttpHelper.getResponseCode(url); } catch (java.net.MalformedURLException e) { fail(); } catch (java.io.IOException e) { fail(); } assertEquals(200, responseCode); } @Test public void versionOptionSupported() { ClientTokenRequest clientTokenRequest = new ClientTokenRequest().version(1); String clientToken = gateway.clientToken().generate(clientTokenRequest); int version = TestHelper.extractIntParamFromJson("version", clientToken); assertEquals(1, version); } @Test public void versionDefaultsToTwo() { ClientTokenRequest clientTokenRequest = new ClientTokenRequest(); String encodedClientToken = gateway.clientToken().generate(clientTokenRequest); String decodedClientToken = TestHelper.decodeClientToken(encodedClientToken); int version = TestHelper.extractIntParamFromJson("version", decodedClientToken); assertEquals(2, version); } @Test public void versionDefaultsToTwoWithoutRequest() { String encodedClientToken = gateway.clientToken().generate(); String decodedClientToken = TestHelper.decodeClientToken(encodedClientToken); int version = TestHelper.extractIntParamFromJson("version", decodedClientToken); assertEquals(2, version); } @Test public void fingerprintCanContainCustomerId() { CustomerRequest customerRequest = new CustomerRequest(); Result<Customer> result = gateway.customer().create(customerRequest); assertTrue(result.isSuccess()); Customer customer = result.getTarget(); ClientTokenRequest clientTokenRequest = new ClientTokenRequest() .customerId(customer.getId()); String clientToken = gateway.clientToken().generate(clientTokenRequest); String authorizationFingerprint = _getFingerprint(clientToken); String encodedFingerprint = ""; try { encodedFingerprint = URLEncoder.encode(authorizationFingerprint, "UTF-8"); } catch (Exception e) { throw new RuntimeException(e); } Configuration configuration = gateway.getConfiguration(); String url = configuration.getBaseURL() + configuration.getMerchantPath() + "/client_api/nonces.json?"; url += "authorizationFingerprint=" + encodedFingerprint; url += "&sharedCustomerIdentifierType=testing&sharedCustomerIdentifier=test-identifier"; int responseCode = -1; try { responseCode = HttpHelper.getResponseCode(url); } catch (java.net.MalformedURLException e) { fail(); } catch (java.io.IOException e) { fail(); } assertEquals(200, responseCode); } @Test public void gatewayRespectsVerifyCard() { CustomerRequest customerRequest = new CustomerRequest(); Result<Customer> result = gateway.customer().create(customerRequest); assertTrue(result.isSuccess()); Customer customer = result.getTarget(); ClientTokenRequest clientTokenRequest = new ClientTokenRequest() .customerId(customer.getId()) .options(new ClientTokenOptionsRequest().verifyCard(true)); String clientToken = gateway.clientToken().generate(clientTokenRequest); String authorizationFingerprint = _getFingerprint(clientToken); Configuration configuration = gateway.getConfiguration(); String url = configuration.getBaseURL() + configuration.getMerchantPath() + "/client_api/nonces.json"; QueryString payload = new QueryString(); payload.append("authorization_fingerprint", authorizationFingerprint). append("shared_customer_identifier_type", "testing"). append("shared_customer_identifier", "test-identifier"). append("credit_card[number]", "4000111111111115"). append("credit_card[expiration_month]", "11"). append("credit_card[expiration_year]", "2099"); int responseCode = postResponseCode(url, payload); assertEquals(422, responseCode); int new_card_count = gateway.customer().find(customer.getId()).getCreditCards().size(); assertEquals(0, new_card_count); } @Test public void gatewayRespectsMakeDefault() { CustomerRequest customerRequest = new CustomerRequest(); Result<Customer> result = gateway.customer().create(customerRequest); assertTrue(result.isSuccess()); Customer customer = result.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest() .customerId(customer.getId()) .number("5105105105105100") .expirationDate("11/2099"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); ClientTokenRequest clientTokenRequest = new ClientTokenRequest() .customerId(customer.getId()) .options(new ClientTokenOptionsRequest().makeDefault(true)); String clientToken = gateway.clientToken().generate(clientTokenRequest); String authorizationFingerprint = _getFingerprint(clientToken); Configuration configuration = gateway.getConfiguration(); String url = configuration.getBaseURL() + configuration.getMerchantPath() + "/client_api/nonces.json"; QueryString payload = new QueryString(); payload.append("authorization_fingerprint", authorizationFingerprint). append("shared_customer_identifier_type", "testing"). append("shared_customer_identifier", "test-identifier"). append("credit_card[number]", "4111111111111111"). append("credit_card[expiration_month]", "11"). append("credit_card[expiration_year]", "2099"); int responseCode = postResponseCode(url, payload); assertEquals(201, responseCode); List<CreditCard> creditCards = gateway.customer().find(customer.getId()).getCreditCards(); assertEquals(2, creditCards.size()); for (CreditCard creditCard : creditCards) { if (creditCard.getLast4().equals("1111")) { assertTrue(creditCard.isDefault()); } } } @Test public void gatewayRespectsFailOnDuplicatePaymentMethod() { CustomerRequest customerRequest = new CustomerRequest(); Result<Customer> result = gateway.customer().create(customerRequest); assertTrue(result.isSuccess()); Customer customer = result.getTarget(); ClientTokenRequest clientTokenRequest = new ClientTokenRequest() .customerId(customer.getId()) .options(new ClientTokenOptionsRequest().failOnDuplicatePaymentMethod(false)); String clientToken = gateway.clientToken().generate(clientTokenRequest); String authorizationFingerprint = _getFingerprint(clientToken); Configuration configuration = gateway.getConfiguration(); String url = configuration.getBaseURL() + configuration.getMerchantPath() + "/client_api/nonces.json"; QueryString payload = new QueryString(); payload.append("authorization_fingerprint", authorizationFingerprint). append("shared_customer_identifier_type", "testing"). append("shared_customer_identifier", "test-identifier"). append("credit_card[number]", "4111111111111111"). append("credit_card[expiration_month]", "11"). append("credit_card[expiration_year]", "2099"); int responseCode = postResponseCode(url, payload); assertEquals(201, responseCode); clientTokenRequest = new ClientTokenRequest() .customerId(customer.getId()) .options(new ClientTokenOptionsRequest().failOnDuplicatePaymentMethod(true)); clientToken = gateway.clientToken().generate(clientTokenRequest); authorizationFingerprint = _getFingerprint(clientToken); url = configuration.getBaseURL() + configuration.getMerchantPath() + "/client_api/nonces.json"; payload = new QueryString(); payload.append("authorization_fingerprint", authorizationFingerprint). append("shared_customer_identifier_type", "testing"). append("shared_customer_identifier", "test-identifier"). append("credit_card[number]", "4111111111111111"). append("credit_card[expiration_month]", "11"). append("credit_card[expiration_year]", "2099"); responseCode = postResponseCode(url, payload); assertEquals(422, responseCode); int new_card_count = gateway.customer().find(customer.getId()).getCreditCards().size(); assertEquals(1, new_card_count); } }