Rego测试:如何测试"not deny"?
Rego testing: how to test "not deny"?
我正在探索使用 opa test
测试我的 Rego 策略,从这个简单的规则开始:
deny["Must be allowed"] {
input.allowed == "no"
}
我能够针对拒绝的情况成功测试它:
test_denied_example {
deny with input as {"allowed":"no"}
}
但是,当我尝试针对应该允许的情况对其进行测试时:
test_allowed_example {
not deny with input as {"allowed":"yes"}
}
我收到一个错误:
data.example.test_allowed_example: FAIL (330.534µs)
Enter data.example.test_allowed_example = _
| Enter data.example.test_allowed_example
| | Fail not data.example.deny with input as {"allowed": "yes"}
| Fail data.example.test_allowed_example = _
除了知道 test_allowed_example
是失败的测试之外,我无法真正解析此错误消息。
如何正确测试允许(不拒绝)输入的用例?
TLDR;你可以说以下任何一个:
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
关键字仅反转 undefined/false 语句(使它们为真)。在这种情况下,deny
指的是 一组值 。该集合可以为空,但绝不能为 undefined/false.
在OPA/Rego中,所有的规则都只是给变量赋值的IF-THEN语句。如果"IF"部分是规则体中的逻辑。 "THEN" 部分是规则头中的赋值。有两种 IF-THEN 语句(又名规则):
- 完整规则,例如,
deny = true { input.allowed == "no" }
- 部分规则,例如
deny[msg] { input.allowed == "no" }
完整的规则将单个值分配给变量。如果省略该值,它默认为 true(例如,deny = true { ... }
和 deny { ... }
表示相同的意思。)当规则的 "IF" 部分为 true/satisfied 时,变量为赋值。当满足规则的 "IF" 部分 false/not 时,变量为 未定义 。这与 false
略有不同,但在大多数情况下并不重要。
部分规则将多个值分配给一个变量。换句话说,它们定义了一组值。当规则的 "IF" 部分为 true/satisfied 时,将规则头中定义的值添加到集合中,否则不添加该值。如果没有值被添加到集合中,它仍然是定义的——它只是空的。
这在简介中有介绍:https://www.openpolicyagent.org/docs/latest/#rules
有关规则的更多示例和信息,请参阅 https://www.openpolicyagent.org/docs/latest/policy-language/#rules
我正在探索使用 opa test
测试我的 Rego 策略,从这个简单的规则开始:
deny["Must be allowed"] {
input.allowed == "no"
}
我能够针对拒绝的情况成功测试它:
test_denied_example {
deny with input as {"allowed":"no"}
}
但是,当我尝试针对应该允许的情况对其进行测试时:
test_allowed_example {
not deny with input as {"allowed":"yes"}
}
我收到一个错误:
data.example.test_allowed_example: FAIL (330.534µs)
Enter data.example.test_allowed_example = _
| Enter data.example.test_allowed_example
| | Fail not data.example.deny with input as {"allowed": "yes"}
| Fail data.example.test_allowed_example = _
除了知道 test_allowed_example
是失败的测试之外,我无法真正解析此错误消息。
如何正确测试允许(不拒绝)输入的用例?
TLDR;你可以说以下任何一个:
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
关键字仅反转 undefined/false 语句(使它们为真)。在这种情况下,deny
指的是 一组值 。该集合可以为空,但绝不能为 undefined/false.
在OPA/Rego中,所有的规则都只是给变量赋值的IF-THEN语句。如果"IF"部分是规则体中的逻辑。 "THEN" 部分是规则头中的赋值。有两种 IF-THEN 语句(又名规则):
- 完整规则,例如,
deny = true { input.allowed == "no" }
- 部分规则,例如
deny[msg] { input.allowed == "no" }
完整的规则将单个值分配给变量。如果省略该值,它默认为 true(例如,deny = true { ... }
和 deny { ... }
表示相同的意思。)当规则的 "IF" 部分为 true/satisfied 时,变量为赋值。当满足规则的 "IF" 部分 false/not 时,变量为 未定义 。这与 false
略有不同,但在大多数情况下并不重要。
部分规则将多个值分配给一个变量。换句话说,它们定义了一组值。当规则的 "IF" 部分为 true/satisfied 时,将规则头中定义的值添加到集合中,否则不添加该值。如果没有值被添加到集合中,它仍然是定义的——它只是空的。
这在简介中有介绍:https://www.openpolicyagent.org/docs/latest/#rules
有关规则的更多示例和信息,请参阅 https://www.openpolicyagent.org/docs/latest/policy-language/#rules