Files
regorus/tests/interpreter/cases/import/tests.yaml
Anand Krishnamoorthi 9426b2ec02 fix: Imports without a name binding (#543)
Handle imports that don't use the `as` clause to create a binding.
These imports are bound to the last identifier in the imported path.

Fix both interpreter and compiler.
Add tests.

fixes #541

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
2026-01-15 03:57:52 +05:30

191 lines
3.5 KiB
YAML

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
cases:
- note: import input
input:
a: 10
modules:
- |
package a
import input as foo
b = foo
- |
package b
import input.a
import input.a as A
c = a
d = A
query: data
want_result:
a:
b:
a: 10
b:
c: 10
d: 10
- note: import data, cross ref
modules:
- |
package a
import data.b.a
b = a + 1
- |
package b
import rego.v1
# Both the following imports are overridden by rules
#import data.a.b as a
#import data.a.b
import data.a.b as C
import data.a.b
a = 10
c = C + b
r if {
some v in [C]
}
query: data
want_result:
a:
b: 11
b:
a: 10
c: 22
r: true
- note: import data inside rule body
modules:
- |
package lib
import rego.v1
a_value := "a_value"
- |
package rules
import data.lib
import rego.v1
sample if {
lib.a_value == "a_value"
}
query: data.rules.sample
want_result: true
- note: import data alias
modules:
- |
package lib
import rego.v1
value := "a_value"
- |
package rules
import data.lib as mylib
import rego.v1
sample if {
mylib.value == "a_value"
}
query: data.rules.sample
want_result: true
- note: import nested package chain
modules:
- |
package lib.inner
import rego.v1
nested := {"key": "value"}
- |
package rules
import data.lib.inner
import rego.v1
lookup := value if {
value := inner.nested.key
}
query: data.rules.lookup
want_result: "value"
- note: import alias shadowed by rule
modules:
- |
package lib
import rego.v1
value := "from data"
- |
package rules
import data.lib as lib_alias
import rego.v1
lib_alias := {"value": "from rule"}
# TODO:
# OPA currently reports this rule as undefined. This implies that
# lib_alias retains the imported value eventhough there is a rule
# with same name. In regorus, the rule takes precedence.
# Needs investigation to figure out which behavior is correct.
shadow if {
lib_alias.value == "from rule"
}
query: data.rules.shadow
want_result: true
- note: import used in comprehension
modules:
- |
package lib
import rego.v1
dataset := {"a", "b"}
- |
package rules
import data.lib
import rego.v1
present if {
some item in lib.dataset
item == "b"
}
query: data.rules.present
want_result: true
- note: import overridden by rule
modules:
- |
package a
a = 10
- |
package b
import data.a.a
a = 20
query: data.b.a
want_result: 20
- note: invalid import ref
modules:
- |
package a
import foo
query: data
error: "import path must begin with one of"
- note: redundant import input
modules:
- |
package test
import input
query: data.test
want_result: {}