eir*_*kir 4 testing open-policy-agent rego
我正在探索使用opa test以下简单规则来测试我的 Rego 策略:
deny["Must be allowed"] {\n input.allowed == "no"\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我能够在被拒绝的情况下成功测试这一点:
\n\ntest_denied_example {\n deny with input as {"allowed":"no"}\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我尝试针对应该允许的情况对其进行测试时,如下所示:
\n\ntest_allowed_example {\n not deny with input as {"allowed":"yes"}\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我收到错误:
\n\ndata.example.test_allowed_example: FAIL (330.534\xc2\xb5s)\n\n Enter data.example.test_allowed_example = _\n | Enter data.example.test_allowed_example\n | | Fail not data.example.deny with input as {"allowed": "yes"}\n | Fail data.example.test_allowed_example = _\nRun Code Online (Sandbox Code Playgroud)\n\ntest_allowed_example除了知道这是失败的测试之外,我无法真正解析此错误消息。
如何正确测试允许(而不是拒绝)输入的情况?
\n太长了;你可以说以下任何一个:
count(deny) == 0 with input as {"allowed":"yes"}deny == set() with input as {"allowed":"yes"}not deny["Must be allowed"] with input as {"allowed":"yes"}最后一个检查该集合是否不包含特定消息。deny如果同一个包中有多个规则,这是一个好主意。
该not deny with input as ...语句失败,因为not关键字仅反转未定义/错误语句(使它们为真)。在本例中,deny指的是一组值。该集合可以为空,但绝不会是未定义/错误。
在 OPA/Rego 中,所有规则都只是为变量赋值的 IF-THEN 语句。如果“IF”部分是规则体中的逻辑。“THEN”部分是规则头中的分配。有两种 IF-THEN 语句(也称为规则):
deny = true { input.allowed == "no" }deny[msg] { input.allowed == "no" }完整的规则将单个值分配给变量。如果省略该值,则默认为 true(例如,deny = true { ... }表示deny { ... }相同的事情。)当规则的“IF”部分为 true/满足时,将为变量分配该值。当规则的“IF”部分为 false/不满足时,变量为undefined。这与此略有不同,false但在大多数情况下这并不重要。
部分规则将多个值分配给变量。换句话说,它们定义了一组值。当规则的“IF”部分为真/满足时,规则头中定义的值将添加到集合中,否则不添加该值。如果没有值添加到集合中,它仍然是已定义的——它只是空的。
简介中对此进行了介绍:https ://www.openpolicyagent.org/docs/latest/#rules
有关规则的更多示例和信息,请参阅https://www.openpolicyagent.org/docs/latest/policy-language/#rules