Skip to content

Commit

Permalink
[playframework#426] @Valid now works on Collections
Browse files Browse the repository at this point in the history
  • Loading branch information
guillaumebort committed Jan 19, 2011
1 parent 7e90132 commit d965fcf
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 15 deletions.
24 changes: 24 additions & 0 deletions framework/src/play/data/validation/ValidCheck.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package play.data.validation;

import java.util.Collection;
import java.util.List;
import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
Expand Down Expand Up @@ -39,6 +40,28 @@ public boolean isSatisfied(Object validatedObject, Object value, OValContext con
if (superKey != null) {
key = superKey + "." + key;
}
if(value instanceof Collection) {
Collection valueCollection = (Collection)value;
boolean everythingIsValid = true;
int index = 0;
for(Object item : valueCollection) {
if(!validateObject(key + "[" + (index) + "]", item)) {
Validation.current().errors.add(new Error(key + "[" + (index) + "]", mes, new String[0]));
everythingIsValid = false;
}
index++;
}
if(!everythingIsValid) {
return false;
} else {
return true;
}
} else {
return validateObject(key, value);
}
}

boolean validateObject(String key, Object value) {
ValidationPlugin.keys.get().put(value, key);
List<ConstraintViolation> violations = new Validator().validate(value);
//
Expand All @@ -56,4 +79,5 @@ public boolean isSatisfied(Object validatedObject, Object value, OValContext con
return false;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@

public class Validation extends Controller {

public static void index(@Valid Bottle bottle) {
renderText(validation.errors());
public static void index(@Required @Valid Bottle bottle) {
renderText(validation.errorsMap());
}

public static void user(@Valid User user) {
renderText(validation.errors());
public static void user(@Required @Valid User user) {
renderText(validation.errorsMap());
}

}
Expand Down
7 changes: 7 additions & 0 deletions samples-and-tests/just-test-cases/app/models/Address.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
import javax.persistence.*;
import java.util.*;

import play.data.validation.*;

@Entity
public class Address {

@Id
public String id;

public String street;

public City city;
public int number;

Expand All @@ -20,5 +23,9 @@ public class Address {
@Transient
public List<Dog> dogs;

public String toString() {
return street;
}

}

14 changes: 14 additions & 0 deletions samples-and-tests/just-test-cases/app/models/MyAddress.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package models;

import java.util.*;

import play.data.validation.*;

public class MyAddress {

@Required
public String street;
public int number;

}

4 changes: 4 additions & 0 deletions samples-and-tests/just-test-cases/app/models/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ public User() {

@Email
public String email;

@Valid
@Transient
public List<MyAddress> addresses;

public String toString() {
return name;
Expand Down
30 changes: 19 additions & 11 deletions samples-and-tests/just-test-cases/test/validation.test.html
Original file line number Diff line number Diff line change
@@ -1,37 +1,45 @@
#{selenium 'Test validation'}

open('@{Validation.index()}')
assertTextPresent('[Required, Required, Validation failed]')
assertTextPresent('{bottle.name1=[Required], bottle.name2=[Required], bottle=[Validation failed]}')

open('@{Validation.index()}?bottle.name1=Coucou')
assertTextPresent('[Required, Validation failed]')
assertTextPresent('{bottle.name2=[Required], bottle=[Validation failed]}')

open('@{Validation.index()}?bottle.name2=Ho')
assertTextPresent('[Required, Minimum size is 3, Validation failed]')
assertTextPresent('{bottle.name1=[Required], bottle.name2=[Minimum size is 3], bottle=[Validation failed]}')

open('@{Validation.index()}?bottle.name2=Hop')
assertTextPresent('[Required, Validation failed]')
assertTextPresent('{bottle.name1=[Required], bottle=[Validation failed]}')

open('@{Validation.index()}?bottle.name1=Ye&bottle.name2=Hop')
assertTextPresent('[wrong.bottle, Validation failed]')
assertTextPresent('{bottle.name1=[wrong.bottle], bottle=[Validation failed]}')

open('@{Validation.index()}?bottle.name1=Hop&bottle.name2=Hop')
assertTextPresent('[]')
assertTextPresent('{}')


open('@{Validation.user()}')
assertTextPresent('[Required, Validation failed]')
assertTextPresent('{user.birth=[Required], user=[Validation failed]}')

open('@{Validation.user()}?user.name=Nicolas')
assertTextPresent('[Required, Validation failed]')
assertTextPresent('{user.birth=[Required], user=[Validation failed]}')

open('@{Validation.user()}?user.birth=12/12/1992&user.email=nico')
assertTextPresent('[Invalid email address, Validation failed]')
assertTextPresent('{user.email=[Invalid email address], user=[Validation failed]}')

open('@{Validation.user()}?user.birth=12/12/1992&user.email=nico%2Bplay@lunatech.com')
assertTextPresent('[]')
assertTextPresent('{}')

open('@{Validation.user()}?user.birth=12/12/1992&user.email=NICO%2Bplay@LUNATECH.COM')
assertTextPresent('[]')
assertTextPresent('{}')

// @Valid on collections

open('@{Validation.user()}?user.birth=12/12/1992&user.email=NICO%2Bplay@LUNATECH.COM&user.addresses[0].street=Rotterdam+St&user.addresses[1].number=4')
assertTextPresent('{user.addresses[1].street=[Required], user.addresses[1]=[Validation failed], user.addresses=[Validation failed], user=[Validation failed]}')

open('@{Validation.user()}?user.birth=12/12/1992&user.email=NICO%2Bplay@LUNATECH.COM&user.addresses[0].street=Rotterdam+St&user.addresses[1].street=Paris+St')
assertTextPresent('{}')

#{/selenium}

0 comments on commit d965fcf

Please sign in to comment.