Configuration file syntax and parsing for golang
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

153 lines
2.7 KiB

package forge_test
import (
"encoding/json"
"fmt"
"testing"
"github.com/brettlangdon/forge"
)
func TestSectionKeys(t *testing.T) {
t.Parallel()
section := forge.NewSection()
section.SetString("key1", "value1")
section.SetString("key2", "value2")
section.SetString("key3", "value3")
keys := section.Keys()
if len(keys) != 3 {
t.Error("expected Section to have 3 keys")
}
if keys[0] != "key1" {
t.Error("expected 'key1' to be in the list of keys")
}
if keys[1] != "key2" {
t.Error("expected 'key2' to be in the list of keys")
}
if keys[2] != "key3" {
t.Error("expected 'key3' to be in the list of keys")
}
}
func TestMergeSection(t *testing.T) {
config1Str := `
global = "global value";
prod {
value = "string value";
integer = 500
float = 80.80
boolean = true
negative = FALSE
nothing = NULL
}
`
config2Str := `
integer = 500
float = 80.80
boolean = true
negative = FALSE
nothing = NULL
new_section {
integer = 500
float = 80.80
boolean = true
negative = FALSE
nothing = NULL
}
prod {
value = "new value";
secret = "shhh";
nothing = "value"
negative = false
boolean = false
}
`
config1, err := forge.ParseString(config1Str)
if err != nil {
t.Error(err)
t.FailNow()
}
config2, err := forge.ParseString(config2Str)
if err != nil {
t.Error(err)
t.FailNow()
}
err = config1.Merge(config2)
if err != nil {
t.Error(err)
t.FailNow()
}
// Validation
valueFloat, _ := config1.GetFloat("float")
if valueFloat != float64(80.80) {
t.Errorf("Excepted '80.80' got %v", valueFloat)
}
valueNegative, _ := config1.Resolve("new_section.negative")
if valueNegative.GetValue().(bool) {
t.Errorf("Excepted 'false' got %v", valueNegative)
}
valueString, _ := config1.Resolve("prod.value")
if valueString.GetValue().(string) == "string value" {
t.Errorf("Excepted 'new value' got %v", valueString)
}
valueBoolean, _ := config1.Resolve("prod.boolean")
if valueBoolean.GetValue().(bool) {
t.Errorf("Excepted 'false' got %v", valueBoolean)
}
bytes, _ := json.MarshalIndent(config1.ToMap(), "", " ")
fmt.Println(string(bytes))
}
func TestMergeSectionFailSectionToField(t *testing.T) {
config1Str := `
global = "global value";
prod {
value = "string value";
integer = 500
float = 80.80
boolean = true
negative = FALSE
nothing = NULL
}
`
config2Str := `
global = "global value";
prod = "I'm prod value"
`
config1, err := forge.ParseString(config1Str)
if err != nil {
t.Error(err)
t.FailNow()
}
config2, err := forge.ParseString(config2Str)
if err != nil {
t.Error(err)
t.FailNow()
}
err = config1.Merge(config2)
if err.Error() != "source (STRING) and target (SECTION) type doesn't match: prod" {
t.Error(err)
}
}