1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
//go:build !integration
// +build !integration
package gitlab_ci_yaml_parser
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v2"
)
type dataOptions struct {
String string `json:"string"`
Integer int `json:"integer"`
}
type testOptions struct {
Root string `json:"root"`
Data *dataOptions `json:"data"`
}
type buildTest struct {
DataBag `json:"options"`
}
const exampleOptionsJSON = `{
"options": {
"root": "value",
"data": {
"string": "value",
"integer": 1
}
}
}`
const exampleOptionsNoDataJSON = `{
"options": {
"root": "value"
}
}`
const exampleOptionsYAML = `
image: test:latest
variables:
KEY: value
`
func (o *buildTest) Unmarshal(data string) error {
return json.Unmarshal([]byte(data), o) // nolint:staticcheck
}
func TestDataBagUnmarshaling(t *testing.T) {
var options buildTest
require.NoError(t, options.Unmarshal(exampleOptionsJSON))
assert.Equal(t, "value", options.DataBag["root"])
result, _ := options.Get("data", "string")
assert.Equal(t, "value", result)
result, _ = options.Get("data", "integer")
assert.Equal(t, float64(1), result)
result2, _ := options.GetString("data", "string")
assert.Equal(t, "value", result2)
result2, _ = options.GetString("data", "integer")
assert.Equal(t, "", result2)
}
func TestDataBagDecodeTest(t *testing.T) {
var options buildTest
var test testOptions
require.NoError(t, options.Unmarshal(exampleOptionsJSON))
require.NoError(t, options.Decode(&test))
assert.Equal(t, "value", test.Root)
assert.NotNil(t, test.Data)
}
func TestDataBagDecodeTestNoData(t *testing.T) {
var options buildTest
var test testOptions
require.NoError(t, options.Unmarshal(exampleOptionsNoDataJSON))
require.NoError(t, options.Decode(&test))
assert.Equal(t, "value", test.Root)
assert.Nil(t, test.Data)
}
func TestDataBagDecodeData(t *testing.T) {
var options buildTest
var data dataOptions
require.NoError(t, options.Unmarshal(exampleOptionsJSON))
require.NoError(t, options.Decode(&data, "data"))
assert.Equal(t, "value", data.String)
assert.Equal(t, 1, data.Integer)
}
func TestDataBagSanitizeWithYamlDecode(t *testing.T) {
options := make(DataBag)
require.NoError(t, yaml.Unmarshal([]byte(exampleOptionsYAML), options))
assert.Equal(t, DataBag{
"image": "test:latest",
"variables": map[interface{}]interface{}{
"KEY": "value",
},
}, options)
require.NoError(t, options.Sanitize())
assert.Equal(t, DataBag{
"image": "test:latest",
"variables": map[string]interface{}{
"KEY": "value",
},
}, options)
}
|