
ValidatorTest.pudu
Pudu42 lines2.2 KB
1/** @Test.Validation.Validator.Suite — checks rule order and selection */2module PuduLangValidator.ValidatorTest34import Std.Test as Test5import PuduLangValidator.Result as Validation6import PuduLangValidator.Rule as Rule7import PuduLangValidator.Rules.Collection as CollectionRule8import PuduLangValidator.Rules.Number as NumberRule9import PuduLangValidator.Rules.Text as TextRule10import PuduLangValidator.Validator as Validator1112/** @Test.Validation.Person.Model — fixture for typed selectors */13type Person = { name: Str, age: Int, emails: Array[Str] }1415fn rules() -> Validator.Validator[Person] {16 let name = Rule.build(TextRule.notEmpty(Rule.ruleFor("name", |person: Person| person.name)))17 let age = Rule.build(NumberRule.greaterThan(Rule.ruleFor("age", |person: Person| person.age), 17))18 let emails = CollectionRule.forEach("emails", |person: Person| person.emails,19 |email: Str| email.contains("@"), "Email at \{CollectionIndex\} needs an @ sign.")20 let empty: Validator.Validator[Person] = Validator.create()21 Validator.add(Validator.add(Validator.add(empty, name), age), emails)22}2324fn main() -> Int {25 let validator = rules()26 let bad = Validator.validate(&validator, Person{name: " ", age: 12, emails: ["ok@site", "broken"]})27 let good = Validator.validate(&validator, Person{name: "Ada", age: 18, emails: ["ada@site"]})28 let chosen = Validator.validateWith(&validator, Person{name: " ", age: 12, emails: []},29 Validator.Options{properties: ["age"], ruleSets: [], includeDefault: true})30 let checks = Test.suite("Validator", &[31 Test.equals("valid input has no failures", &good.isValid, &true),32 Test.equals("failures remain in rule order", &bad.errors.map(|error: Validation.Failure| error.propertyName), &[33 "name", "age", "emails[1]"34 ]),35 Test.equals("collection index renders", &bad.errors[2].errorMessage, &"Email at 1 needs an @ sign."),36 Test.equals("property selection excludes other rules", &chosen.errors.length(), &1),37 Test.equals("property selection keeps chosen path", &chosen.errors[0].propertyName, &"age"),38 Test.equals("messages join in order", &Validation.messages(&chosen, "|"), &"Number must be greater than 17.")39 ])40 Test.report(&Test.run(&checks))41}42