Skip to content

Commit

Permalink
Merge pull request #320 from davidkron/fix-default-nullable-issue
Browse files Browse the repository at this point in the history
respect defaultNullable() of Validateable classes (issue #218)
  • Loading branch information
sbglasius authored Feb 9, 2023
2 parents ae6e649 + de08017 commit 8b4a870
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package grails.plugin.formfields

import grails.core.GrailsApplication
import grails.gorm.validation.DefaultConstrainedProperty
import grails.validation.Validateable
import groovy.transform.PackageScope
import grails.core.support.GrailsApplicationAware
import grails.core.support.proxy.ProxyHandler
Expand Down Expand Up @@ -110,7 +111,9 @@ class BeanPropertyAccessorFactory implements GrailsApplicationAware {
}

private Constrained resolveConstraints(BeanWrapper beanWrapper, String propertyName) {
grails.gorm.validation.Constrained constraint = constraintsEvaluator.evaluate(beanWrapper.wrappedClass)[propertyName]
Class<?> type = beanWrapper.wrappedClass
boolean defaultNullable = Validateable.class.isAssignableFrom(type) ? type.metaClass.invokeStaticMethod(type, 'defaultNullable') : false
grails.gorm.validation.Constrained constraint = constraintsEvaluator.evaluate(type, defaultNullable)[propertyName]
if (!constraint) {
constraint = createDefaultConstraint(beanWrapper, propertyName)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package grails.plugin.formfields

import grails.plugin.formfields.mock.*
import spock.lang.*

import grails.plugin.formfields.mock.Gender
import grails.plugin.formfields.mock.Person
import grails.validation.Validateable
import spock.lang.Issue
import spock.lang.Unroll

@Unroll
class CommandPropertyAccessorSpec extends BuildsAccessorFactory {
Expand Down Expand Up @@ -256,6 +260,20 @@ class CommandPropertyAccessorSpec extends BuildsAccessorFactory {
propertyAccessor.constraints.blank
}

@Issue('https://github.com/grails-fields-plugin/grails-fields/issues/218')
void 'respect defaultNullable() when evaluating constraints of a Validateable'() {
given:
ValidateableCommand command = new ValidateableCommand()
DefaultNullableValidateableCommand command2 = new DefaultNullableValidateableCommand()
and:
def propertyAccessor = factory.accessorFor(command, 'myNullableProperty')
def propertyAccessor2 = factory.accessorFor(command2, 'myNullableProperty')
expect:
!propertyAccessor.constraints.nullable
propertyAccessor2.constraints.nullable
}
}
class TestCommand {
Expand All @@ -278,4 +296,16 @@ class TestCommand {
class UnconstrainedCommand {
String stringProperty
}
}
class ValidateableCommand implements Validateable {
String myNullableProperty
}
class DefaultNullableValidateableCommand implements Validateable {
String myNullableProperty
static boolean defaultNullable() {
return true
}
}

0 comments on commit 8b4a870

Please sign in to comment.