testing - 注册测试 : how to test "not deny"?

标签 testing open-policy-agent rego

我正在探索使用 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 输入为 {"allowed":"yes"}
  • 拒绝 == set() 输入为 {"allowed":"yes"}
  • 不拒绝 ["Must be allowed"] 输入为 {"allowed":"yes"}

最后一个检查集合是否不包含特定消息。如果您在同一个包中有多个 deny 规则,这是个好主意。


not deny with input as ... 语句失败,因为 not 关键字仅反转未定义/假语句(使它们为真)。在这种情况下,deny 指的是一组。该集合可以为空,但绝不会是未定义/假的。

在 OPA/Rego 中,所有规则都只是为变量赋值的 IF-THEN 语句。如果“IF”部分是规则体中的逻辑。 “THEN”部分是规则头中的赋值。有两种 IF-THEN 语句(也称为规则):

  1. 完整规则,例如,deny = true { input.allowed == "no"}
  2. 部分规则,例如,deny[msg] { input.allowed == "no"}

完整的规则将 SINGLE 值分配给变量。如果您省略该值,它默认为 true(例如,deny = true { ... } deny { ... } 意思相同。)当“如果规则的“部分为真/满足,则为变量分配值。当规则的“IF”部分为假/不满足时,变量未定义。这与 false 略有不同,但在大多数情况下这并不重要。

部分规则将多个值分配给一个变量。换句话说,它们定义了一组值。当规则的“IF”部分为真/满足时,将规则头中定义的值添加到集合中,否则不添加该值。如果没有值被添加到集合中,它仍然是定义的——它只是空的。

这在简介中有介绍:https://www.openpolicyagent.org/docs/latest/#rules

有关规则的更多示例和信息,请参阅 https://www.openpolicyagent.org/docs/latest/policy-language/#rules

关于testing - 注册测试 : how to test "not deny"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60083793/

相关文章:

testing - 使 Grails Geb 测试具有事务性

node.js - 使用自定义 header 测试 NodeJS socket.io

python - 运行测试前的 Pytest 和数据库清理

authorization - 使用开放策略代理(OPA)作为ABAC系统

azure - 如何为 k8s 部署创建自定义 Azure 策略?

OPA 给出错误 "rego_parse_error: var cannot be used for rule name"

delphi - 有什么方法可以操纵 TimeGetTime 计时器的值

unit-testing - rego_type_error : undefined function

open-policy-agent - 比较 Rego 语言中的两个数组

open-policy-agent - 即使比较结果为 false,OPA/rego 结果也为 true