Skip to content

Commit

Permalink
Merge pull request #93 from k2tzumi/feature/support-for-read-json-in-…
Browse files Browse the repository at this point in the history
…var-section

Support for read json in var section
  • Loading branch information
k1LoW authored Aug 12, 2022
2 parents 4b1bd8f + 4acccf0 commit e81c95e
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 2 deletions.
8 changes: 8 additions & 0 deletions operator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,14 @@ func TestVars(t *testing.T) {
[]Option{Book("testdata/book/vars.yml")},
true,
},
{
[]Option{Book("testdata/book/vars_external.yml"), Var("override", "json://testdata/vars.json")},
false,
},
{
[]Option{Book("testdata/book/vars_external.yml")},
true,
},
}
ctx := context.Background()
for _, tt := range tests {
Expand Down
12 changes: 10 additions & 2 deletions option.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@ func Book(path string) Option {
}
}
for k, v := range loaded.Vars {
bk.Vars[k] = v
ev, err := evaluateSchema(v)
if err != nil {
return err
}
bk.Vars[k] = ev
}
bk.Steps = loaded.Steps
bk.stepKeys = loaded.stepKeys
Expand Down Expand Up @@ -250,7 +254,11 @@ func T(t *testing.T) Option {
// Var - Set variable to runner
func Var(k string, v interface{}) Option {
return func(bk *book) error {
bk.Vars[k] = v
ev, err := evaluateSchema(v)
if err != nil {
return err
}
bk.Vars[k] = ev
return nil
}
}
Expand Down
23 changes: 23 additions & 0 deletions testdata/book/vars_external.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
desc: external vars
vars:
external: json://testdata/vars.json
nonEvaluate:
value: json://testdata/vars.json
tabular: json://testdata/vars_array.json
override:
foo: "test2"
bar: 2
steps:
evaluate:
test: |
vars.external.foo == "test" &&
vars.external.bar == 1
nonEvaluate:
test: |
vars.nonEvaluate.value == "json://testdata/vars.json"
tabular:
test: |
vars.tabular[1].bar == 2
override:
test: |
vars.override == vars.external
4 changes: 4 additions & 0 deletions testdata/vars.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"foo": "test",
"bar": 1
}
10 changes: 10 additions & 0 deletions testdata/vars_array.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[
{
"foo": "test1",
"bar": 1
},
{
"foo": "test2",
"bar": 2
}
]
32 changes: 32 additions & 0 deletions vars.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package runn

import (
"fmt"
"os"
"strings"

"github.com/goccy/go-json"
)

const varsSupportScheme string = "json://"

func evaluateSchema(value interface{}) (interface{}, error) {
switch v := value.(type) {
case string:
if strings.HasPrefix(v, varsSupportScheme) {
byteArray, err := os.ReadFile(v[len(varsSupportScheme):])
if err != nil {
return value, fmt.Errorf("read external files error: %w", err)

}
var jsonObj interface{}
if err := json.Unmarshal(byteArray, &jsonObj); err != nil {
return value, fmt.Errorf("unmarshal error: %w", err)
}

return jsonObj, nil
}
}

return value, nil
}
35 changes: 35 additions & 0 deletions vars_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package runn

import (
"os"
"testing"

"github.com/google/go-cmp/cmp"
)

func TestEvaluateSchema(t *testing.T) {
brokenJson, _ := os.CreateTemp("", "broken_json")
defer os.Remove(brokenJson.Name())

tests := []struct {
value interface{}
want interface{}
error bool
}{
{1, 1, false},
{[]string{"1"}, []string{"1"}, false},
{"string", "string", false},
{"json://testdata/vars.json", map[string]interface{}{"foo": "test", "bar": float64(1)}, false},
{"json://not_exists.json", "json://not_exists.json", true},
{"json://" + brokenJson.Name(), "json://" + brokenJson.Name(), true},
}
for _, tt := range tests {
got, err := evaluateSchema(tt.value)
if diff := cmp.Diff(got, tt.want, nil); diff != "" {
t.Errorf("%s", diff)
}
if (tt.error && err == nil) || (!tt.error && err != nil) {
t.Errorf("no much error")
}
}
}

0 comments on commit e81c95e

Please sign in to comment.