private static void launchWebView(BraintreeFragment fragment, ThreeDSecureLookup threeDSecureLookup) { Intent intent = new Intent(fragment.getApplicationContext(), ThreeDSecureWebViewActivity.class) .putExtra(ThreeDSecureWebViewActivity.EXTRA_THREE_D_SECURE_LOOKUP, threeDSecureLookup); fragment.startActivityForResult(intent, BraintreeRequestCodes.THREE_D_SECURE); }
@Override public void onConfigurationFetched(Configuration configuration) { fragment.sendAnalyticsEvent("android-pay.change-masked-wallet"); Intent intent = new Intent(fragment.getApplicationContext(), AndroidPayActivity.class) .putExtra(EXTRA_ENVIRONMENT, GooglePayment.getEnvironment(configuration.getAndroidPay())) .putExtra(EXTRA_GOOGLE_TRANSACTION_ID, androidPayCardNonce.getGoogleTransactionId()) .putExtra(EXTRA_CART, androidPayCardNonce.getCart()) .putExtra(EXTRA_REQUEST_TYPE, CHANGE_PAYMENT_METHOD); fragment.startActivityForResult(intent, BraintreeRequestCodes.ANDROID_PAY); } });
@Override public void onConfigurationFetched(Configuration configuration) { fragment.sendAnalyticsEvent("android-pay.started"); Intent intent = new Intent(fragment.getApplicationContext(), AndroidPayActivity.class) .putExtra(EXTRA_ENVIRONMENT, GooglePayment.getEnvironment(configuration.getAndroidPay())) .putExtra(EXTRA_MERCHANT_NAME, configuration.getAndroidPay().getDisplayName()) .putExtra(EXTRA_CART, cart) .putExtra(EXTRA_TOKENIZATION_PARAMETERS, GooglePayment.getTokenizationParameters(fragment)) .putIntegerArrayListExtra(EXTRA_ALLOWED_CARD_NETWORKS, GooglePayment.getAllowedCardNetworks(fragment)) .putExtra(EXTRA_SHIPPING_ADDRESS_REQUIRED, shippingAddressRequired) .putExtra(EXTRA_PHONE_NUMBER_REQUIRED, phoneNumberRequired) .putParcelableArrayListExtra(EXTRA_ALLOWED_COUNTRIES, allowedCountries) .putExtra(EXTRA_REQUEST_TYPE, AUTHORIZE); fragment.startActivityForResult(intent, BraintreeRequestCodes.ANDROID_PAY); } });
@Test public void startActivityForResult_doesNotPostExceptionWhenAttached() throws InvalidArgumentException { BraintreeFragment fragment = BraintreeFragment.newInstance(mActivity, TOKENIZATION_KEY); fragment.addListener(new BraintreeErrorListener() { @Override public void onError(Exception error) { fail("onError was called"); } }); fragment.startActivityForResult(new Intent(), 1); assertFalse(mCalled.get()); }
@Test public void changePaymentMethod_startsActivity() { BraintreeFragment fragment = getSetupFragment(); AndroidPayCardNonce androidPayCardNonce = mock(AndroidPayCardNonce.class); when(androidPayCardNonce.getGoogleTransactionId()).thenReturn("google-transaction-id"); Cart cart = Cart.newBuilder().build(); when(androidPayCardNonce.getCart()).thenReturn(cart); AndroidPay.changePaymentMethod(fragment, androidPayCardNonce); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.ANDROID_PAY)); Intent intent = captor.getValue(); assertEquals(AndroidPayActivity.class.getName(), intent.getComponent().getClassName()); assertEquals(CHANGE_PAYMENT_METHOD, intent.getIntExtra(EXTRA_REQUEST_TYPE, -1)); assertEquals(WalletConstants.ENVIRONMENT_TEST, intent.getIntExtra(EXTRA_ENVIRONMENT, -1)); assertEquals("google-transaction-id", intent.getStringExtra(EXTRA_GOOGLE_TRANSACTION_ID)); assertEquals(cart, intent.getParcelableExtra(EXTRA_CART)); }
@Test public void requestAndroidPay_startsActivity() { BraintreeFragment fragment = getSetupFragment(); Cart cart = Cart.newBuilder().build(); ArrayList<CountrySpecification> allowedCountries = new ArrayList<>(); AndroidPay.requestAndroidPay(fragment, cart, true, true, allowedCountries); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.ANDROID_PAY)); Intent intent = captor.getValue(); assertEquals(AndroidPayActivity.class.getName(), intent.getComponent().getClassName()); assertEquals(AUTHORIZE, intent.getIntExtra(EXTRA_REQUEST_TYPE, -1)); assertEquals(WalletConstants.ENVIRONMENT_TEST, intent.getIntExtra(EXTRA_ENVIRONMENT, -1)); assertEquals("", intent.getStringExtra(EXTRA_MERCHANT_NAME)); assertEquals(cart, intent.getParcelableExtra(EXTRA_CART)); assertTrue(intent.getBooleanExtra(EXTRA_SHIPPING_ADDRESS_REQUIRED, false)); assertTrue(intent.getBooleanExtra(EXTRA_PHONE_NUMBER_REQUIRED, false)); assertEquals(allowedCountries, intent.getParcelableArrayListExtra(EXTRA_ALLOWED_COUNTRIES)); assertNotNull(intent.getParcelableExtra(EXTRA_TOKENIZATION_PARAMETERS)); assertNotNull(intent.getIntegerArrayListExtra(EXTRA_ALLOWED_CARD_NETWORKS)); }
@Test public void performAppSwitch_appSwitchesWithVenmoLaunchIntent() throws InvalidArgumentException, JSONException { Configuration configuration = getConfigurationFromFixture(); Authorization clientToken = Authorization.fromString(stringFromFixture("base_64_client_token.txt")); disableSignatureVerification(); BraintreeFragment fragment = new MockFragmentBuilder() .context(VenmoInstalledContextFactory.venmoInstalledContext(true, RuntimeEnvironment.application)) .authorization(clientToken) .configuration(configuration) .build(); when(fragment.getSessionId()).thenReturn("a-session-id"); when(fragment.getIntegrationType()).thenReturn("custom"); Venmo.authorizeAccount(fragment, false); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.VENMO)); assertEquals("com.venmo/com.venmo.controller.SetupMerchantActivity", captor.getValue().getComponent().flattenToString()); Bundle extras = captor.getValue().getExtras(); assertEquals("merchant-id", extras.getString(Venmo.EXTRA_MERCHANT_ID)); assertEquals("access-token", extras.getString(Venmo.EXTRA_ACCESS_TOKEN)); assertEquals("environment", extras.getString(Venmo.EXTRA_ENVIRONMENT)); JSONObject braintreeData = new JSONObject(extras.getString(Venmo.EXTRA_BRAINTREE_DATA)); JSONObject meta = braintreeData.getJSONObject("_meta"); assertNotNull(meta); assertEquals(fragment.getSessionId(), meta.getString("sessionId")); assertEquals(fragment.getIntegrationType(), meta.getString("integration")); assertEquals(BuildConfig.VERSION_NAME, meta.getString("version")); assertEquals("android", meta.getString("platform")); }
@Test public void startActivityForResult_postsExceptionWhenNotAttached() throws InvalidArgumentException { BraintreeFragment fragment = BraintreeFragment.newInstance(mActivity, TOKENIZATION_KEY); mActivity.getFragmentManager().beginTransaction().detach(fragment).commit(); mActivity.getFragmentManager().executePendingTransactions(); fragment.addListener(new BraintreeErrorListener() { @Override public void onError(Exception error) { assertEquals("BraintreeFragment is not attached to an Activity. Please ensure it is attached and try again.", error.getMessage()); mCalled.set(true); } }); fragment.startActivityForResult(new Intent(), 1); assertTrue(mCalled.get()); }
@Test public void getLaunchIntent_doesNotContainAuthFingerprintWhenUsingTokenziationkey() throws JSONException, InvalidArgumentException { Configuration configuration = getConfigurationFromFixture(); Authorization clientToken = Authorization.fromString(TestTokenizationKey.TOKENIZATION_KEY); disableSignatureVerification(); BraintreeFragment fragment = new MockFragmentBuilder() .context(VenmoInstalledContextFactory.venmoInstalledContext(true, RuntimeEnvironment.application)) .authorization(clientToken) .configuration(configuration) .build(); when(fragment.getSessionId()).thenReturn("a-session-id"); when(fragment.getIntegrationType()).thenReturn("custom"); Venmo.authorizeAccount(fragment, false); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.VENMO)); assertEquals("com.venmo/com.venmo.controller.SetupMerchantActivity", captor.getValue().getComponent().flattenToString()); Bundle extras = captor.getValue().getExtras(); assertEquals("merchant-id", extras.getString(Venmo.EXTRA_MERCHANT_ID)); assertEquals("access-token", extras.getString(Venmo.EXTRA_ACCESS_TOKEN)); assertEquals("environment", extras.getString(Venmo.EXTRA_ENVIRONMENT)); JSONObject braintreeData = new JSONObject(extras.getString(Venmo.EXTRA_BRAINTREE_DATA)); assertNull(Json.optString(braintreeData, "authorization_fingerprint", null)); }
verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.GOOGLE_PAYMENT)); Intent intent = captor.getValue();
@Test public void performAppSwitch_whenProfileIdIsNull_appSwitchesWithMerchantId() throws InvalidArgumentException, JSONException { Configuration configuration = getConfigurationFromFixture(); Authorization clientToken = Authorization.fromString(stringFromFixture("base_64_client_token.txt")); disableSignatureVerification(); BraintreeFragment fragment = new MockFragmentBuilder() .context(VenmoInstalledContextFactory.venmoInstalledContext(true, RuntimeEnvironment.application)) .authorization(clientToken) .configuration(configuration) .build(); when(fragment.getSessionId()).thenReturn("a-session-id"); when(fragment.getIntegrationType()).thenReturn("custom"); Venmo.authorizeAccount(fragment, false, null); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.VENMO)); assertEquals("com.venmo/com.venmo.controller.SetupMerchantActivity", captor.getValue().getComponent().flattenToString()); Bundle extras = captor.getValue().getExtras(); assertEquals("merchant-id", extras.getString(Venmo.EXTRA_MERCHANT_ID)); assertEquals("access-token", extras.getString(Venmo.EXTRA_ACCESS_TOKEN)); }
@Test public void performAppSwitch_whenProfileIdIsSpecified_appSwitchesWithProfileIdAndAccessToken() throws InvalidArgumentException, JSONException { Configuration configuration = getConfigurationFromFixture(); Authorization clientToken = Authorization.fromString(stringFromFixture("base_64_client_token.txt")); disableSignatureVerification(); BraintreeFragment fragment = new MockFragmentBuilder() .context(VenmoInstalledContextFactory.venmoInstalledContext(true, RuntimeEnvironment.application)) .authorization(clientToken) .configuration(configuration) .build(); when(fragment.getSessionId()).thenReturn("a-session-id"); when(fragment.getIntegrationType()).thenReturn("custom"); Venmo.authorizeAccount(fragment, false, "second-pwv-profile-id"); ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.VENMO)); assertEquals("com.venmo/com.venmo.controller.SetupMerchantActivity", captor.getValue().getComponent().flattenToString()); Bundle extras = captor.getValue().getExtras(); assertEquals("second-pwv-profile-id", extras.getString(Venmo.EXTRA_MERCHANT_ID)); assertEquals("access-token", extras.getString(Venmo.EXTRA_ACCESS_TOKEN)); }
@Override public void handleApproval(Request request, PayPalApprovalCallback paypalApprovalCallback) { PendingRequest pendingRequest = PayPalOneTouchCore.getStartIntent(fragment.getApplicationContext(), request); if (pendingRequest.isSuccess() && pendingRequest.getRequestTarget() == RequestTarget.wallet) { sendAnalyticsForPayPal(fragment, request, true, RequestTarget.wallet); fragment.startActivityForResult(pendingRequest.getIntent(), BraintreeRequestCodes.PAYPAL); } else if (pendingRequest.isSuccess() && pendingRequest.getRequestTarget() == RequestTarget.browser) { sendAnalyticsForPayPal(fragment, request, true, RequestTarget.browser); fragment.browserSwitch(BraintreeRequestCodes.PAYPAL, pendingRequest.getIntent()); } else { sendAnalyticsForPayPal(fragment, request, false, null); } } };
@Test public void requestPayment_startsActivity() { BraintreeFragment fragment = getSetupFragment(); GooglePaymentRequest googlePaymentRequest = new GooglePaymentRequest() .transactionInfo(TransactionInfo.newBuilder() .setTotalPrice("1.00") .setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL) .setCurrencyCode("USD") .build()); GooglePayment.requestPayment(fragment, googlePaymentRequest); verify(fragment).startActivityForResult(any(Intent.class), eq(BraintreeRequestCodes.GOOGLE_PAYMENT)); }
@Override public void onConfigurationFetched(Configuration configuration) { fragment.sendAnalyticsEvent("pay-with-venmo.selected"); String venmoProfileId = profileId; if (TextUtils.isEmpty(venmoProfileId)) { venmoProfileId = configuration.getPayWithVenmo().getMerchantId(); } String exceptionMessage = ""; if (!configuration.getPayWithVenmo().isAccessTokenValid()) { exceptionMessage = "Venmo is not enabled"; } else if (!Venmo.isVenmoInstalled(fragment.getApplicationContext())) { exceptionMessage = "Venmo is not installed"; } if (!TextUtils.isEmpty(exceptionMessage)) { fragment.postCallback(new AppSwitchNotAvailableException(exceptionMessage)); fragment.sendAnalyticsEvent("pay-with-venmo.app-switch.failed"); } else { persistVenmoVaultOption(vault && fragment.getAuthorization() instanceof ClientToken, fragment.getApplicationContext()); fragment.startActivityForResult(getLaunchIntent(configuration.getPayWithVenmo(), venmoProfileId, fragment), BraintreeRequestCodes.VENMO); fragment.sendAnalyticsEvent("pay-with-venmo.app-switch.started"); } } });
verify(fragment).startActivityForResult(captor.capture(), eq(BraintreeRequestCodes.GOOGLE_PAYMENT)); Intent intent = captor.getValue(); PaymentDataRequest paymentDataRequest = intent.getParcelableExtra(EXTRA_PAYMENT_DATA_REQUEST);