1

我正在探索使用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除了知道这是失败的测试外,我无法真正解析此错误消息。

如何正确测试允许输入(不拒绝)的用例?

4

1 回答 1

4

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关键字仅反转未定义/错误的语句(使它们为真)。在这种情况下,deny指的是一组值。该集合可以是空的,但它永远不会是未定义/假的。

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

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

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

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

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

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

于 2020-02-06T14:29:11.073 回答