Skip to content

Commit ea4e260

Browse files
Picked some changes from gbif branch
1 parent da5d7ed commit ea4e260

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

src/main/java/io/frictionlessdata/tableschema/field/Field.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.*;
1616
import java.util.regex.Matcher;
1717
import java.util.regex.Pattern;
18+
import java.util.stream.Collectors;
1819

1920
/**
2021
* Definition of a field in a data table. Doesn't hold values
@@ -651,7 +652,8 @@ T castValue(String value, boolean enforceConstraints, Map<String, Object> option
651652
if(enforceConstraints && this.constraints != null){
652653
Map<String, Object> violatedConstraints = checkConstraintViolations(castValue);
653654
if(!violatedConstraints.isEmpty()){
654-
throw new ConstraintsException("Violated "+ violatedConstraints.size()+" constraints");
655+
String violatedConstraintNames = String.join(", ", violatedConstraints.keySet());
656+
throw new ConstraintsException("Field '" + this.name + "' value '" + value + "' violates constraint(s) [" + violatedConstraintNames+"]");
655657
}
656658
}
657659

@@ -660,7 +662,7 @@ T castValue(String value, boolean enforceConstraints, Map<String, Object> option
660662
} catch(ConstraintsException ce){
661663
throw ce;
662664
} catch (TypeInferringException e) {
663-
throw new InvalidCastException("Field [" + this.name + "] provided value [" + value + "] is not of [" + type + "] type.");
665+
throw new InvalidCastException("Field '" + this.name + "' provided value '" + value + "' is not of '" + type + "' type.");
664666
} catch(Exception e){
665667
throw new InvalidCastException(e);
666668
}

src/test/java/io/frictionlessdata/tableschema/field/FieldConstraintsTest.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.frictionlessdata.tableschema.exception.ConstraintsException;
66
import io.frictionlessdata.tableschema.util.JsonUtil;
77
import org.junit.jupiter.api.Assertions;
8+
import org.junit.jupiter.api.DisplayName;
89
import org.junit.jupiter.api.Test;
910

1011
import java.math.BigInteger;
@@ -95,7 +96,8 @@ public void testMinAndMaxLengthString() throws Exception{
9596
violatedConstraints = field.checkConstraintViolations(valueLength49);
9697
Assertions.assertTrue(violatedConstraints.containsKey(Field.CONSTRAINT_KEY_MAX_LENGTH));
9798

98-
assertThrows(ConstraintsException.class, () -> {field.castValue("This string length is greater than 45 characters.");});
99+
ConstraintsException ex = assertThrows(ConstraintsException.class, () -> {field.castValue("This string length is greater than 45 characters.");});
100+
Assertions.assertEquals("Field 'test' value 'This string length is greater than 45 characters.' violates constraint(s) [maxLength]", ex.getMessage());
99101
}
100102

101103
@Test
@@ -783,6 +785,26 @@ public void testEnumYearMonth(){
783785
}
784786

785787

788+
@Test
789+
@DisplayName("Test our validation message shows both pattern and maxLength constraints violated")
790+
public void testPatternAndMaxlength(){
791+
Map<String, Object> violatedConstraints = null;
792+
793+
Map<String, Object> constraints = new HashMap<>();
794+
constraints.put(Field.CONSTRAINT_KEY_PATTERN, "testing[0-9]+");
795+
constraints.put(Field.CONSTRAINT_KEY_MAX_LENGTH, 45);
796+
797+
StringField field = new StringField("test", null, null, null, null, constraints, null, null);
798+
799+
String valueLength49 = field.castValue("This string length is greater than 45 characters.", false, null);
800+
violatedConstraints = field.checkConstraintViolations(valueLength49);
801+
Assertions.assertTrue(violatedConstraints.containsKey(Field.CONSTRAINT_KEY_MAX_LENGTH));
802+
Assertions.assertTrue(violatedConstraints.containsKey(Field.CONSTRAINT_KEY_PATTERN));
803+
804+
ConstraintsException ex = assertThrows(ConstraintsException.class, () -> {field.castValue("This string length is greater than 45 characters.");});
805+
Assertions.assertEquals("Field 'test' value 'This string length is greater than 45 characters.' violates constraint(s) [pattern, maxLength]", ex.getMessage());
806+
}
807+
786808
private JsonNode createJsonNode(Object obj) {
787809
return JsonUtil.getInstance().createNode(obj);
788810
}

0 commit comments

Comments
 (0)