/** * Retrieves the current list of {@link PaymentMethodNonce}s for the current customer. * <p/> * When finished, the {@link java.util.List} of {@link PaymentMethodNonce}s will be sent to {@link * PaymentMethodNoncesUpdatedListener#onPaymentMethodNoncesUpdated(List)}. * * @param fragment {@link BraintreeFragment} */ public static void getPaymentMethodNonces(BraintreeFragment fragment) { getPaymentMethodNonces(fragment, false); }
@Config(sdk = 21) @Test public void deletePaymentMethodNonce_withTokenizationKey_throwsAnError() { BraintreeFragment fragment = new MockFragmentBuilder().build(); PaymentMethod.deletePaymentMethod(fragment, mCardNonce); ArgumentCaptor<Exception> captor = ArgumentCaptor.forClass(Exception.class); verify(fragment).postCallback(captor.capture()); assertTrue(captor.getValue() instanceof BraintreeException); assertEquals("A client token with a customer id must be used to delete a payment method nonce.", captor.getValue().getMessage()); verifyZeroInteractions(fragment.getGraphQLHttpClient()); }
@Test public void getPaymentMethodNonces_includesDefaultFirstParamAndSessionIdInRequestPath() { BraintreeFragment fragment = new MockFragmentBuilder().build(); when(fragment.getSessionId()).thenReturn("session-id"); PaymentMethod.getPaymentMethodNonces(fragment, true); ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); verify(fragment.getHttpClient()).get(captor.capture(), any(HttpResponseCallback.class)); String requestUri = captor.getValue(); assertTrue(requestUri.contains("default_first=true")); assertTrue(requestUri.contains("session_id=" + fragment.getSessionId())); }
@Config(sdk = 21) @Test public void deletePaymentMethodNonce_postToGraphQL() throws Exception { 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<String> captor = ArgumentCaptor.forClass(String.class); verify(fragment.getGraphQLHttpClient()).post(captor.capture(), any(HttpResponseCallback.class)); JSONObject graphQlRequest = new JSONObject(captor.getValue()); assertEquals(GraphQLQueryHelper.getQuery(RuntimeEnvironment.application, R.raw.delete_payment_method_mutation), graphQlRequest.getString(GraphQLConstants.Keys.QUERY)); JSONObject metadata = graphQlRequest.getJSONObject("clientSdkMetadata"); assertEquals(mCardNonce.getNonce(), graphQlRequest.getJSONObject("variables") .getJSONObject("input").getString("singleUseTokenId")); assertEquals("DeletePaymentMethodFromSingleUseToken", graphQlRequest .getString(GraphQLConstants.Keys.OPERATION_NAME)); assertEquals("test-integration", metadata.getString("integration")); assertEquals("test-session-id", metadata.getString("sessionId")); assertEquals("client", metadata.getString("source")); }
@Test public void getPaymentMethodNonces_returnsAnEmptyListIfEmpty() { BraintreeFragment fragment = new MockFragmentBuilder() .successResponse(stringFromFixture("payment_methods/get_payment_methods_empty_response.json")) .build(); PaymentMethod.getPaymentMethodNonces(fragment); ArgumentCaptor<List<PaymentMethodNonce>> captor = ArgumentCaptor.forClass((Class) List.class); verify(fragment).postCallback(captor.capture()); assertEquals(0, captor.getValue().size()); }
@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_doesNotParseAndroidPayPaymentMethods() { BraintreeFragment fragment = new MockFragmentBuilder() .successResponse(stringFromFixture("payment_methods/get_payment_methods_android_pay_response.json")) .build(); PaymentMethod.getPaymentMethodNonces(fragment); ArgumentCaptor<List<PaymentMethodNonce>> captor = ArgumentCaptor.forClass((Class) List.class); verify(fragment).postCallback(captor.capture()); List<PaymentMethodNonce> paymentMethodNonces = captor.getValue(); assertEquals(0, paymentMethodNonces.size()); }
@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 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); }
@Config(sdk = 21) @Test public void deletePaymentMethodNonce_throwsAnError() 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); ArgumentCaptor<Exception> captor = ArgumentCaptor.forClass(Exception.class); verify(fragment).postCallback(captor.capture()); PaymentMethodDeleteException paymentMethodDeleteException = (PaymentMethodDeleteException)captor.getValue(); PaymentMethodNonce paymentMethodNonce = paymentMethodDeleteException.getPaymentMethodNonce(); assertEquals(mCardNonce, paymentMethodNonce); }
@Test public void getPaymentMethodNonces_fetchesPaymentMethods() { BraintreeFragment fragment = new MockFragmentBuilder() .successResponse(stringFromFixture("payment_methods/get_payment_methods_response.json")) .build(); PaymentMethod.getPaymentMethodNonces(fragment); ArgumentCaptor<List<PaymentMethodNonce>> captor = ArgumentCaptor.forClass((Class) List.class); verify(fragment).postCallback(captor.capture()); List<PaymentMethodNonce> paymentMethodNonces = captor.getValue(); assertEquals(3, paymentMethodNonces.size()); assertEquals("11", ((CardNonce) paymentMethodNonces.get(0)).getLastTwo()); assertEquals("PayPal", paymentMethodNonces.get(1).getTypeLabel()); assertEquals("happy-venmo-joe", ((VenmoAccountNonce) paymentMethodNonces.get(2)).getUsername()); }
@Config(sdk = 21) @Test public void deletePaymentMethodNonce_sendAnAnalyticsEventForSuccess() 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).sendAnalyticsEvent("delete-payment-methods.succeeded"); }
@Test public void getPaymentMethodNonces_sendsAnAnalyticsEventForParsingErrors() { BraintreeFragment fragment = new MockFragmentBuilder() .successResponse("{}") .build(); PaymentMethod.getPaymentMethodNonces(fragment); verify(fragment).sendAnalyticsEvent("get-payment-methods.failed"); }
@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"); }
@Test public void getPaymentMethodNonces_sendsAnAnalyticsEventForErrors() { BraintreeFragment fragment = new MockFragmentBuilder() .errorResponse(new UnexpectedException("Error")) .build(); PaymentMethod.getPaymentMethodNonces(fragment); verify(fragment).sendAnalyticsEvent("get-payment-methods.failed"); }
@Test public void getPaymentMethodNonces_sendsAnAnalyticsEventForSuccess() { BraintreeFragment fragment = new MockFragmentBuilder() .successResponse(stringFromFixture("payment_methods/get_payment_methods_response.json")) .build(); PaymentMethod.getPaymentMethodNonces(fragment); verify(fragment).sendAnalyticsEvent("get-payment-methods.succeeded"); }
.expirationYear(validExpirationYear())); PaymentMethod.getPaymentMethodNonces(fragment);
@Test(timeout = 10000) public void getPaymentMethodNonces_getsPaymentMethodsFromServer() throws InterruptedException, InvalidArgumentException { final CountDownLatch latch = new CountDownLatch(1); final String clientToken = new TestClientTokenBuilder().build(); BraintreeFragment fragment = BraintreeFragment.newInstance(mActivity, clientToken); getInstrumentation().waitForIdleSync(); fragment.addListener(new PaymentMethodNoncesUpdatedListener() { @Override public void onPaymentMethodNoncesUpdated(List<PaymentMethodNonce> paymentMethodNonces) { assertEquals(1, paymentMethodNonces.size()); assertIsANonce(paymentMethodNonces.get(0).getNonce()); assertEquals("11", ((CardNonce) paymentMethodNonces.get(0)).getLastTwo()); latch.countDown(); } }); fragment.addListener(new BraintreeErrorListener() { @Override public void onError(Exception error) { fail(error.getMessage()); } }); tokenize(fragment, new CardBuilder() .cardNumber(VISA) .expirationMonth("04") .expirationYear(validExpirationYear())); PaymentMethod.getPaymentMethodNonces(fragment); latch.await(); }