@VisibleForTesting static CheckoutRequest getCheckoutRequest(BraintreeFragment fragment, String redirectUrl) { CheckoutRequest request = populateRequestData(fragment, new CheckoutRequest()) .approvalURL(redirectUrl); if (redirectUrl != null) { Uri uri = Uri.parse(redirectUrl); String pairingId = uri.getQueryParameter("token"); if (pairingId != null) { request.pairingId(fragment.getApplicationContext(), pairingId); } } return request; }
@Override public void trackFpti(Context context, TrackingPoint trackingPoint, Protocol protocol) { String ecToken = Uri.parse(mApprovalUrl).getQueryParameter(mTokenQueryParamKey); Map<String, String> fptiDataBundle = new HashMap<>(); fptiDataBundle.put("fltk", ecToken); fptiDataBundle.put("clid", getClientId()); PayPalOneTouchCore.getFptiManager(context) .trackFpti(trackingPoint, getEnvironment(), fptiDataBundle, protocol); }
public CheckoutRequest pairingId(Context context, String pairingId) { mPairingId = pairingId; clientMetadataId(PayPalOneTouchCore.getClientMetadataId(context, pairingId)); return this; }
@Test public void parcels() { CheckoutRequest request = new CheckoutRequest() .environment("test") .clientId("client-id") .pairingId(RuntimeEnvironment.application, "pairing-id") .clientMetadataId("client-metadata-id") .cancelUrl("com.braintreepayments.demo.braintree.cancel", "cancel") .successUrl("com.braintreepayments.demo.braintree.success", "success") .approvalURL("com.braintreepayments.demo.braintree.approval-url"); Parcel parcel = Parcel.obtain(); request.writeToParcel(parcel, 0); parcel.setDataPosition(0); CheckoutRequest parceledRequest = CheckoutRequest.CREATOR.createFromParcel(parcel); assertEquals("test", parceledRequest.getEnvironment()); assertEquals("client-id", parceledRequest.getClientId()); assertEquals("client-metadata-id", parceledRequest.getClientMetadataId()); assertEquals("pairing-id", parceledRequest.getPairingId()); assertEquals("com.braintreepayments.demo.braintree.cancel://onetouch/v1/cancel", parceledRequest.getCancelUrl()); assertEquals("com.braintreepayments.demo.braintree.success://onetouch/v1/success", parceledRequest.getSuccessUrl()); assertEquals("com.braintreepayments.demo.braintree.approval-url", parceledRequest.mApprovalUrl); assertEquals("token", parceledRequest.mTokenQueryParamKey); } }
@Test public void getCheckoutRequest_containsCorrectValues() throws JSONException { Configuration configuration = Configuration.fromJson(stringFromFixture("configuration/with_offline_paypal.json")); BraintreeFragment fragment = mMockFragmentBuilder.configuration(configuration).build(); CheckoutRequest request = PayPal.getCheckoutRequest(fragment, "https://paypal.com/?token=pairingId"); assertEquals(EnvironmentManager.MOCK, request.getEnvironment()); assertEquals("com.braintreepayments.api.braintree://onetouch/v1/cancel", request.getCancelUrl()); assertEquals("com.braintreepayments.api.braintree://onetouch/v1/success", request.getSuccessUrl()); assertEquals("paypal_client_id", request.getClientId()); assertEquals("pairingId", request.getPairingId()); }
@Test public void pairingId_setsClientMetadataId() { CheckoutRequest request = new CheckoutRequest() .pairingId(RuntimeEnvironment.application, "pairing-id"); assertEquals("pairing-id", request.getClientMetadataId()); }
@Test public void getBrowserIntent_returnsIntent() throws Exception { CheckoutRequest request = spy(new CheckoutRequest()); doNothing().when(request).trackFpti(any(Context.class), any(TrackingPoint.class), any(Protocol.class)); request.approvalURL("https://paypal.com/?token=test-token-key"); Intent intent = BrowserSwitchHelper.getBrowserSwitchIntent(mContextInspector, mConfigManager, request); verify(request).trackFpti(any(Context.class), eq(TrackingPoint.SwitchToBrowser), any(Protocol.class)); assertEquals(Intent.ACTION_VIEW, intent.getAction()); assertEquals("https://paypal.com/?token=test-token-key", intent.getData().toString()); assertEquals("com.android.chrome", intent.getPackage()); }
.put(RETURN_URL_KEY, checkoutRequest.getSuccessUrl()) .put(CANCEL_URL_KEY, checkoutRequest.getCancelUrl()) .put(OFFER_CREDIT_KEY, request.shouldOfferCredit());
@Override public CheckoutRequest createFromParcel(Parcel source) { return new CheckoutRequest(source); } };
@Test public void buildAppSwitchIntent_buildsIntentForCheckoutRequest() { CheckoutRequest request = mock(CheckoutRequest.class); when(request.getEnvironment()).thenReturn("test"); when(request.getBrowserSwitchUrl(any(Context.class), any(OtcConfiguration.class))) .thenReturn("web-url"); Intent intent = AppSwitchHelper.getAppSwitchIntent(mContextInspector, mConfigManager, request, getMockRecipe(2)); assertEquals("web", intent.getStringExtra("response_type")); assertEquals("web-url", intent.getStringExtra("webURL")); }
@Override public Result parseBrowserResponse(Uri uri) { String status = uri.getLastPathSegment(); if (!Uri.parse(getSuccessUrl()).getLastPathSegment().equals(status)) { // return cancel result return new Result(); } String requestXoToken = Uri.parse(mApprovalUrl).getQueryParameter(mTokenQueryParamKey); String responseXoToken = uri.getQueryParameter(mTokenQueryParamKey); if (responseXoToken != null && TextUtils.equals(requestXoToken, responseXoToken)) { try { JSONObject response = new JSONObject(); response.put("webURL", uri.toString()); return new Result( null /*don't know the environment here*/, ResponseType.web, response, null /* email not sent back in checkout requests since Hermes doesn't return that info*/); } catch (JSONException e) { return new Result(new ResponseParsingException(e)); } } else { return new Result( new BrowserSwitchException("The response contained inconsistent data.")); } }
public BillingAgreementRequest pairingId(Context context, String pairingId) { super.pairingId(context, pairingId); return this; }
@Override public BillingAgreementRequest approvalURL(String approvalURL) { super.approvalURL(approvalURL); mTokenQueryParamKey = TOKEN_QUERY_PARAM_KEY_BA_TOKEN; return this; }
/** * @deprecated Use {@link #getBrowserSwitchUrl()} instead. */ @Deprecated @Override public String getBrowserSwitchUrl(Context context, OtcConfiguration config) { return getBrowserSwitchUrl(); }
@Test public void parcels() { BillingAgreementRequest request = new BillingAgreementRequest(); request.environment("test"); request.clientId("client-id"); request.pairingId(RuntimeEnvironment.application, "pairing-id"); request.clientMetadataId("client-metadata-id"); request.cancelUrl("com.braintreepayments.demo.braintree.cancel", "cancel"); request.successUrl("com.braintreepayments.demo.braintree.success", "success"); request.approvalURL("com.braintreepayments.demo.braintree.approval-url://?ba_token=TOKEN"); Parcel parcel = Parcel.obtain(); request.writeToParcel(parcel, 0); parcel.setDataPosition(0); CheckoutRequest parceledRequest = CheckoutRequest.CREATOR.createFromParcel(parcel); assertEquals("test", parceledRequest.getEnvironment()); assertEquals("client-id", parceledRequest.getClientId()); assertEquals("client-metadata-id", parceledRequest.getClientMetadataId()); assertEquals("pairing-id", parceledRequest.getPairingId()); assertEquals("com.braintreepayments.demo.braintree.cancel://onetouch/v1/cancel", parceledRequest.getCancelUrl()); assertEquals("com.braintreepayments.demo.braintree.success://onetouch/v1/success", parceledRequest.getSuccessUrl()); assertEquals("com.braintreepayments.demo.braintree.approval-url://?ba_token=TOKEN", parceledRequest.mApprovalUrl); assertEquals("ba_token", parceledRequest.mTokenQueryParamKey); } }
@Test public void onActivityResult_NotOkAndCheckoutRequestPersisted_sendsAnalyticsEvent() { persistRequest(new CheckoutRequest()); BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.onActivityResult(fragment, Activity.RESULT_CANCELED, null); verify(fragment).sendAnalyticsEvent("paypal-single-payment.canceled"); }
/** * @deprecated use {@link CheckoutRequest#pairingId(Context, String)} instead. */ @Deprecated public CheckoutRequest pairingId(String pairingId) { return pairingId(null, pairingId); }
public static Intent getAppSwitchIntent(ContextInspector contextInspector, ConfigManager configManager, Request request, Recipe recipe) { Intent intent = createBaseIntent(recipe.getTargetIntentAction(), WALLET_APP_PACKAGE) .putExtra("version", recipe.getProtocol().getVersion()) .putExtra("app_guid", InstallationIdentifier.getInstallationGUID(contextInspector.getContext())) .putExtra("client_metadata_id", request.getClientMetadataId()) .putExtra("client_id", request.getClientId()) .putExtra("app_name", DeviceInspector.getApplicationInfoName(contextInspector.getContext())) .putExtra("environment", request.getEnvironment()) .putExtra("environment_url", EnvironmentManager.getEnvironmentUrl(request.getEnvironment())); if (request instanceof AuthorizationRequest) { AuthorizationRequest authorizationRequest = (AuthorizationRequest) request; intent.putExtra("scope", authorizationRequest.getScopeString()) .putExtra("response_type", "code") .putExtra("privacy_url", authorizationRequest.getPrivacyUrl()) .putExtra("agreement_url", authorizationRequest.getUserAgreementUrl()); } else { CheckoutRequest checkoutRequest = (CheckoutRequest) request; String webURL = checkoutRequest.getBrowserSwitchUrl(contextInspector.getContext(), configManager.getConfig()); intent.putExtra("response_type", "web") .putExtra("webURL", webURL); } return intent; }
@Override public Recipe getRecipeToExecute(Context context, OtcConfiguration config) { for (CheckoutRecipe recipe : config.getCheckoutRecipes()) { if (RequestTarget.wallet == recipe.getTarget()) { if (recipe.isValidAppTarget(context)) { return recipe; } } else if (RequestTarget.browser == recipe.getTarget()) { String browserSwitchUrl = getBrowserSwitchUrl(context, config); if (recipe.isValidBrowserTarget(context, browserSwitchUrl)) { return recipe; } } } return null; }