
MaskingTest.pudu
Pudu40 lines3.7 KB
1/** @Test.Domain.Masking.Suite — hiding members and text inside values */2module PuduLangLog.Domain.MaskingTest34import Std.Io as Io5import Std.Regex as Regex6import Std.Result as Result7import Std.Test as Test8import PuduLangLog.Domain.Masking as Masking9import PuduLangLog as Log10import PuduLangLog.Value as Value111213fn main() -> Int {14 let user = Value.structure("User", [("Name", Value.text("Ada")), ("password", Value.text("s3cret")), ("Card", Value.object([("Pin", Value.int(1234)), ("Last", Value.text("9876"))]))])15 let listed = ["Password", "pin"]16 let digits = Result.unwrapOr(Regex.compile("[0-9]\{4\}"), Regex.unmatchable())17 let letters = Result.unwrapOr(Regex.compile("[a-c]"), Regex.unmatchable())18 let nested = Value.list([Value.text("pin 1234 and 5678"), Value.int(1234), Value.dictionary([("k", Value.text("0000"))]), Value.object([("m", Value.text("x1111"))])])19 let checks = Test.suite("Domain.Masking", &[20 Test.equals("listed members are hidden at any depth, ignoring case", &Masking.members(&user, &listed, "***"), &Value.structure("User", [("Name", Value.text("Ada")), ("password", Value.text("***")), ("Card", Value.object([("Pin", Value.text("***")), ("Last", Value.text("9876"))]))])),21 Test.equals("sequences and dictionaries are searched", &Masking.members(&Value.list([Value.dictionary([("PIN", Value.int(1)), ("x", Value.int(2))])]), &listed, "#"), &Value.list([Value.dictionary([("PIN", Value.text("#")), ("x", Value.int(2))])])),22 Test.equals("dictionaries keyed by other scalars are searched below", &Masking.members(&Value.keyed([(Log.Integer(1), Value.object([("pin", Value.int(3))]))]), &listed, "#"), &Value.keyed([(Log.Integer(1), Value.object([("pin", Value.text("#"))]))])),23 Test.equals("scalars are kept", &Masking.members(&Value.int(5), &listed, "#"), &Value.int(5)),24 Test.equals("a listed property is hidden whole", &Masking.property(&Value.property("PASSWORD", user), &listed, "#"), &Value.property("PASSWORD", Value.text("#"))),25 Test.equals("an unlisted property keeps its unlisted members", &Masking.property(&Value.property("Who", Value.object([("a", Value.int(1))])), &listed, "#"), &Value.property("Who", Value.object([("a", Value.int(1))]))),26 Test.equals("patterns hide matches inside text at any depth", &Masking.text(&nested, &[digits], "*"), &Value.list([Value.text("pin * and *"), Value.int(1234), Value.dictionary([("k", Value.text("*"))]), Value.object([("m", Value.text("x*"))])])),27 Test.equals("every pattern applies in turn", &Masking.text(&Value.text("abc 1234 d"), &[digits, letters], "_"), &Value.text("___ _ d")),28 Test.equals("no pattern keeps text", &Masking.text(&Value.text("1234"), &[], "_"), &Value.text("1234")),29 Test.equals("ignoring members of a tag", &Masking.ignoring(&user, "User", &listed), &Some(Value.structure("User", [("Name", Value.text("Ada")), ("Card", Value.object([("Pin", Value.int(1234)), ("Last", Value.text("9876"))]))]))),30 Test.equals("ignoring leaves other tags and values alone", &(Masking.ignoring(&user, "Order", &listed), Masking.ignoring(&Value.object([("password", Value.int(1))]), "User", &listed), Masking.ignoring(&Value.int(1), "User", &listed)), &(None, None, None)),31 Test.equals("masking members of a tag keeps their places", &Masking.masking(&user, "User", &["name"], "?"), &Some(Value.structure("User", [("Name", Value.text("?")), ("password", Value.text("s3cret")), ("Card", Value.object([("Pin", Value.int(1234)), ("Last", Value.text("9876"))]))]))),32 Test.equals("masking leaves other tags alone", &Masking.masking(&user, "Order", &["name"], "?"), &None)33 ])34 let ran = Test.run(&checks)35 for failure in Test.failuresOf(&ran) {36 let _reported = Io.writeErrorLine(failure)37 }38 Test.report(&ran)39}40