/** * Starts the Single Payment flow for PayPal. This will launch the PayPal app if installed or * fall back to a browser switch. * * @param fragment A {@link BraintreeFragment} used to process the request. * @param request A {@link PayPalRequest} used to customize the request. An amount MUST be specified. */ public static void requestOneTimePayment(BraintreeFragment fragment, PayPalRequest request) { requestOneTimePayment(fragment, request, null); }
public void launchSinglePayment(View v) { setProgressBarIndeterminateVisibility(true); PayPal.requestOneTimePayment(mBraintreeFragment, getPayPalRequest("1.00")); }
@Test public void requestOneTimePayment_postParamsIncludeNoShipping() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").shippingAddressRequired(false)); ArgumentCaptor<String> pathCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(pathCaptor.capture(), dataCaptor.capture(), any(HttpResponseCallback.class)); assertTrue(pathCaptor.getValue().contains("/paypal_hermes/create_payment_resource")); JSONObject json = new JSONObject(dataCaptor.getValue()); assertEquals("1", json.get("amount")); assertEquals(true, json.getJSONObject("experience_profile").get("no_shipping")); assertEquals(false, json.getJSONObject("experience_profile").get("address_override")); }
@Test public void requestOneTimePayment_postsExceptionWhenNoAmountIsSet() { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest()); ArgumentCaptor<Exception> captor = ArgumentCaptor.forClass(Exception.class); verify(fragment).postCallback(captor.capture()); assertTrue(captor.getValue() instanceof BraintreeException); assertEquals("An amount must be specified for the Single Payment flow.", captor.getValue().getMessage()); }
@Test public void requestOneTimePayment_whenMerchantAccountIdNotPresent_postDoesNotIncludeMerchantAccountId() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPalRequest request = new PayPalRequest("3.43"); PayPal.requestOneTimePayment(fragment, request); ArgumentCaptor<String> pathCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(pathCaptor.capture(), dataCaptor.capture(), any(HttpResponseCallback.class)); assertTrue(pathCaptor.getValue().contains("/paypal_hermes/create_payment_resource")); JSONObject json = new JSONObject(dataCaptor.getValue()); assertFalse(json.has("merchant_account_id")); }
@Test public void requestOneTimePayment_landingPageType_canBeSetToLogin() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").landingPageType(PayPalRequest.LANDING_PAGE_TYPE_LOGIN)); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(contains("/paypal_hermes/create_payment_resource"), dataCaptor.capture(), any(HttpResponseCallback.class)); JSONObject json = new JSONObject(dataCaptor.getValue()); assertEquals("1", json.get("amount")); assertEquals(true, json.getJSONObject("experience_profile").get("no_shipping")); assertEquals(false, json.getJSONObject("experience_profile").get("address_override")); assertEquals(PayPalRequest.LANDING_PAGE_TYPE_LOGIN, json.getJSONObject("experience_profile").get("landing_page_type")); }
@Test public void requestOneTimePayment_landingPageType_canBeSetToBilling() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").landingPageType(PayPalRequest.LANDING_PAGE_TYPE_BILLING)); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(contains("/paypal_hermes/create_payment_resource"), dataCaptor.capture(), any(HttpResponseCallback.class)); JSONObject json = new JSONObject(dataCaptor.getValue()); assertEquals("1", json.get("amount")); assertEquals(true, json.getJSONObject("experience_profile").get("no_shipping")); assertEquals(false, json.getJSONObject("experience_profile").get("address_override")); assertEquals(PayPalRequest.LANDING_PAGE_TYPE_BILLING, json.getJSONObject("experience_profile").get("landing_page_type")); }
@Test public void requestOneTimePayment_intent_canBeSetToSale() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").intent(PayPalRequest.INTENT_SALE)); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(contains("/paypal_hermes/create_payment_resource"), dataCaptor.capture(), any(HttpResponseCallback.class)); JSONObject json = new JSONObject(dataCaptor.getValue()); assertEquals("1", json.get("amount")); assertEquals(true, json.getJSONObject("experience_profile").get("no_shipping")); assertEquals(false, json.getJSONObject("experience_profile").get("address_override")); assertEquals(PayPalRequest.INTENT_SALE, json.get("intent")); }
@Test public void requestOneTimePayment_intent_canBeSetToOrder() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").intent(PayPalRequest.INTENT_ORDER)); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(contains("/paypal_hermes/create_payment_resource"), dataCaptor.capture(), any(HttpResponseCallback.class)); JSONObject json = new JSONObject(dataCaptor.getValue()); assertEquals("1", json.get("amount")); assertEquals(true, json.getJSONObject("experience_profile").get("no_shipping")); assertEquals(false, json.getJSONObject("experience_profile").get("address_override")); assertEquals(PayPalRequest.INTENT_ORDER, json.get("intent")); }
@Test public void requestOnetimePayment_whenShippingRequired_postsNoShippingFalse() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPalRequest request = new PayPalRequest("3.43") .shippingAddressRequired(true); PayPal.requestOneTimePayment(fragment, request); ArgumentCaptor<String> pathCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(pathCaptor.capture(), dataCaptor.capture(), any(HttpResponseCallback.class)); assertTrue(pathCaptor.getValue().contains("/paypal_hermes/create_payment_resource")); JSONObject json = new JSONObject(dataCaptor.getValue()); JSONObject experienceProfile = json.getJSONObject("experience_profile"); assertFalse(experienceProfile.getBoolean("no_shipping")); }
@Test public void requestOnetimePayment_whenShippingRequiredFalse_postsNoShippingTrue() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPalRequest request = new PayPalRequest("3.43") .shippingAddressRequired(false); PayPal.requestOneTimePayment(fragment, request); ArgumentCaptor<String> pathCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(pathCaptor.capture(), dataCaptor.capture(), any(HttpResponseCallback.class)); assertTrue(pathCaptor.getValue().contains("/paypal_hermes/create_payment_resource")); JSONObject json = new JSONObject(dataCaptor.getValue()); JSONObject experienceProfile = json.getJSONObject("experience_profile"); assertTrue(experienceProfile.getBoolean("no_shipping")); }
@Test public void requestOneTimePayment_displayName_canBeSet() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").displayName("Test Name")); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(contains("/paypal_hermes/create_payment_resource"), dataCaptor.capture(), any(HttpResponseCallback.class)); JSONObject json = new JSONObject(dataCaptor.getValue()); assertEquals("Test Name", json.getJSONObject("experience_profile").get("brand_name")); }
@Test public void requestOneTimePayment_containsOfferPayPalCreditParam() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").offerCredit(true)); ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).post(contains("/paypal_hermes/create_payment_resource"), dataCaptor.capture(), any(HttpResponseCallback.class)); JSONObject json = new JSONObject(dataCaptor.getValue()); assertTrue(json.getBoolean("offer_paypal_credit")); }
@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 requestOneTimePayment_userAction_setsUserActionToBlankStringonDefault() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder .successResponse(stringFromFixture("paypal_hermes_response.json")) .build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").userAction(PayPalRequest.USER_ACTION_DEFAULT)); ArgumentCaptor<Intent> dataCaptor = ArgumentCaptor.forClass(Intent.class); verify(fragment).browserSwitch(eq(BraintreeRequestCodes.PAYPAL), dataCaptor.capture()); Uri uri = dataCaptor.getValue().getData(); assertEquals("", uri.getQueryParameter("useraction")); }
@Test public void requestOneTimePayment_persistsPayPalRequest() { BraintreeFragment braintreeFragment = mMockFragmentBuilder.build(); SharedPreferences prefs = BraintreeSharedPreferences.getSharedPreferences(RuntimeEnvironment.application); PayPal.requestOneTimePayment(braintreeFragment, new PayPalRequest("1").intent(PayPalRequest.INTENT_SALE)); assertNotNull(prefs.getString("com.braintreepayments.api.PayPal.PAYPAL_REQUEST_KEY", null)); }
@Test public void requestBillingAgreement_persistsPayPalRequest() { BraintreeFragment braintreeFragment = mMockFragmentBuilder.build(); SharedPreferences prefs = BraintreeSharedPreferences.getSharedPreferences(RuntimeEnvironment.application); PayPal.requestOneTimePayment(braintreeFragment, new PayPalRequest("1").intent(PayPalRequest.INTENT_SALE)); assertNotNull(prefs.getString("com.braintreepayments.api.PayPal.PAYPAL_REQUEST_KEY", null)); }
@Test(timeout = 1000) public void requestOneTimePayment_customHandlerIsCalledCorrectly() throws InterruptedException { BraintreeFragment fragment = mMockFragmentBuilder .successResponse(stringFromFixture("paypal_hermes_response.json")) .build(); final CountDownLatch latch = new CountDownLatch(1); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1"), new PayPalApprovalHandler() { @Override public void handleApproval(Request request, PayPalApprovalCallback paypalApprovalCallback) { latch.countDown(); } }); latch.await(); }
@Test public void requestOneTimePayment_sendsPayPalCreditOfferedAnalyticsEvent() throws JSONException { BraintreeFragment fragment = mMockFragmentBuilder.build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1").offerCredit(true)); verify(fragment).sendAnalyticsEvent("paypal.single-payment.credit.offered"); }
@Test public void requestOneTimePayment_customHandlerCancelCallbackIsInvoked() throws InterruptedException { BraintreeFragment fragment = mMockFragmentBuilder .successResponse(stringFromFixture("paypal_hermes_response.json")) .build(); PayPal.requestOneTimePayment(fragment, new PayPalRequest("1"), new PayPalApprovalHandler() { @Override public void handleApproval(Request request, PayPalApprovalCallback paypalApprovalCallback) { paypalApprovalCallback.onCancel(); } }); verify(fragment).postCancelCallback(BraintreeRequestCodes.PAYPAL); }