Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-validator

Typed fluent validation rules for Pudu

0.1.1Apache-2.01

InstallClose

ValidatorTest.pudu

Pudu42 lines2.2 KB

GitHub ↗
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