Re go тестирование: как проверить "не отрицать"? - PullRequest
0 голосов
/ 05 февраля 2020

Я изучаю тестирование моих политик Re go с использованием opa test, начиная с этого тривиального правила:

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 = _

I не могу разобрать это сообщение об ошибке, кроме как знать, что test_allowed_example был неудачным тестом.

Как правильно тестировать случаи, когда ввод разрешен (не запрещен)?

1 Ответ

1 голос
/ 06 февраля 2020

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"}

Последний проверяет если набор не содержит указанное сообщение c. Это хорошая идея, если в одном пакете несколько правил deny.


Оператор not deny with input as ... завершается неудачно, поскольку ключевое слово not инвертирует только операторы undefined / false (делая их истинными) , В этом случае deny относится к набору значений . Набор может быть пустым, но никогда не может быть неопределенным / ложным.

В OPA / Re go все правила являются просто операторами IF-THEN, которые присваивают значения переменным. Если часть «IF» - это логика c в теле правила. Часть «THEN» - это назначение в заголовке правила. Существует два вида утверждений IF-THEN (или правил):

  1. Полные правила , например, deny = true { input.allowed == "no" }
  2. Частичные правила , например, deny[msg] { input.allowed == "no" }

Полные правила присваивают значение SINGLE переменной. Если вы опускаете значение, по умолчанию оно равно true (например, 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

...