|
Play Framework/Scala example source code file (ValidationSpec.scala)
The ValidationSpec.scala Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play.api.data.validation
import org.specs2.mutable._
import play.api.data._
import play.api.data.Forms._
import play.api.data.format.Formats._
import play.api.data.validation.Constraints._
object ValidationSpec extends Specification {
"text" should {
"throw an IllegalArgumentException if maxLength is negative" in {
{
Form(
"value" -> Forms.text(maxLength = -1)
).bind(Map("value" -> "hello"))
}.must(throwAn[IllegalArgumentException])
}
"return a bound form with error if input is null, even if maxLength=0 " in {
Form("value" -> Forms.text(maxLength = 0)).bind(Map("value" -> null)).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.maxLength") },
{ textData => "The mapping should fail." must equalTo("Error") }
)
}
"throw an IllegalArgumentException if minLength is negative" in {
{
Form(
"value" -> Forms.text(minLength = -1)
).bind(Map("value" -> "hello"))
}.must(throwAn[IllegalArgumentException])
}
"return a bound form with error if input is null, even if minLength=0" in {
Form("value" -> Forms.text(minLength = 0)).bind(Map("value" -> null)).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.minLength") },
{ textData => "The mapping should fail." must equalTo("Error") }
)
}
}
"nonEmptyText" should {
"return a bound form with error if input is null" in {
Form("value" -> nonEmptyText).bind(Map("value" -> null)).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.required") },
{ textData => "The mapping should fail." must equalTo("Error") }
)
}
}
"Constraints.pattern" should {
"throw an IllegalArgumentException if regex is null" in {
{
Form(
"value" -> Forms.text.verifying(Constraints.pattern(null, "nullRegex", "error"))
).bind(Map("value" -> "hello"))
}.must(throwAn[IllegalArgumentException])
}
"throw an IllegalArgumentException if name is null" in {
{
Form(
"value" -> Forms.text.verifying(Constraints.pattern(".*".r, null, "error"))
).bind(Map("value" -> "hello"))
}.must(throwAn[IllegalArgumentException])
}
"throw an IllegalArgumentException if error is null" in {
{
Form(
"value" -> Forms.text.verifying(pattern(".*".r, "nullRegex", null))
).bind(Map("value" -> "hello"))
}.must(throwAn[IllegalArgumentException])
}
}
"Email constraint" should {
val valid = Seq(
""""Fred Bloggs"@example.com""",
""""Joe\\Blow"@example.com""",
""""Abc@def"@example.com""",
"""customer/department=shipping@example.com""",
"""$A12345@example.com""",
"""!def!xyz%abc@example.com""",
"""_somename@example.com""",
"""Ken.O'Brian@company.com"""
)
"validate valid addresses" in {
valid.map{ addr =>
Form( "value" -> email ).bind( Map( "value" -> addr) ).fold(
formWithErrors => false,
{ _ => true}
)
}.exists(_.unary_!) must beFalse
}
val invalid = Seq(
"NotAnEmail",
"@NotAnEmail",
"\"\"test\blah\"\"@example.com",
"\"test\rblah\"@example.com",
"\"\"test\"\"blah\"\"@example.com",
".wooly@example.com",
"wo..oly@example.com",
"pootietang.@example.com",
".@example.com",
"Ima Fool@example.com"
)
"invalidate invalid addresses" in {
invalid.map{ addr =>
Form( "value" -> email ).bind( Map( "value" -> addr) ).fold(
formWithErrors => true,
{ _ => false}
)
}.exists(_.unary_!) must beFalse
}
}
"Min and max constraint on an Int" should {
"5 must be a valid number(1,10)" in {
Form( "value" -> number(1,10) ).bind( Map( "value" -> "5") ).fold(
formWithErrors => { "The mapping should not fail." must equalTo("Error") },
{ number => number must equalTo(5) }
)
}
"15 must not be a valid number(1,10)" in {
Form( "value" -> number(1,10) ).bind( Map( "value" -> "15") ).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.max") },
{ number => "The mapping should fail." must equalTo("Error") }
)
}
}
"Min and max constraint on a Long" should {
"12345678902 must be a valid longNumber(1,10)" in {
Form( "value" -> longNumber(1,123456789023L) ).bind( Map( "value" -> "12345678902") ).fold(
formWithErrors => { "The mapping should not fail." must equalTo("Error") },
{ number => number must equalTo(12345678902L) }
)
}
"-12345678902 must not be a valid longNumber(1,10)" in {
Form( "value" -> longNumber(1,10) ).bind( Map( "value" -> "-12345678902") ).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.min") },
{ number => "The mapping should fail." must equalTo("Error") }
)
}
}
"Min constraint should now work on a String" should {
"Toto must be over CC" in {
Form( "value" -> ( nonEmptyText verifying min("CC") ) ).bind( Map( "value" -> "Toto") ).fold(
formWithErrors => { "The mapping should not fail." must equalTo("Error") },
{ str => str must equalTo("Toto") }
)
}
"AA must not be over CC" in {
Form( "value" -> ( nonEmptyText verifying min("CC") ) ).bind( Map( "value" -> "AA") ).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.min") },
{ str => "The mapping should fail." must equalTo("Error") }
)
}
}
"Max constraint should now work on a Double" should {
"10.2 must be under 100.1" in {
Form( "value" -> ( of[Double] verifying max(100.1) ) ).bind( Map( "value" -> "10.2") ).fold(
formWithErrors => { "The mapping should not fail." must equalTo("Error") },
{ number => number must equalTo(10.2) }
)
}
"110.3 must not be over 100.1" in {
Form( "value" -> ( of[Double] verifying max(100.1) ) ).bind( Map( "value" -> "110.3") ).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.max") },
{ number => "The mapping should fail." must equalTo("Error") }
)
}
}
"Min and max can now be strict" should {
"5 must be a valid number(1,10, strict = true)" in {
Form( "value" -> number(1,10, strict = true) ).bind( Map( "value" -> "5") ).fold(
formWithErrors => { "The mapping should not fail." must equalTo("Error") },
{ number => number must equalTo(5) }
)
}
"5 must still be a valid number(5,10)" in {
Form( "value" -> number(5,10) ).bind( Map( "value" -> "5") ).fold(
formWithErrors => { "The mapping should not fail." must equalTo("Error") },
{ number => number must equalTo(5) }
)
}
"5 must not be a valid number(5,10, strict = true)" in {
Form( "value" -> number(5,10, strict = true) ).bind( Map( "value" -> "5") ).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.min.strict") },
{ number => "The mapping should fail." must equalTo("Error") }
)
}
"Text containing whitespace only should be rejected by nonEmptyText" in {
Form( "value" -> nonEmptyText ).bind( Map( "value" -> " ") ).fold(
formWithErrors => { formWithErrors.errors.head.message must equalTo("error.required") },
{ text => "The mapping should fail." must equalTo("Error") }
)
}
}
"ParameterValidator" should {
"accept a valid value" in {
ParameterValidator(List(Constraints.max(10)), Some(9)) must equalTo (Valid)
}
"refuse a value out of range" in {
val result = Invalid(List(ValidationError("error.max", 10)))
ParameterValidator(List(Constraints.max(10)), Some(11)) must equalTo (result)
}
"validate multiple values" in {
val constraints = List(Constraints.max(10), Constraints.min(1))
val values = Seq(Some(9), Some(0), Some(5))
val expected = Invalid(List(ValidationError("error.min", 1)))
ParameterValidator(constraints, values:_*) must equalTo (expected)
}
"validate multiple string values and multiple validation errors" in {
val constraints = List(Constraints.maxLength(10), Constraints.minLength(1))
val values = Seq(Some(""), Some("12345678910"), Some("valid"))
val expected = Invalid(List(ValidationError("error.minLength", 1), ValidationError("error.maxLength", 10)))
ParameterValidator(constraints, values:_*) must equalTo (expected)
}
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework ValidationSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.