blob: e9f851da384d1cc6415685a7c4c6d8ad571afc38 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package config
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
)
func TestConfigMapBuilder(t *testing.T) {
t.Run("build without plugins", func(t *testing.T) {
tmpDir := t.TempDir()
configJsonPath := createFakeConfigFile(t, "config.json", tmpDir, `
{
"key": "value",
"nested": {
"key": 123
}
}`)
opsRootPath := createFakeConfigFile(t, "opsroot.json", tmpDir, `
{
"version": "0.3.0",
"config": {
"opsroot": "value",
"another": {
"key": 123
}
}
}`)
testCases := []struct {
name string
configJson string
opsRoot string
want ConfigMap
err error
}{
{
name: "should return empty configmap when no files are added",
configJson: "",
opsRoot: "",
want: ConfigMap{
config: map[string]interface{}{},
opsRootConfig: map[string]interface{}{},
pluginOpsRootConfigs: map[string]map[string]interface{}{},
},
err: nil,
},
{
name: "should return with config when a valid config.json is added",
configJson: configJsonPath,
opsRoot: "",
want: ConfigMap{
opsRootConfig: map[string]interface{}{},
config: map[string]interface{}{
"key": "value",
"nested": map[string]interface{}{
"key": 123.0,
},
},
configPath: configJsonPath,
pluginOpsRootConfigs: map[string]map[string]interface{}{},
},
},
{
name: "should return with opsroot when a valid opsroot.json is added",
configJson: "",
opsRoot: opsRootPath,
want: ConfigMap{
opsRootConfig: map[string]interface{}{
"opsroot": "value",
"another": map[string]interface{}{
"key": 123.0,
},
},
config: map[string]interface{}{},
pluginOpsRootConfigs: map[string]map[string]interface{}{},
},
},
{
name: "should return with both when both config.json and opsroot.json are added",
configJson: configJsonPath,
opsRoot: opsRootPath,
want: ConfigMap{
config: map[string]interface{}{
"key": "value",
"nested": map[string]interface{}{
"key": 123.0,
},
},
opsRootConfig: map[string]interface{}{
"opsroot": "value",
"another": map[string]interface{}{
"key": 123.0,
},
},
configPath: configJsonPath,
pluginOpsRootConfigs: map[string]map[string]interface{}{},
},
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
got, err := NewConfigMapBuilder().
WithConfigJson(tc.configJson).
WithOpsRoot(tc.opsRoot).
Build()
// if we expect an error but got none
if tc.err != nil && err == nil {
t.Errorf("want error %e, got %e", tc.err, err)
}
// if we expect no error but got one
if tc.err == nil && err != nil {
t.Errorf("want no error, but got %e", err)
}
require.Equal(t, tc.want, got)
})
}
})
t.Run("build with plugins", func(t *testing.T) {
tmpDir := t.TempDir()
configJsonPath := createFakeConfigFile(t, "config.json", tmpDir, `
{
"key": "value",
"nested": {
"key": 123
}
}`)
opsRootPath := createFakeConfigFile(t, "opsroot.json", tmpDir, `
{
"version": "0.3.0",
"config": {
"opsroot": "value",
"another": {
"key": 123
}
}
}`)
pluginOpsRoot := createFakeConfigFile(t, "opsroot.json", tmpDir, `
{
"version": "0.3.0",
"config": {
"opsroot": "value",
"another": {
"key": 123
}
}
}`)
testCases := []struct {
name string
configJson string
opsRoot string
pluginOpsRoots map[string]string
want ConfigMap
err error
}{
{
name: "should return configmap containing plugin opsroot",
configJson: configJsonPath,
opsRoot: opsRootPath,
pluginOpsRoots: map[string]string{
"plugin": pluginOpsRoot,
},
want: ConfigMap{
config: map[string]interface{}{
"key": "value",
"nested": map[string]interface{}{
"key": 123.0,
},
},
opsRootConfig: map[string]interface{}{
"opsroot": "value",
"another": map[string]interface{}{
"key": 123.0,
},
},
configPath: configJsonPath,
pluginOpsRootConfigs: map[string]map[string]interface{}{
"plugin": {
"opsroot": "value",
"another": map[string]interface{}{
"key": 123.0,
},
},
},
},
err: nil,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
got, err := NewConfigMapBuilder().
WithConfigJson(tc.configJson).
WithOpsRoot(tc.opsRoot).
WithPluginOpsRoots(tc.pluginOpsRoots).
Build()
// if we expect an error but got none
if tc.err != nil && err == nil {
t.Errorf("want error %e, got %e", tc.err, err)
}
// if we expect no error but got one
if tc.err == nil && err != nil {
t.Errorf("want no error, but got %e", err)
}
require.Equal(t, tc.want, got)
})
}
})
}
func createFakeConfigFile(t *testing.T, name, dir, content string) string {
t.Helper()
path := filepath.Join(dir, name)
err := os.WriteFile(path, []byte(content), 0644)
require.NoError(t, err)
return path
}