Rego测试:如何测试“不拒绝”?

问题描述 投票:0回答: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是失败的测试之外,我无法真正解析此错误消息。

我如何正确测试允许输入(不拒绝输入)的情况?

testing open-policy-agent rego
1个回答
1
投票

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

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

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

完整规则将单个值分配给变量。如果您忽略该值,则默认为true(例如deny = true { ... }deny { ... }表示同一意思。)当规则的“ IF”部分为true / satisfid时,便会为变量分配该值。当规则的“ IF”部分为假/不满足时,变量为undefined。与false稍有不同,但是在大多数情况下并不重要。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.