private BraintreeFragment getMockFragment(String authorization, Configuration configuration) { try { return new MockFragmentBuilder() .authorization(Authorization.fromString(authorization)) .configuration(configuration) .build(); } catch (InvalidArgumentException e) { fail(e.getMessage()); return null; } }
@Before public void setup() { mMockFragmentBuilder = new MockFragmentBuilder() .context(RuntimeEnvironment.application); }
@Test public void fetchCapabilities_callsListenerWithErrorOnFailure() { RuntimeException expected = new RuntimeException("expected runtime exception"); BraintreeFragment fragment = new MockFragmentBuilder() .configuration(mConfigurationWithUnionPay) .errorResponse(expected) .build(); UnionPay.fetchCapabilities(fragment, UNIONPAY_CREDIT); verify(fragment).postCallback(expected); }
@Before public void setup() throws JSONException { mConfigurationWithUnionPay = Configuration.fromJson(stringFromFixture("configuration/with_unionpay.json")); mBraintreeFragment = new MockFragmentBuilder() .configuration(mConfigurationWithUnionPay) .build(); }
@Test public void fetchCapabilities_sendsAnalyticsEventOnSuccess() throws JSONException { BraintreeFragment fragment = new MockFragmentBuilder() .configuration(mConfigurationWithUnionPay) .successResponse(stringFromFixture("unionpay_capabilities_success_response.json")) .build(); UnionPay.fetchCapabilities(fragment, UNIONPAY_CREDIT); verify(fragment).sendAnalyticsEvent("union-pay.capabilities-received"); }
@Test public void deletePaymentMethodNonce_withApiBelowLollipop_doesNotPostToGraphQL() throws InvalidArgumentException { Authorization authorization = Authorization.fromString(stringFromFixture("client_token.json")); BraintreeFragment fragment = new MockFragmentBuilder() .authorization(authorization) .graphQLSuccessResponse("Success") .sessionId("test-session-id") .integration("test-integration") .build(); PaymentMethod.deletePaymentMethod(fragment, mCardNonce); ArgumentCaptor<Exception> captor = ArgumentCaptor.forClass(Exception.class); verify(fragment).postCallback(captor.capture()); assertTrue(captor.getValue() instanceof BraintreeException); assertEquals("Payment Method Nonce deletion is not supported for API < 21", captor.getValue().getMessage()); verifyZeroInteractions(fragment.getGraphQLHttpClient()); } }
@Test public void getPaymentMethodNonces_sendsAnAnalyticsEventForParsingErrors() { BraintreeFragment fragment = new MockFragmentBuilder() .successResponse("{}") .build(); PaymentMethod.getPaymentMethodNonces(fragment); verify(fragment).sendAnalyticsEvent("get-payment-methods.failed"); }
@Test public void collectDeviceData() throws JSONException { BraintreeFragment fragment = new MockFragmentBuilder().build(); String deviceData = DataCollector.collectDeviceData(fragment); JSONObject json = new JSONObject(deviceData); assertFalse(TextUtils.isEmpty(json.getString("device_session_id"))); assertEquals("600000", json.getString("fraud_merchant_id")); assertNotNull(json.getString("correlation_id")); }
@Test public void getAuthorizationRequest_buildsWithLiveStageUrl() throws JSONException, InvalidArgumentException { Configuration configuration = Configuration.fromJson(stringFromFixture("configuration/with_live_paypal.json")); BraintreeFragment fragment = mMockFragmentBuilder .authorization(Authorization.fromString(TOKENIZATION_KEY)) .configuration(configuration) .build(); Request request = PayPal.getAuthorizationRequest(fragment); assertEquals(EnvironmentManager.LIVE, request.getEnvironment()); }
@Config(sdk = 21) @Test public void deletePaymentMethodNonce_sendAnAnalyticsEventForFailure() throws InvalidArgumentException { Authorization authorization = Authorization.fromString(stringFromFixture("client_token.json")); BraintreeFragment fragment = new MockFragmentBuilder() .authorization(authorization) .graphQLErrorResponse(new UnexpectedException("Error")) .build(); PaymentMethod.deletePaymentMethod(fragment, mCardNonce); verify(fragment).sendAnalyticsEvent("delete-payment-methods.failed"); }
@Config(sdk = 21) @Test public void deletePaymentMethodNonce_sendNoncePostCallbackForSuccess() throws InvalidArgumentException { Authorization authorization = Authorization.fromString(stringFromFixture("client_token.json")); BraintreeFragment fragment = new MockFragmentBuilder() .authorization(authorization) .graphQLSuccessResponse("Success") .build(); PaymentMethod.deletePaymentMethod(fragment, mCardNonce); verify(fragment).postPaymentMethodDeletedCallback(eq(mCardNonce)); }
@Test public void getCheckoutRequest_buildsWithLiveStageUrl() throws JSONException { Configuration configuration = Configuration.fromJson(stringFromFixture("configuration/with_live_paypal.json")); BraintreeFragment fragment = mMockFragmentBuilder.configuration(configuration).build(); Request request = PayPal.getCheckoutRequest(fragment, null); assertEquals(EnvironmentManager.LIVE, request.getEnvironment()); }
@Config(sdk = 21) @Test public void tokenize_sendGraphQLAnalyticsEventOnSuccess() { BraintreeFragment fragment = new MockFragmentBuilder() .configuration(new TestConfigurationBuilder() .graphQL() .build()) .graphQLSuccessResponse(stringFromFixture("response/graphql/credit_card.json")) .build(); CardBuilder cardBuilder = new CardBuilder(); TokenizationClient.tokenize(fragment, cardBuilder, new PaymentMethodNonceCallback() { @Override public void success(PaymentMethodNonce paymentMethodNonce) {} @Override public void failure(Exception exception) {} }); verify(fragment).sendAnalyticsEvent("card.graphql.tokenization.success"); }
@Config(sdk = 21) @Test public void tokenize_sendGraphQLAnalyticsEventOnFailure() { BraintreeFragment fragment = new MockFragmentBuilder() .configuration(new TestConfigurationBuilder() .graphQL() .build()) .graphQLErrorResponse(ErrorWithResponse.fromGraphQLJson(stringFromFixture("errors/graphql/credit_card_error.json"))) .build(); CardBuilder cardBuilder = new CardBuilder(); TokenizationClient.tokenize(fragment, cardBuilder, new PaymentMethodNonceCallback() { @Override public void success(PaymentMethodNonce paymentMethodNonce) {} @Override public void failure(Exception exception) {} }); verify(fragment).sendAnalyticsEvent("card.graphql.tokenization.failure"); }
@Test public void getPaymentMethodNonces_throwsAnError() { BraintreeFragment fragment = new MockFragmentBuilder() .errorResponse(new UnexpectedException("Error")) .build(); PaymentMethod.getPaymentMethodNonces(fragment); ArgumentCaptor<Exception> captor = ArgumentCaptor.forClass(Exception.class); verify(fragment).postCallback(captor.capture()); assertTrue(captor.getValue() instanceof UnexpectedException); }
@Before public void setup() throws Exception { spy(PayPal.class); doReturn(true).when(PayPal.class, "isManifestValid", any(Context.class)); spy(Recipe.class); doReturn(true).when(Recipe.class, "isValidBrowserTarget", any(Context.class), anyString(), anyString()); Authorization authorization = mock(Authorization.class); when(authorization.getBearer()).thenReturn("authorization"); when(authorization.toString()).thenReturn("authorization"); Configuration configuration = new TestConfigurationBuilder() .withAnalytics() .paypal(new TestPayPalConfigurationBuilder(true) .environment("offline") .billingAgreementsEnabled(false)) .buildConfiguration(); mMockFragmentBuilder = new MockFragmentBuilder() .authorization(authorization) .configuration(configuration); }
@Test public void requestBillingAgreement_postsExceptionWhenAmountIsIncluded() { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestBillingAgreement(fragment, new PayPalRequest("1")); ArgumentCaptor<Exception> captor = ArgumentCaptor.forClass(Exception.class); verify(fragment).postCallback(captor.capture()); assertTrue(captor.getValue() instanceof BraintreeException); assertEquals("There must be no amount specified for the Billing Agreement flow", captor.getValue().getMessage()); }
@Test public void requestOneTimePayment_userAction_canBeSetToCommit() { BraintreeFragment fragment = mMockFragmentBuilder .successResponse(stringFromFixture("paypal_hermes_response.json")) .build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").userAction(PayPalRequest.USER_ACTION_COMMIT)); ArgumentCaptor<Intent> dataCaptor = ArgumentCaptor.forClass(Intent.class); verify(fragment).browserSwitch(eq(BraintreeRequestCodes.PAYPAL), dataCaptor.capture()); Uri uri = dataCaptor.getValue().getData(); assertEquals("commit", uri.getQueryParameter("useraction")); }
@Test public void openVenmoAppPageInGooglePlay_opensVenmoAppStoreURL() throws JSONException { Configuration configuration = new TestConfigurationBuilder().buildConfiguration(); BraintreeFragment fragment = new MockFragmentBuilder() .configuration(configuration) .build(); Venmo.openVenmoAppPageInGooglePlay(fragment); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(fragment).startActivity(captor.capture()); assertEquals(captor.getValue().getData().toString(),"https://play.google.com/store/apps/details?id=com.venmo"); }
@Test public void getRewardsBalance_sendsAnalyticsEventOnParseError() { BraintreeFragment fragment = new MockFragmentBuilder() .configuration(mConfiguration) .successResponse("-- not json --") .build(); AmericanExpress.getRewardsBalance(fragment, "fake-nonce", "USD"); verify(fragment).sendAnalyticsEvent("amex.rewards-balance.start"); verify(fragment).sendAnalyticsEvent("amex.rewards-balance.parse.failed"); } }