From cc66e6e00753c56df339b32f777636e1e871b874 Mon Sep 17 00:00:00 2001 From: rmorrise Date: Wed, 29 Oct 2014 17:33:09 -0400 Subject: [PATCH] Collection field name was missing '.0.' for the first collection item. Fixed a bug where the first collection field was not being given a '.0.'. Updated unit test to check field name. Updated version and README. --- .gitignore | 1 + CascadeValidationGrailsPlugin.groovy | 2 +- README.md | 2 +- .../CascadeValidationConstraint.groovy | 2 +- .../CascadeValidationConstraintSpec.groovy | 32 +++++++++++++++---- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 0caeb06..0810020 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /.settings /.idea /target +/classes /web-app/WEB-INF grails-cascade-validation-*.zip grails-cascade-validation-*.zip.sha1 diff --git a/CascadeValidationGrailsPlugin.groovy b/CascadeValidationGrailsPlugin.groovy index 813911a..04c5741 100644 --- a/CascadeValidationGrailsPlugin.groovy +++ b/CascadeValidationGrailsPlugin.groovy @@ -2,7 +2,7 @@ import com.cscinfo.platform.constraint.CascadeValidationConstraint import org.codehaus.groovy.grails.validation.ConstrainedProperty class CascadeValidationGrailsPlugin { - def version = "0.1.3" + def version = "0.1.4" def grailsVersion = "2.3 > *" def title = "Cascade Validation Plugin" def author = "Russell Morrisey" diff --git a/README.md b/README.md index 521cdf4..baf5ddd 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ To use this plugin, add the plugin to BuildConfig.groovy: ```groovy plugins { //CSC custom plugin for 'cascade' constraint - compile ":cascade-validation:0.1.3" + compile ":cascade-validation:0.1.4" } ``` Here is an example of a command object that uses the plugin: diff --git a/src/groovy/com/cscinfo/platform/constraint/CascadeValidationConstraint.groovy b/src/groovy/com/cscinfo/platform/constraint/CascadeValidationConstraint.groovy index 6e97d19..4314bab 100644 --- a/src/groovy/com/cscinfo/platform/constraint/CascadeValidationConstraint.groovy +++ b/src/groovy/com/cscinfo/platform/constraint/CascadeValidationConstraint.groovy @@ -49,7 +49,7 @@ class CascadeValidationConstraint extends AbstractVetoingConstraint { List childFieldErrors = childErrors.fieldErrors childFieldErrors.each { FieldError childFieldError -> String field - if(index) { + if(index != null) { field = "${propertyName}.${index}.${childFieldError.field}" } else { field = "${propertyName}.${childFieldError.field}" diff --git a/test/unit/com/cscinfo/platform/constraint/CascadeValidationConstraintSpec.groovy b/test/unit/com/cscinfo/platform/constraint/CascadeValidationConstraintSpec.groovy index 3db56a4..2cc4f7a 100644 --- a/test/unit/com/cscinfo/platform/constraint/CascadeValidationConstraintSpec.groovy +++ b/test/unit/com/cscinfo/platform/constraint/CascadeValidationConstraintSpec.groovy @@ -77,7 +77,9 @@ class CascadeValidationConstraintSpec extends Specification { String[] codes = ['A', 'B'] def defaultMessage = 'default' Object[] args = [Mock(Object)] - def fieldError = new FieldError('obj', 'field', rejected, true, codes, + + def field = 'field' + def fieldError = new FieldError('obj', field, rejected, true, codes, args, defaultMessage) def fieldErrors = [fieldError] def parentName = 'foo' @@ -91,8 +93,12 @@ class CascadeValidationConstraintSpec extends Specification { 1 * childErrors.fieldErrors >> fieldErrors 1 * errors.objectName >> parentName 1 * errors.addError({ - it.objectName == parentName && it.bindingFailure == true && it.codes == codes && it.arguments == args && it - .defaultMessage == defaultMessage + it.objectName == parentName && + it.field == "property." + field && + it.bindingFailure == true && + it.codes == codes && + it.arguments == args && + it.defaultMessage == defaultMessage }) result == true } @@ -112,7 +118,8 @@ class CascadeValidationConstraintSpec extends Specification { String[] codes = ['A', 'B'] def defaultMessage = 'default' Object[] args = [Mock(Object)] - def fieldError = new FieldError('obj', 'field', rejected, true, codes, + def field = 'field' + def fieldError = new FieldError('obj', field, rejected, true, codes, args, defaultMessage) def fieldErrors = [fieldError] def parentName = 'foo' @@ -128,9 +135,20 @@ class CascadeValidationConstraintSpec extends Specification { 1 * child1Errors.fieldErrors >> fieldErrors 1 * child2Errors.fieldErrors >> fieldErrors target.size() * errors.objectName >> parentName - target.size() * errors.addError({ - it.objectName == parentName && it.bindingFailure == true && it.codes == codes && it.arguments == args && it - .defaultMessage == defaultMessage + 1 * errors.addError({ + it.objectName == parentName && + it.field == "children.0." + field && + it.bindingFailure == true && + it.codes == codes && + it.arguments == args && + it.defaultMessage == defaultMessage + }) + 1 * errors.addError({ + it.objectName == parentName && it.field == "children.1." + field && + it.bindingFailure == true && + it.codes == codes && + it.arguments == args && + it.defaultMessage == defaultMessage }) result == true }