Files
regorus/tests/rvm/rego/cases/default_rules.yaml
Mark Birger 83ce8c3580 Fix RVM evaluation of default-only rules (#664)
Default-only rules (e.g., `default deny := true` with no conditional body)
returned Undefined in the RVM instead of the default value.

Compiler:
- compute_rule_type: return Complete when rule exists only in default_rules map
- compile_worklist_rule: emit register slots and data-tree entries for
  default-only rules (else branch)

VM:
- execute_call_rule_common + execute_call_rule_suspendable: check
  default_literal_index before returning Undefined when definitions is empty

Tests:
- 3 new RVM cases (default_rules.yaml): bool, object, entry-point
- 3 new interpreter cases (default/basic.yaml): matching coverage

Co-authored-by: Mark Birger <markbirger@microsoft.com>
2026-04-07 11:38:50 -05:00

266 lines
6.0 KiB
YAML

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# Default Rules Test Suite
# Tests default rule evaluation when complete rules have no successful definitions
cases:
- note: default_rule_basic
data: {}
modules:
- |
package test
default allow := false
allow := true if {
false # This will always fail
}
query: data.test.allow
want_result: false
- note: default_rule_with_multiple_definitions_all_fail
data: {}
modules:
- |
package test
default result := "default_value"
result := "success1" if {
false # This will fail
}
result := "success2" if {
input.nonexistent == "value" # This will fail
}
result := "success3" if {
1 == 2 # This will fail
}
query: data.test.result
want_result: "default_value"
- note: default_rule_not_used_when_definition_succeeds
data: {}
modules:
- |
package test
default allow := false
allow := true if {
1 == 1 # This will succeed
}
query: data.test.allow
want_result: true
- note: default_rule_with_object_key
skip: true # TODO: Fix rule type classification for config["timeout"] - should be Complete, not PartialObject
data: {}
modules:
- |
package test
default config["timeout"] := 30
config["timeout"] := 60 if {
false # This will fail
}
query: data.test.config.timeout
want_result: 30
- note: default_rule_complex_value
data: {}
modules:
- |
package test
default settings := {
"enabled": false,
"retries": 3,
"timeout": 30
}
settings := {
"enabled": true,
"retries": 5,
"timeout": 60
} if {
false # This will fail
}
query: data.test.settings
want_result:
enabled: false
retries: 3
timeout: 30
- note: default_rule_with_array
data: {}
modules:
- |
package test
default items := ["default1", "default2"]
items := ["actual1", "actual2"] if {
false # This will fail
}
query: data.test.items
want_result: ["default1", "default2"]
- note: default_rule_with_input_dependency
data: {}
modules:
- |
package test
default result := "no_user"
result := "admin" if {
input.user.role == "admin"
}
result := "user" if {
input.user.role == "user"
}
query: data.test.result
want_result: "no_user"
- note: default_rule_with_input_dependency_success
data: {}
input:
user:
role: "admin"
modules:
- |
package test
default result := "no_user"
result := "admin" if {
input.user.role == "admin"
}
result := "user" if {
input.user.role == "user"
}
query: data.test.result
want_result: "admin"
- note: default_rule_with_data_dependency
data:
config:
mode: "production"
modules:
- |
package test
default debug_mode := false
debug_mode := true if {
data.config.mode == "development"
}
query: data.test.debug_mode
want_result: false
- note: default_rule_nested_package
data: {}
modules:
- |
package test.auth
default allow := false
allow := true if {
false # This will fail
}
query: data.test.auth.allow
want_result: false
- note: default_only_rule_bool
data: {}
modules:
- |
package test
default deny := true
query: data.test.deny
want_result: true
- note: default_only_rule_object
data: {}
modules:
- |
package test
default deny := {"result": false, "reasons": []}
query: data.test.deny
want_result:
result: false
reasons: []
- note: default_only_rule_with_entry_point
data: {}
modules:
- |
package graph.mypolicy
default deny := {"result": false, "reasons": []}
entry_points:
- data.graph.mypolicy.deny
query: data.graph.mypolicy.deny
want_result:
result: false
reasons: []
- note: multiple_default_rules_different_names
skip: true
data: {}
modules:
- |
package test
default allow := false
default deny := true
allow := true if {
false # This will fail
}
deny := false if {
false # This will fail
}
query: data.test
want_result:
allow: false
deny: true
- note: default_rule_with_computed_value
skip: true
data: {}
modules:
- |
package test
base_timeout := 10
default timeout := base_timeout * 3
timeout := base_timeout * 6 if {
false # This will fail
}
query: data.test.timeout
want_result: 30
- note: default_rule_undefined_vs_default
skip: true
data: {}
modules:
- |
package test
default has_default := "default"
# no_default rule has no default and no successful definitions
no_default := "success" if {
false # This will fail
}
query: data.test
want_result:
has_default: "default"
- note: default_rule_with_function_call
skip: true
data: {}
modules:
- |
package test
helper_func := "helper_result"
default result := helper_func
result := "success" if {
false # This will fail
}
query: data.test.result
want_result: "helper_result"
- note: default_rule_consistency_check
data: {}
modules:
- |
package test
default value := 42
value := 42 if {
true # This succeeds with same value as default
}
value := 99 if {
false # This fails
}
query: data.test.value
want_result: 42