mirror of
https://github.com/mikefarah/yq.git
synced 2025-01-12 19:25:37 +00:00
test coverage and linting
This commit is contained in:
parent
4b3fbb878f
commit
64d1e58f97
@ -7,8 +7,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/mikefarah/yq/test"
|
"github.com/mikefarah/yq/test"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getRootCommand() *cobra.Command {
|
func getRootCommand() *cobra.Command {
|
||||||
|
@ -12,7 +12,7 @@ type JsonConverter interface {
|
|||||||
JsonToString(context interface{}) (string, error)
|
JsonToString(context interface{}) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type jsonConverter struct {}
|
type jsonConverter struct{}
|
||||||
|
|
||||||
func NewJsonConverter() JsonConverter {
|
func NewJsonConverter() JsonConverter {
|
||||||
return &jsonConverter{}
|
return &jsonConverter{}
|
||||||
|
@ -2,6 +2,7 @@ package marshal
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/mikefarah/yq/test"
|
"github.com/mikefarah/yq/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
package marshal
|
package marshal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
yaml "github.com/mikefarah/yaml/v2"
|
yaml "github.com/mikefarah/yaml/v2"
|
||||||
errors "github.com/pkg/errors"
|
errors "github.com/pkg/errors"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type YamlConverter interface {
|
type YamlConverter interface {
|
||||||
YamlToString(context interface{}, trimOutput bool) (string, error)
|
YamlToString(context interface{}, trimOutput bool) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type yamlConverter struct {}
|
type yamlConverter struct{}
|
||||||
|
|
||||||
func NewYamlConverter() YamlConverter {
|
func NewYamlConverter() YamlConverter {
|
||||||
return &yamlConverter{}
|
return &yamlConverter{}
|
||||||
@ -39,4 +40,4 @@ func (y *yamlConverter) marshalContext(context interface{}, trimOutput bool) (st
|
|||||||
return strings.Trim(outStr, "\n "), nil
|
return strings.Trim(outStr, "\n "), nil
|
||||||
}
|
}
|
||||||
return outStr, nil
|
return outStr, nil
|
||||||
}
|
}
|
||||||
|
52
pkg/marshal/yaml_converter_test.go
Normal file
52
pkg/marshal/yaml_converter_test.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package marshal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/mikefarah/yq/test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestYamlToString(t *testing.T) {
|
||||||
|
var raw = `b:
|
||||||
|
c: 2
|
||||||
|
`
|
||||||
|
var data = test.ParseData(raw)
|
||||||
|
got, _ := NewYamlConverter().YamlToString(data, false)
|
||||||
|
test.AssertResult(t, raw, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestYamlToString_withTrim(t *testing.T) {
|
||||||
|
var raw = `b:
|
||||||
|
c: 2`
|
||||||
|
var data = test.ParseData(raw)
|
||||||
|
got, _ := NewYamlConverter().YamlToString(data, true)
|
||||||
|
test.AssertResult(t, raw, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestYamlToString_withIntKey(t *testing.T) {
|
||||||
|
var raw = `b:
|
||||||
|
2: c
|
||||||
|
`
|
||||||
|
var data = test.ParseData(raw)
|
||||||
|
got, _ := NewYamlConverter().YamlToString(data, false)
|
||||||
|
test.AssertResult(t, raw, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestYamlToString_withBoolKey(t *testing.T) {
|
||||||
|
var raw = `b:
|
||||||
|
false: c
|
||||||
|
`
|
||||||
|
var data = test.ParseData(raw)
|
||||||
|
got, _ := NewYamlConverter().YamlToString(data, false)
|
||||||
|
test.AssertResult(t, raw, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestYamlToString_withArray(t *testing.T) {
|
||||||
|
var raw = `b:
|
||||||
|
- item: one
|
||||||
|
- item: two
|
||||||
|
`
|
||||||
|
var data = test.ParseData(raw)
|
||||||
|
got, _ := NewYamlConverter().YamlToString(data, false)
|
||||||
|
test.AssertResult(t, raw, got)
|
||||||
|
}
|
@ -21,7 +21,7 @@ type navigator struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewDataNavigator(l *logging.Logger) DataNavigator {
|
func NewDataNavigator(l *logging.Logger) DataNavigator {
|
||||||
return &navigator {
|
return &navigator{
|
||||||
log: l,
|
log: l,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/mikefarah/yq/test"
|
"github.com/mikefarah/yq/test"
|
||||||
logging "gopkg.in/op/go-logging.v1"
|
logging "gopkg.in/op/go-logging.v1"
|
||||||
)
|
)
|
||||||
@ -393,4 +394,4 @@ b:
|
|||||||
result, _ := subject.DeleteChildValue(data, []string{"b", "0", "name"})
|
result, _ := subject.DeleteChildValue(data, []string{"b", "0", "name"})
|
||||||
test.AssertResult(t, fmt.Sprintf("%v", expected), fmt.Sprintf("%v", result))
|
test.AssertResult(t, fmt.Sprintf("%v", expected), fmt.Sprintf("%v", result))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -7,21 +7,21 @@ import (
|
|||||||
|
|
||||||
type YqLib interface {
|
type YqLib interface {
|
||||||
ReadPath(dataBucket interface{}, path string) (interface{}, error)
|
ReadPath(dataBucket interface{}, path string) (interface{}, error)
|
||||||
WritePath(dataBucket interface{}, path string, value interface{}) (interface{})
|
WritePath(dataBucket interface{}, path string, value interface{}) interface{}
|
||||||
PrefixPath(dataBucket interface{}, prefix string) (interface{})
|
PrefixPath(dataBucket interface{}, prefix string) interface{}
|
||||||
DeletePath(dataBucket interface{}, path string) (interface{}, error)
|
DeletePath(dataBucket interface{}, path string) (interface{}, error)
|
||||||
Merge(dst interface{}, src interface{}, overwrite bool, append bool) error
|
Merge(dst interface{}, src interface{}, overwrite bool, append bool) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type lib struct {
|
type lib struct {
|
||||||
navigator DataNavigator
|
navigator DataNavigator
|
||||||
parser PathParser
|
parser PathParser
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewYqLib(l *logging.Logger) YqLib {
|
func NewYqLib(l *logging.Logger) YqLib {
|
||||||
return &lib {
|
return &lib{
|
||||||
navigator: NewDataNavigator(l),
|
navigator: NewDataNavigator(l),
|
||||||
parser: NewPathParser(),
|
parser: NewPathParser(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,12 +30,12 @@ func (l *lib) ReadPath(dataBucket interface{}, path string) (interface{}, error)
|
|||||||
return l.navigator.ReadChildValue(dataBucket, paths)
|
return l.navigator.ReadChildValue(dataBucket, paths)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *lib) WritePath(dataBucket interface{}, path string, value interface{}) (interface{}) {
|
func (l *lib) WritePath(dataBucket interface{}, path string, value interface{}) interface{} {
|
||||||
var paths = l.parser.ParsePath(path)
|
var paths = l.parser.ParsePath(path)
|
||||||
return l.navigator.UpdatedChildValue(dataBucket, paths, value)
|
return l.navigator.UpdatedChildValue(dataBucket, paths, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *lib) PrefixPath(dataBucket interface{}, prefix string) (interface{}) {
|
func (l *lib) PrefixPath(dataBucket interface{}, prefix string) interface{} {
|
||||||
var paths = l.parser.ParsePath(prefix)
|
var paths = l.parser.ParsePath(prefix)
|
||||||
|
|
||||||
// Inverse order
|
// Inverse order
|
||||||
@ -65,4 +65,4 @@ func (l *lib) Merge(dst interface{}, src interface{}, overwrite bool, append boo
|
|||||||
return mergo.Merge(dst, src, mergo.WithAppendSlice)
|
return mergo.Merge(dst, src, mergo.WithAppendSlice)
|
||||||
}
|
}
|
||||||
return mergo.Merge(dst, src)
|
return mergo.Merge(dst, src)
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package yqlib
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/mikefarah/yq/test"
|
"github.com/mikefarah/yq/test"
|
||||||
logging "gopkg.in/op/go-logging.v1"
|
logging "gopkg.in/op/go-logging.v1"
|
||||||
)
|
)
|
||||||
@ -18,46 +19,46 @@ func TestLib(t *testing.T) {
|
|||||||
b:
|
b:
|
||||||
2: c
|
2: c
|
||||||
`)
|
`)
|
||||||
|
|
||||||
got, _ := subject.ReadPath(data, "b.2")
|
got, _ := subject.ReadPath(data, "b.2")
|
||||||
test.AssertResult(t, `c`, got)
|
test.AssertResult(t, `c`, got)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestReadPath_WithError", func(t *testing.T) {
|
t.Run("TestReadPath_WithError", func(t *testing.T) {
|
||||||
var data = test.ParseData(`
|
var data = test.ParseData(`
|
||||||
---
|
---
|
||||||
b:
|
b:
|
||||||
- c
|
- c
|
||||||
`)
|
`)
|
||||||
|
|
||||||
_, err := subject.ReadPath(data, "b.[a]")
|
_, err := subject.ReadPath(data, "b.[a]")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Expected error due to invalid path")
|
t.Fatal("Expected error due to invalid path")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestWritePath", func(t *testing.T) {
|
t.Run("TestWritePath", func(t *testing.T) {
|
||||||
var data = test.ParseData(`
|
var data = test.ParseData(`
|
||||||
---
|
---
|
||||||
b:
|
b:
|
||||||
2: c
|
2: c
|
||||||
`)
|
`)
|
||||||
|
|
||||||
got := subject.WritePath(data, "b.3", "a")
|
got := subject.WritePath(data, "b.3", "a")
|
||||||
test.AssertResult(t, `[{b [{2 c} {3 a}]}]`, fmt.Sprintf("%v", got))
|
test.AssertResult(t, `[{b [{2 c} {3 a}]}]`, fmt.Sprintf("%v", got))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestPrefixPath", func(t *testing.T) {
|
t.Run("TestPrefixPath", func(t *testing.T) {
|
||||||
var data = test.ParseData(`
|
var data = test.ParseData(`
|
||||||
---
|
---
|
||||||
b:
|
b:
|
||||||
2: c
|
2: c
|
||||||
`)
|
`)
|
||||||
|
|
||||||
got := subject.PrefixPath(data, "d")
|
got := subject.PrefixPath(data, "a.d")
|
||||||
test.AssertResult(t, `[{d [{b [{2 c}]}]}]`, fmt.Sprintf("%v", got))
|
test.AssertResult(t, `[{a [{d [{b [{2 c}]}]}]}]`, fmt.Sprintf("%v", got))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestDeletePath", func(t *testing.T) {
|
t.Run("TestDeletePath", func(t *testing.T) {
|
||||||
var data = test.ParseData(`
|
var data = test.ParseData(`
|
||||||
---
|
---
|
||||||
@ -65,24 +66,24 @@ b:
|
|||||||
2: c
|
2: c
|
||||||
3: a
|
3: a
|
||||||
`)
|
`)
|
||||||
|
|
||||||
got, _ := subject.DeletePath(data, "b.2")
|
got, _ := subject.DeletePath(data, "b.2")
|
||||||
test.AssertResult(t, `[{b [{3 a}]}]`, fmt.Sprintf("%v", got))
|
test.AssertResult(t, `[{b [{3 a}]}]`, fmt.Sprintf("%v", got))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestDeletePath_WithError", func(t *testing.T) {
|
t.Run("TestDeletePath_WithError", func(t *testing.T) {
|
||||||
var data = test.ParseData(`
|
var data = test.ParseData(`
|
||||||
---
|
---
|
||||||
b:
|
b:
|
||||||
- c
|
- c
|
||||||
`)
|
`)
|
||||||
|
|
||||||
_, err := subject.DeletePath(data, "b.[a]")
|
_, err := subject.DeletePath(data, "b.[a]")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Expected error due to invalid path")
|
t.Fatal("Expected error due to invalid path")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestMerge", func(t *testing.T) {
|
t.Run("TestMerge", func(t *testing.T) {
|
||||||
var dst = test.ParseData(`
|
var dst = test.ParseData(`
|
||||||
---
|
---
|
||||||
@ -94,16 +95,19 @@ c: d
|
|||||||
a: 1
|
a: 1
|
||||||
b: 2
|
b: 2
|
||||||
`)
|
`)
|
||||||
|
|
||||||
var mergedData = make(map[interface{}]interface{})
|
var mergedData = make(map[interface{}]interface{})
|
||||||
mergedData["root"] = dst
|
mergedData["root"] = dst
|
||||||
var mapDataBucket = make(map[interface{}]interface{})
|
var mapDataBucket = make(map[interface{}]interface{})
|
||||||
mapDataBucket["root"] = src
|
mapDataBucket["root"] = src
|
||||||
|
|
||||||
subject.Merge(&mergedData, mapDataBucket, false, false)
|
err := subject.Merge(&mergedData, mapDataBucket, false, false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Unexpected error")
|
||||||
|
}
|
||||||
test.AssertResult(t, `[{a b} {c d}]`, fmt.Sprintf("%v", mergedData["root"]))
|
test.AssertResult(t, `[{a b} {c d}]`, fmt.Sprintf("%v", mergedData["root"]))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestMerge_WithOverwrite", func(t *testing.T) {
|
t.Run("TestMerge_WithOverwrite", func(t *testing.T) {
|
||||||
var dst = test.ParseData(`
|
var dst = test.ParseData(`
|
||||||
---
|
---
|
||||||
@ -115,16 +119,19 @@ c: d
|
|||||||
a: 1
|
a: 1
|
||||||
b: 2
|
b: 2
|
||||||
`)
|
`)
|
||||||
|
|
||||||
var mergedData = make(map[interface{}]interface{})
|
var mergedData = make(map[interface{}]interface{})
|
||||||
mergedData["root"] = dst
|
mergedData["root"] = dst
|
||||||
var mapDataBucket = make(map[interface{}]interface{})
|
var mapDataBucket = make(map[interface{}]interface{})
|
||||||
mapDataBucket["root"] = src
|
mapDataBucket["root"] = src
|
||||||
|
|
||||||
subject.Merge(&mergedData, mapDataBucket, true, false)
|
err := subject.Merge(&mergedData, mapDataBucket, true, false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Unexpected error")
|
||||||
|
}
|
||||||
test.AssertResult(t, `[{a 1} {b 2}]`, fmt.Sprintf("%v", mergedData["root"]))
|
test.AssertResult(t, `[{a 1} {b 2}]`, fmt.Sprintf("%v", mergedData["root"]))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestMerge_WithAppend", func(t *testing.T) {
|
t.Run("TestMerge_WithAppend", func(t *testing.T) {
|
||||||
var dst = test.ParseData(`
|
var dst = test.ParseData(`
|
||||||
---
|
---
|
||||||
@ -136,16 +143,19 @@ c: d
|
|||||||
a: 1
|
a: 1
|
||||||
b: 2
|
b: 2
|
||||||
`)
|
`)
|
||||||
|
|
||||||
var mergedData = make(map[interface{}]interface{})
|
var mergedData = make(map[interface{}]interface{})
|
||||||
mergedData["root"] = dst
|
mergedData["root"] = dst
|
||||||
var mapDataBucket = make(map[interface{}]interface{})
|
var mapDataBucket = make(map[interface{}]interface{})
|
||||||
mapDataBucket["root"] = src
|
mapDataBucket["root"] = src
|
||||||
|
|
||||||
subject.Merge(&mergedData, mapDataBucket, false, true)
|
err := subject.Merge(&mergedData, mapDataBucket, false, true)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Unexpected error")
|
||||||
|
}
|
||||||
test.AssertResult(t, `[{a b} {c d} {a 1} {b 2}]`, fmt.Sprintf("%v", mergedData["root"]))
|
test.AssertResult(t, `[{a b} {c d} {a 1} {b 2}]`, fmt.Sprintf("%v", mergedData["root"]))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("TestMerge_WithError", func(t *testing.T) {
|
t.Run("TestMerge_WithError", func(t *testing.T) {
|
||||||
err := subject.Merge(nil, nil, false, false)
|
err := subject.Merge(nil, nil, false, false)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -153,4 +163,4 @@ b: 2
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ type PathParser interface {
|
|||||||
ParsePath(path string) []string
|
ParsePath(path string) []string
|
||||||
}
|
}
|
||||||
|
|
||||||
type parser struct {}
|
type parser struct{}
|
||||||
|
|
||||||
func NewPathParser() PathParser {
|
func NewPathParser() PathParser {
|
||||||
return &parser{}
|
return &parser{}
|
||||||
|
@ -2,6 +2,7 @@ package yqlib
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/mikefarah/yq/test"
|
"github.com/mikefarah/yq/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -25,4 +26,4 @@ func TestParsePath(t *testing.T) {
|
|||||||
for _, tt := range parsePathsTests {
|
for _, tt := range parsePathsTests {
|
||||||
test.AssertResultComplex(t, tt.expectedPaths, NewPathParser().ParsePath(tt.path))
|
test.AssertResultComplex(t, tt.expectedPaths, NewPathParser().ParsePath(tt.path))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
go test -coverprofile=coverage.out
|
go test -coverprofile=coverage.out ./...
|
||||||
go tool cover -html=coverage.out -o cover/coverage.html
|
go tool cover -html=coverage.out -o cover/coverage.html
|
||||||
|
3
yq.go
3
yq.go
@ -9,8 +9,9 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"github.com/mikefarah/yq/pkg/yqlib"
|
|
||||||
"github.com/mikefarah/yq/pkg/marshal"
|
"github.com/mikefarah/yq/pkg/marshal"
|
||||||
|
"github.com/mikefarah/yq/pkg/yqlib"
|
||||||
|
|
||||||
errors "github.com/pkg/errors"
|
errors "github.com/pkg/errors"
|
||||||
|
|
||||||
|
@ -4,8 +4,9 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
"testing"
|
"testing"
|
||||||
"github.com/mikefarah/yq/test"
|
|
||||||
"github.com/mikefarah/yq/pkg/marshal"
|
"github.com/mikefarah/yq/pkg/marshal"
|
||||||
|
"github.com/mikefarah/yq/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
var parseValueTests = []struct {
|
var parseValueTests = []struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user