package com.braintreegateway.integrationtest; import com.braintreegateway.ValidationError; import com.braintreegateway.ValidationErrorCode; import com.braintreegateway.ValidationErrors; import com.braintreegateway.util.NodeWrapperFactory; import org.junit.Test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class ValidationErrorsIT { @Test public void onField() { ValidationErrors errors = new ValidationErrors(); errors.addError(new ValidationError("country_name", ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, "invalid country")); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.onField("countryName").get(0).getCode()); assertEquals("invalid country", errors.onField("countryName").get(0).getMessage()); } @Test public void onFieldAlsoWorksWithUnderscores() { ValidationErrors errors = new ValidationErrors(); errors.addError(new ValidationError("country_name", ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, "invalid country")); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.onField("country_name").get(0).getCode()); assertEquals("invalid country", errors.onField("country_name").get(0).getMessage()); } @Test public void nonExistingField() { ValidationErrors errors = new ValidationErrors(); assertTrue(errors.onField("foo").isEmpty()); } @Test public void forObject() { ValidationErrors addressErrors = new ValidationErrors(); addressErrors.addError(new ValidationError("country_name", ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, "invalid country")); ValidationErrors errors = new ValidationErrors(); errors.addErrors("address", addressErrors); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.forObject("address").onField("countryName").get(0).getCode()); assertEquals("invalid country", errors.forObject("address").onField("country_name").get(0).getMessage()); } @Test public void forObjectOnNonExistingObject() { ValidationErrors errors = new ValidationErrors(); assertEquals(0, errors.forObject("invalid").size()); } @Test public void forObjectAlsoWorksWithUnderscores() { ValidationErrors addressErrors = new ValidationErrors(); addressErrors.addError(new ValidationError("name", ValidationErrorCode.ADDRESS_FIRST_NAME_IS_TOO_LONG, "invalid name")); ValidationErrors errors = new ValidationErrors(); errors.addErrors("billing-address", addressErrors); assertEquals(ValidationErrorCode.ADDRESS_FIRST_NAME_IS_TOO_LONG, errors.forObject("billing_address").onField("name").get(0).getCode()); } @Test public void size() { ValidationErrors errors = new ValidationErrors(); errors.addError(new ValidationError("countryName", ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, "invalid country")); errors.addError(new ValidationError("anotherField", ValidationErrorCode.ADDRESS_COMPANY_IS_TOO_LONG, "another message")); assertEquals(2, errors.size()); } @Test public void deepSize() { ValidationErrors addressErrors = new ValidationErrors(); addressErrors.addError(new ValidationError("countryName", ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, "invalid country")); addressErrors.addError(new ValidationError("anotherField", ValidationErrorCode.ADDRESS_COMPANY_IS_TOO_LONG, "another message")); ValidationErrors errors = new ValidationErrors(); errors.addError(new ValidationError("someField", ValidationErrorCode.ADDRESS_EXTENDED_ADDRESS_IS_TOO_LONG, "some message")); errors.addErrors("address", addressErrors); assertEquals(3, errors.deepSize()); assertEquals(1, errors.size()); assertEquals(2, errors.forObject("address").deepSize()); assertEquals(2, errors.forObject("address").size()); } @Test public void getAllValidationErrors() { ValidationErrors addressErrors = new ValidationErrors(); addressErrors.addError(new ValidationError("countryName", ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, "invalid country")); addressErrors.addError(new ValidationError("anotherField", ValidationErrorCode.ADDRESS_COMPANY_IS_TOO_LONG, "another message")); ValidationErrors errors = new ValidationErrors(); errors.addError(new ValidationError("someField", ValidationErrorCode.ADDRESS_FIRST_NAME_IS_TOO_LONG, "some message")); errors.addErrors("address", addressErrors); assertEquals(1, errors.getAllValidationErrors().size()); assertEquals(ValidationErrorCode.ADDRESS_FIRST_NAME_IS_TOO_LONG, errors.getAllValidationErrors().get(0).getCode()); } @Test public void getAllDeepValidationErrors() { ValidationErrors addressErrors = new ValidationErrors(); addressErrors.addError(new ValidationError("countryName", ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, "1")); addressErrors.addError(new ValidationError("anotherField", ValidationErrorCode.ADDRESS_COMPANY_IS_TOO_LONG, "2")); ValidationErrors errors = new ValidationErrors(); errors.addError(new ValidationError("someField", ValidationErrorCode.ADDRESS_FIRST_NAME_IS_TOO_LONG, "3")); errors.addErrors("address", addressErrors); assertEquals(3, errors.getAllDeepValidationErrors().size()); List<ValidationError> validationErrors = new ArrayList<ValidationError>(errors.getAllDeepValidationErrors()); Collections.sort(validationErrors, new Comparator<ValidationError>() { public int compare(ValidationError left, ValidationError right) { return left.getCode().compareTo(right.getCode()); } }); assertEquals(ValidationErrorCode.ADDRESS_COMPANY_IS_TOO_LONG, validationErrors.get(0).getCode()); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, validationErrors.get(1).getCode()); assertEquals(ValidationErrorCode.ADDRESS_FIRST_NAME_IS_TOO_LONG, validationErrors.get(2).getCode()); } @Test public void parseSimpleValidationErrors() { StringBuilder builder = new StringBuilder(); builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); builder.append("<api-error-response>"); builder.append(" <errors>"); builder.append(" <address>"); builder.append(" <errors type=\"array\">"); builder.append(" <error>"); builder.append(" <code>91803</code>"); builder.append(" <message>Country name is not an accepted country.</message>"); builder.append(" <attribute type=\"symbol\">country_name</attribute>"); builder.append(" </error>"); builder.append(" </errors>"); builder.append(" </address>"); builder.append(" <errors type=\"array\"/>"); builder.append(" </errors>"); builder.append("</api-error-response>"); ValidationErrors errors = new ValidationErrors(NodeWrapperFactory.instance.create(builder.toString())); assertEquals(1, errors.deepSize()); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.forObject("address").onField("country_name").get(0).getCode()); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.forObject("address").onField("countryName").get(0).getCode()); } @Test public void parseMulitpleValidationErrorsOnOneObject() { StringBuilder builder = new StringBuilder(); builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); builder.append("<api-error-response>"); builder.append(" <errors>"); builder.append(" <address>"); builder.append(" <errors type=\"array\">"); builder.append(" <error>"); builder.append(" <code>91803</code>"); builder.append(" <message>Country name is not an accepted country.</message>"); builder.append(" <attribute type=\"symbol\">country_name</attribute>"); builder.append(" </error>"); builder.append(" <error>"); builder.append(" <code>81812</code>"); builder.append(" <message>Street address is too long.</message>"); builder.append(" <attribute type=\"symbol\">street_address</attribute>"); builder.append(" </error>"); builder.append(" </errors>"); builder.append(" </address>"); builder.append(" <errors type=\"array\"/>"); builder.append(" </errors>"); builder.append("</api-error-response>"); ValidationErrors errors = new ValidationErrors(NodeWrapperFactory.instance.create(builder.toString())); assertEquals(2, errors.deepSize()); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.forObject("address").onField("countryName").get(0).getCode()); assertEquals(ValidationErrorCode.ADDRESS_STREET_ADDRESS_IS_TOO_LONG, errors.forObject("address").onField("streetAddress").get(0).getCode()); } @Test public void parseMulitpleValidationErrorsOnOneField() { StringBuilder builder = new StringBuilder(); builder.append("<api-error-response>"); builder.append(" <errors>"); builder.append(" <transaction>"); builder.append(" <errors type=\"array\">"); builder.append(" <error>"); builder.append(" <code>91516</code>"); builder.append(" <message>Cannot provide both payment_method_token and customer_id unless the payment_method belongs to the customer.</message>"); builder.append(" <attribute type=\"symbol\">base</attribute>"); builder.append(" </error>"); builder.append(" <error>"); builder.append(" <code>91515</code>"); builder.append(" <message>Cannot provide both payment_method_token and credit_card attributes.</message>"); builder.append(" <attribute type=\"symbol\">base</attribute>"); builder.append(" </error>"); builder.append(" </errors>"); builder.append(" </transaction>"); builder.append(" <errors type=\"array\"/>"); builder.append(" </errors>"); builder.append("</api-error-response>"); ValidationErrors errors = new ValidationErrors(NodeWrapperFactory.instance.create(builder.toString())); assertEquals(2, errors.deepSize()); assertEquals(2, errors.forObject("transaction").onField("base").size()); } @Test public void parseValidationErrorOnNestedObject() { StringBuilder builder = new StringBuilder(); builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); builder.append("<api-error-response>"); builder.append(" <errors>"); builder.append(" <errors type=\"array\"/>"); builder.append(" <credit-card>"); builder.append(" <billing-address>"); builder.append(" <errors type=\"array\">"); builder.append(" <error>"); builder.append(" <code>91803</code>"); builder.append(" <message>Country name is not an accepted country.</message>"); builder.append(" <attribute type=\"symbol\">country_name</attribute>"); builder.append(" </error>"); builder.append(" </errors>"); builder.append(" </billing-address>"); builder.append(" <errors type=\"array\"/>"); builder.append(" </credit-card>"); builder.append(" </errors>"); builder.append("</api-error-response>"); ValidationErrors errors = new ValidationErrors(NodeWrapperFactory.instance.create(builder.toString())); assertEquals(1, errors.deepSize()); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.forObject("creditCard").forObject("billingAddress").onField("countryName").get(0).getCode()); } @Test public void parseValidationErrorsAtMultipleLevels() { StringBuilder builder = new StringBuilder(); builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); builder.append("<api-error-response>"); builder.append(" <errors>"); builder.append(" <customer>"); builder.append(" <errors type=\"array\">"); builder.append(" <error>"); builder.append(" <code>81608</code>"); builder.append(" <message>First name is too long.</message>"); builder.append(" <attribute type=\"symbol\">first_name</attribute>"); builder.append(" </error>"); builder.append(" </errors>"); builder.append(" <credit-card>"); builder.append(" <billing-address>"); builder.append(" <errors type=\"array\">"); builder.append(" <error>"); builder.append(" <code>91803</code>"); builder.append(" <message>Country name is not an accepted country.</message>"); builder.append(" <attribute type=\"symbol\">country_name</attribute>"); builder.append(" </error>"); builder.append(" </errors>"); builder.append(" </billing-address>"); builder.append(" <errors type=\"array\">"); builder.append(" <error>"); builder.append(" <code>81715</code>"); builder.append(" <message>Credit card number is invalid.</message>"); builder.append(" <attribute type=\"symbol\">number</attribute>"); builder.append(" </error>"); builder.append(" </errors>"); builder.append(" </credit-card>"); builder.append(" </customer>"); builder.append(" <errors type=\"array\"/>"); builder.append(" </errors>"); builder.append("</api-error-response>"); ValidationErrors errors = new ValidationErrors(NodeWrapperFactory.instance.create(builder.toString())); assertEquals(3, errors.deepSize()); assertEquals(0, errors.size()); assertEquals(3, errors.forObject("customer").deepSize()); assertEquals(1, errors.forObject("customer").size()); assertEquals(ValidationErrorCode.CUSTOMER_FIRST_NAME_IS_TOO_LONG, errors.forObject("customer").onField("firstName").get(0).getCode()); assertEquals(2, errors.forObject("customer").forObject("creditCard").deepSize()); assertEquals(1, errors.forObject("customer").forObject("creditCard").size()); assertEquals(ValidationErrorCode.CREDIT_CARD_NUMBER_IS_INVALID, errors.forObject("customer").forObject("creditCard").onField("number").get(0).getCode()); assertEquals(1, errors.forObject("customer").forObject("creditCard").forObject("billingAddress").deepSize()); assertEquals(1, errors.forObject("customer").forObject("creditCard").forObject("billingAddress").size()); assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED, errors.forObject("customer").forObject("creditCard").forObject("billingAddress").onField("countryName").get(0).getCode()); } }