/** * Method to extract an error for an individual field, e.g. creditCard, customer, etc. * * @param field Name of the field desired, expected to be in camelCase. * @return {@link BraintreeError} for the field searched, or {@code null} if not found. */ @Nullable public BraintreeError errorFor(String field) { BraintreeError returnError; if (mFieldErrors != null) { for (BraintreeError error : mFieldErrors) { if (error.getField().equals(field)) { return error; } else if (error.getFieldErrors() != null) { returnError = error.errorFor(field); if (returnError != null) { return returnError; } } } } return null; }
public static BraintreeError fromJson(JSONObject json) { BraintreeError error = new BraintreeError(); error.mField = Json.optString(json, FIELD_KEY, null); error.mMessage = Json.optString(json, MESSAGE_KEY, null); error.mFieldErrors = BraintreeError.fromJsonArray(json.optJSONArray(FIELD_ERRORS_KEY)); return error; }
private static void addGraphQLFieldError(List<String> inputPath, JSONObject errorJSON, List<BraintreeError> errors) throws JSONException { String field = inputPath.get(0); if (inputPath.size() == 1) { BraintreeError error = new BraintreeError(); error.mField = field; error.mMessage = errorJSON.getString(Keys.MESSAGE); error.mFieldErrors = new ArrayList<>(); errors.add(error); return; } BraintreeError nestedError = null; List<String> nestedInputPath = inputPath.subList(1, inputPath.size()); for (BraintreeError error : errors) { if (error.mField.equals(field)) { nestedError = error; } } if (nestedError == null) { nestedError = new BraintreeError(); nestedError.mField = field; nestedError.mFieldErrors = new ArrayList<>(); errors.add(nestedError); } addGraphQLFieldError(nestedInputPath, errorJSON, nestedError.mFieldErrors); }
@Test public void parcelsCorrectly() throws JSONException { JSONObject errorResponse = new JSONObject(stringFromFixture("errors/credit_card_error_response.json")); List<BraintreeError> errors = BraintreeError.fromJsonArray(errorResponse.getJSONArray("fieldErrors")); assertEquals(1, errors.size()); BraintreeError error = errors.get(0); Parcel parcel = Parcel.obtain(); error.writeToParcel(parcel, 0); parcel.setDataPosition(0); BraintreeError parceled = BraintreeError.CREATOR.createFromParcel(parcel); assertEquals(error.getField(), parceled.getField()); assertEquals(error.getMessage(), parceled.getMessage()); assertEquals(error.getFieldErrors().size(), parceled.getFieldErrors().size()); }
@Test public void graphQLErrors_parcelCorrectly() throws Exception { JSONObject errorResponse = new JSONObject(stringFromFixture("errors/graphql/credit_card_error.json")); List<BraintreeError> errors = BraintreeError.fromGraphQLJsonArray(errorResponse.getJSONArray("errors")); assertEquals(1, errors.size()); BraintreeError error = errors.get(0); Parcel parcel = Parcel.obtain(); error.writeToParcel(parcel, 0); parcel.setDataPosition(0); BraintreeError parceled = BraintreeError.CREATOR.createFromParcel(parcel); assertEquals(error.getField(), parceled.getField()); assertEquals(error.getMessage(), parceled.getMessage()); assertEquals(error.getFieldErrors().size(), parceled.getFieldErrors().size()); } }
@Override public void onError(Exception error) { assertEquals("Postal code verification failed", ((ErrorWithResponse) error).errorFor("creditCard").errorFor("billingAddress") .getFieldErrors().get(0).getMessage()); countDownLatch.countDown(); } });
@Test public void fromJson_parsesErrorsCorrectly() throws JSONException { String response = stringFromFixture("errors/credit_card_error_response.json"); ErrorWithResponse errorWithResponse = ErrorWithResponse.fromJson(response); assertEquals("Credit card is invalid", errorWithResponse.getMessage()); assertNull(errorWithResponse.errorFor("creditCard").errorFor("postalCode")); assertEquals("Credit card must include number, payment_method_nonce, or venmo_sdk_payment_method_code", errorWithResponse.errorFor("creditCard").errorFor("base").getMessage()); assertEquals("Credit card number is required", errorWithResponse.errorFor("creditCard").errorFor("number").getMessage()); assertEquals("Expiration year is invalid", errorWithResponse.errorFor("creditCard").errorFor("expirationYear").getMessage()); }
@Override public void onError(Exception error) { assertEquals("CVV verification failed", ((ErrorWithResponse) error).errorFor("creditCard").getFieldErrors().get(0).getMessage()); countDownLatch.countDown(); } });
private void parseJson(String jsonString) throws JSONException { JSONObject json = new JSONObject(jsonString); mMessage = json.getJSONObject(ERROR_KEY).getString(MESSAGE_KEY); mFieldErrors = BraintreeError.fromJsonArray(json.optJSONArray(FIELD_ERRORS_KEY)); }
public static ErrorWithResponse fromGraphQLJson(String json) { ErrorWithResponse errorWithResponse = new ErrorWithResponse(); errorWithResponse.mOriginalResponse = json; errorWithResponse.mStatusCode = 422; try { JSONArray errors = new JSONObject(json).getJSONArray(Keys.ERRORS); errorWithResponse.mFieldErrors = BraintreeError.fromGraphQLJsonArray(errors); if (errorWithResponse.mFieldErrors.isEmpty()) { errorWithResponse.mMessage = errors.getJSONObject(0).getString(Keys.MESSAGE); } else { errorWithResponse.mMessage = ErrorMessages.USER; } } catch (JSONException e) { errorWithResponse.mMessage = "Parsing error response failed"; errorWithResponse.mFieldErrors = new ArrayList<>(); } return errorWithResponse; }
public BraintreeError createFromParcel(Parcel source) { return new BraintreeError(source); }
public static List<BraintreeError> fromJsonArray(JSONArray json) { if (json == null) { json = new JSONArray(); } List<BraintreeError> errors = new ArrayList<>(); for (int i = 0; i < json.length(); i++) { try { errors.add(BraintreeError.fromJson(json.getJSONObject(i))); } catch (JSONException ignored) {} } return errors; }
protected static List<BraintreeError> fromGraphQLJsonArray(JSONArray graphQLErrors) { List<BraintreeError> errors = new ArrayList<>(); if (graphQLErrors == null) { return errors; } for (int i = 0; i < graphQLErrors.length(); i++) { try { JSONObject graphQLError = graphQLErrors.getJSONObject(i); JSONObject extensions = graphQLError.optJSONObject(Keys.EXTENSIONS); if (extensions == null || !ErrorTypes.USER.equals(extensions.optString(Keys.ERROR_TYPE))) { continue; } ArrayList<String> inputPath = new ArrayList<>(); JSONArray inputPathJSON = extensions.getJSONArray(Keys.INPUT_PATH); for (int j = 1; j < inputPathJSON.length(); j++) { inputPath.add(inputPathJSON.getString(j)); } addGraphQLFieldError(inputPath, graphQLError, errors); } catch (JSONException ignored) {} } return errors; }
@Override public void onError(Exception error) { assertEquals("Country code (alpha3) is not an accepted country", ((ErrorWithResponse) error).errorFor("creditCard").errorFor("billingAddress") .getFieldErrors().get(0).getMessage()); countDownLatch.countDown(); } });
@Test public void fromGraphQLJson_parsesErrorsCorrectly() { String response = stringFromFixture("errors/graphql/credit_card_error.json"); ErrorWithResponse errorWithResponse = ErrorWithResponse.fromGraphQLJson(response); assertEquals("Input is invalid.", errorWithResponse.getMessage()); assertEquals(422, errorWithResponse.getStatusCode()); assertEquals("Expiration month is invalid", errorWithResponse.errorFor("creditCard").errorFor("expirationMonth").getMessage()); assertEquals("Expiration year is invalid", errorWithResponse.errorFor("creditCard").errorFor("expirationYear").getMessage()); assertEquals("CVV verification failed", errorWithResponse.errorFor("creditCard").errorFor("cvv").getMessage()); }
@Test public void constructor_canHandleMultipleCategories() { String errors = stringFromFixture("errors/complex_error_response.json"); ErrorWithResponse errorWithResponse = new ErrorWithResponse(422, errors); assertEquals(3, errorWithResponse.errorFor("creditCard").getFieldErrors().size()); assertEquals("is invalid", errorWithResponse.errorFor("customer").getMessage()); assertEquals(0, errorWithResponse.errorFor("customer").getFieldErrors().size()); }
/** * Method to extract an error for an individual field, e.g. creditCard, customer, etc. * * @param field Name of the field desired, expected to be in camelCase. * @return {@link BraintreeError} for the field searched, or {@code null} if not found. */ @Nullable public BraintreeError errorFor(String field) { BraintreeError returnError; if (mFieldErrors != null) { for (BraintreeError error : mFieldErrors) { if (error.getField().equals(field)) { return error; } else if (error.getFieldErrors() != null) { returnError = error.errorFor(field); if (returnError != null) { return returnError; } } } } return null; }
@Test public void constructor_parsesErrorsCorrectly() { String response = stringFromFixture("errors/credit_card_error_response.json"); ErrorWithResponse errorWithResponse = new ErrorWithResponse(422, response); assertEquals("Credit card is invalid", errorWithResponse.getMessage()); assertEquals(422, errorWithResponse.getStatusCode()); assertNull(errorWithResponse.errorFor("creditCard").errorFor("postalCode")); assertEquals("Credit card must include number, payment_method_nonce, or venmo_sdk_payment_method_code", errorWithResponse.errorFor("creditCard").errorFor("base").getMessage()); assertEquals("Credit card number is required", errorWithResponse.errorFor("creditCard").errorFor("number").getMessage()); assertEquals("Expiration year is invalid", errorWithResponse.errorFor("creditCard").errorFor("expirationYear").getMessage()); }