package org.grails.validation; import grails.validation.AbstractConstraintTests; import grails.validation.ConstrainedProperty; import grails.validation.TestClass; /** * Test cases for 'creditCard' constraint. Uses data from Apache Jakarta Commons Validator tests. * * @author Sergey Nebolsin (<a href="mailto:nebolsin@gmail.com"/>) */ public class CreditCardConstraintTests extends AbstractConstraintTests { private static final String VALID_VISA = "4417123456789113"; private static final String VALID_SHORT_VISA = "4222222222222"; private static final String VALID_AMEX = "378282246310005"; private static final String VALID_MASTERCARD = "5105105105105100"; private static final String VALID_DISCOVER = "6011000990139424"; @Override protected Class<?> getConstraintClass() { return CreditCardConstraint.class; } public void testValidate() { testConstraintMessageCodes( getConstraint("testString", Boolean.TRUE), "1234512", new String[] {"testClass.testString.creditCard.error", "testClass.testString.creditCard.invalid"}, new Object[] {"testString", TestClass.class, "1234512"}); // too short number testConstraintFailed( getConstraint("testString", Boolean.TRUE), "123456789012"); // too long number testConstraintFailed( getConstraint("testString", Boolean.TRUE), "12345678901234567890"); // non-digit symbols in number testConstraintFailed( getConstraint("testString", Boolean.TRUE), "4417q23456w89113"); // non-digit symbols in number testConstraintFailed( getConstraint("testString", Boolean.TRUE), "4417q23456w89113"); // wrong number (luhn check) testConstraintFailed( getConstraint("testString", Boolean.TRUE), "4417123456789112"); // null value should always pass validation testConstraintPassed( getConstraint("testString", Boolean.TRUE), null); // blank value should always pass validation testConstraintPassed( getConstraint("testString", Boolean.TRUE), " "); testConstraintPassed( getConstraint("testString", Boolean.TRUE), VALID_VISA); testConstraintPassed( getConstraint("testString", Boolean.TRUE), VALID_SHORT_VISA); testConstraintPassed( getConstraint("testString", Boolean.TRUE), VALID_AMEX); testConstraintPassed( getConstraint("testString", Boolean.TRUE), VALID_MASTERCARD); testConstraintPassed( getConstraint("testString", Boolean.TRUE), VALID_DISCOVER); // must always pass when parameter is false testConstraintPassed( getConstraint("testString", Boolean.FALSE), "123"); testConstraintDefaultMessage( getConstraint("testString", Boolean.TRUE), "12345", "Property [{0}] of class [{1}] with value [{2}] is not a valid credit card number"); } public void testConstraintCreation() { CreditCardConstraint constraint = new CreditCardConstraint(); assertEquals(ConstrainedProperty.CREDIT_CARD_CONSTRAINT, constraint.getName()); assertTrue(constraint.supports(String.class)); assertFalse(constraint.supports(null)); assertFalse(constraint.supports(Long.class)); try { getConstraint("testString", "wrong"); fail("CreditCardConstraint must throw an exception for non-boolean parameters."); } catch (IllegalArgumentException iae) { // Great } } }