mirror of
https://github.com/open-policy-agent/opa.git
synced 2026-08-13 03:42:35 -06:00
55b053b79a
This is just a skeleton but the basic functionality is there: run OPA in a "one shot" mode against a set of input files and print the results for each. Fixes #3525 Signed-off-by: Torin Sandall <torinsandall@gmail.com>
150 lines
3.1 KiB
Go
150 lines
3.1 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/open-policy-agent/opa/cmd/internal/exec"
|
|
sdk_test "github.com/open-policy-agent/opa/sdk/test"
|
|
"github.com/open-policy-agent/opa/util"
|
|
"github.com/open-policy-agent/opa/util/test"
|
|
)
|
|
|
|
func TestExecBasic(t *testing.T) {
|
|
|
|
files := map[string]string{
|
|
"test.json": `{"foo": 7}`,
|
|
"test2.yaml": `bar: 8`,
|
|
"test3.yml": `baz: 9`,
|
|
"ignore": `garbage`, // do not recognize this filetype
|
|
}
|
|
|
|
test.WithTempFS(files, func(dir string) {
|
|
|
|
s := sdk_test.MustNewServer(sdk_test.MockBundle("/bundles/bundle.tar.gz", map[string]string{
|
|
"test.rego": `
|
|
package system
|
|
main["hello"]
|
|
`,
|
|
}))
|
|
|
|
defer s.Stop()
|
|
|
|
var buf bytes.Buffer
|
|
params := exec.NewParams(&buf)
|
|
_ = params.OutputFormat.Set("json")
|
|
params.ConfigOverrides = []string{
|
|
"services.test.url=" + s.URL(),
|
|
"bundles.test.resource=/bundles/bundle.tar.gz",
|
|
}
|
|
|
|
params.Paths = append(params.Paths, dir)
|
|
err := runExec(params)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := util.MustUnmarshalJSON(bytes.ReplaceAll(buf.Bytes(), []byte(dir), nil))
|
|
|
|
exp := util.MustUnmarshalJSON([]byte(`{"result": [{
|
|
"path": "/test.json",
|
|
"result": ["hello"]
|
|
}, {
|
|
"path": "/test2.yaml",
|
|
"result": ["hello"]
|
|
}, {
|
|
"path": "/test3.yml",
|
|
"result": ["hello"]
|
|
}]}`))
|
|
|
|
if !reflect.DeepEqual(output, exp) {
|
|
t.Fatal("Expected:", exp, "Got:", output)
|
|
}
|
|
})
|
|
|
|
}
|
|
|
|
func TestExecDecisionOption(t *testing.T) {
|
|
|
|
files := map[string]string{
|
|
"test.json": `{"foo": 7}`,
|
|
}
|
|
|
|
test.WithTempFS(files, func(dir string) {
|
|
|
|
s := sdk_test.MustNewServer(sdk_test.MockBundle("/bundles/bundle.tar.gz", map[string]string{
|
|
"test.rego": `
|
|
package foo
|
|
main["hello"]
|
|
`,
|
|
}))
|
|
|
|
defer s.Stop()
|
|
|
|
var buf bytes.Buffer
|
|
params := exec.NewParams(&buf)
|
|
_ = params.OutputFormat.Set("json")
|
|
params.Decision = "foo/main"
|
|
params.ConfigOverrides = []string{
|
|
"services.test.url=" + s.URL(),
|
|
"bundles.test.resource=/bundles/bundle.tar.gz",
|
|
}
|
|
|
|
params.Paths = append(params.Paths, dir)
|
|
err := runExec(params)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := util.MustUnmarshalJSON(bytes.ReplaceAll(buf.Bytes(), []byte(dir), nil))
|
|
|
|
exp := util.MustUnmarshalJSON([]byte(`{"result": [{
|
|
"path": "/test.json",
|
|
"result": ["hello"]
|
|
}]}`))
|
|
|
|
if !reflect.DeepEqual(output, exp) {
|
|
t.Fatal("Expected:", exp, "Got:", output)
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
func TestExecBundleFlag(t *testing.T) {
|
|
|
|
files := map[string]string{
|
|
"files/test.json": `{"foo": 7}`,
|
|
"bundle/x.rego": `package system
|
|
|
|
main["hello"]`,
|
|
}
|
|
|
|
test.WithTempFS(files, func(dir string) {
|
|
|
|
var buf bytes.Buffer
|
|
params := exec.NewParams(&buf)
|
|
_ = params.OutputFormat.Set("json")
|
|
params.BundlePaths = []string{dir + "/bundle/"}
|
|
params.Paths = append(params.Paths, dir+"/files/")
|
|
|
|
err := runExec(params)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := util.MustUnmarshalJSON(bytes.ReplaceAll(buf.Bytes(), []byte(dir), nil))
|
|
|
|
exp := util.MustUnmarshalJSON([]byte(`{"result": [{
|
|
"path": "/files/test.json",
|
|
"result": ["hello"]
|
|
}]}`))
|
|
|
|
if !reflect.DeepEqual(output, exp) {
|
|
t.Fatal("Expected:", exp, "Got:", output)
|
|
}
|
|
|
|
})
|
|
}
|