Testing Rego测试:如何测试;不否认;?

Testing Rego测试:如何测试;不否认;?,testing,open-policy-agent,rego,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 in

我正在探索使用
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\u allowed\u示例
是失败的测试之外,我无法真正解析此错误消息


如何正确地测试允许输入(不拒绝)的案例;你可以这样说:

  • count(deny)==0,输入为{“允许”:“是”}
  • deny==set(),输入为{“允许”:“是”}
  • not deny[“必须允许”],输入为{“允许”:“是”}
最后一个检查集合是否包含特定消息。如果在同一个包中有多个
deny
规则,这是一个好主意


not deny with input as…
语句失败,因为
not
关键字仅反转未定义/错误的语句(使其为真)。在这种情况下,
deny
引用一组值。该集合可以为空,但决不能为未定义/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/满足时,将为变量赋值。当规则的“IF”部分为false/未满足时,变量未定义。这与
    false
    略有不同,但在大多数情况下并不重要

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

    导言中介绍了这一点:


    有关规则的更多示例和信息,请参见TLDR;你可以这样说:

    • count(deny)==0,输入为{“允许”:“是”}
    • deny==set(),输入为{“允许”:“是”}
    • not deny[“必须允许”],输入为{“允许”:“是”}
    最后一个检查集合是否包含特定消息。如果在同一个包中有多个
    deny
    规则,这是一个好主意


    not deny with input as…
    语句失败,因为
    not
    关键字仅反转未定义/错误的语句(使其为真)。在这种情况下,
    deny
    引用一组值。该集合可以为空,但决不能为未定义/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/满足时,将为变量赋值。当规则的“IF”部分为false/未满足时,变量未定义。这与
    false
    略有不同,但在大多数情况下并不重要

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

    导言中介绍了这一点:


    有关规则的更多示例和信息,请参见

    谢谢,详细说明为甲烷储罐澄清了rego中的变量行为,详细说明为我澄清了rego中的变量行为