2022-11-18 09:57:31 +00:00
package config
import (
"encoding/json"
"reflect"
"testing"
2023-05-16 16:35:39 +00:00
"github.com/databricks/cli/bundle/config/variable"
2022-11-18 09:57:31 +00:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRootMarshalUnmarshal ( t * testing . T ) {
// Marshal empty
buf , err := json . Marshal ( & Root { } )
require . NoError ( t , err )
// Unmarshal empty
var root Root
err = json . Unmarshal ( buf , & root )
require . NoError ( t , err )
// Compare
assert . True ( t , reflect . DeepEqual ( Root { } , root ) )
}
func TestRootLoad ( t * testing . T ) {
root := & Root { }
2022-11-28 09:59:43 +00:00
err := root . Load ( "../tests/basic/bundle.yml" )
2022-11-18 09:57:31 +00:00
require . NoError ( t , err )
assert . Equal ( t , "basic" , root . Bundle . Name )
}
func TestRootMergeStruct ( t * testing . T ) {
root := & Root {
2023-04-12 14:17:13 +00:00
Path : "path" ,
2022-11-18 09:57:31 +00:00
Workspace : Workspace {
Host : "foo" ,
Profile : "profile" ,
} ,
}
other := & Root {
2023-04-12 14:17:13 +00:00
Path : "path" ,
2022-11-18 09:57:31 +00:00
Workspace : Workspace {
Host : "bar" ,
} ,
}
assert . NoError ( t , root . Merge ( other ) )
assert . Equal ( t , "bar" , root . Workspace . Host )
assert . Equal ( t , "profile" , root . Workspace . Profile )
}
func TestRootMergeMap ( t * testing . T ) {
root := & Root {
2023-04-12 14:17:13 +00:00
Path : "path" ,
2022-11-18 09:57:31 +00:00
Environments : map [ string ] * Environment {
"development" : {
Workspace : & Workspace {
Host : "foo" ,
Profile : "profile" ,
} ,
} ,
} ,
}
other := & Root {
2023-04-12 14:17:13 +00:00
Path : "path" ,
2022-11-18 09:57:31 +00:00
Environments : map [ string ] * Environment {
"development" : {
Workspace : & Workspace {
Host : "bar" ,
} ,
} ,
} ,
}
assert . NoError ( t , root . Merge ( other ) )
assert . Equal ( t , & Workspace { Host : "bar" , Profile : "profile" } , root . Environments [ "development" ] . Workspace )
}
2023-04-17 10:21:21 +00:00
func TestDuplicateIdOnLoadReturnsError ( t * testing . T ) {
root := & Root { }
err := root . Load ( "./testdata/duplicate_resource_names_in_root/bundle.yml" )
assert . ErrorContains ( t , err , "multiple resources named foo (job at ./testdata/duplicate_resource_names_in_root/bundle.yml, pipeline at ./testdata/duplicate_resource_names_in_root/bundle.yml)" )
}
func TestDuplicateIdOnMergeReturnsError ( t * testing . T ) {
root := & Root { }
err := root . Load ( "./testdata/duplicate_resource_name_in_subconfiguration/bundle.yml" )
require . NoError ( t , err )
other := & Root { }
err = other . Load ( "./testdata/duplicate_resource_name_in_subconfiguration/resources.yml" )
require . NoError ( t , err )
err = root . Merge ( other )
assert . ErrorContains ( t , err , "multiple resources named foo (job at ./testdata/duplicate_resource_name_in_subconfiguration/bundle.yml, pipeline at ./testdata/duplicate_resource_name_in_subconfiguration/resources.yml)" )
}
2023-05-15 09:34:05 +00:00
func TestInitializeVariables ( t * testing . T ) {
fooDefault := "abc"
root := & Root {
Variables : map [ string ] * variable . Variable {
"foo" : {
Default : & fooDefault ,
Description : "an optional variable since default is defined" ,
} ,
"bar" : {
Description : "a required variable" ,
} ,
} ,
}
err := root . InitializeVariables ( [ ] string { "foo=123" , "bar=456" } )
assert . NoError ( t , err )
assert . Equal ( t , "123" , * ( root . Variables [ "foo" ] . Value ) )
assert . Equal ( t , "456" , * ( root . Variables [ "bar" ] . Value ) )
}
func TestInitializeVariablesWithAnEqualSignInValue ( t * testing . T ) {
root := & Root {
Variables : map [ string ] * variable . Variable {
"foo" : {
Description : "a variable called foo" ,
} ,
} ,
}
err := root . InitializeVariables ( [ ] string { "foo=123=567" } )
assert . NoError ( t , err )
assert . Equal ( t , "123=567" , * ( root . Variables [ "foo" ] . Value ) )
}
func TestInitializeVariablesInvalidFormat ( t * testing . T ) {
root := & Root {
Variables : map [ string ] * variable . Variable {
"foo" : {
Description : "a variable called foo" ,
} ,
} ,
}
err := root . InitializeVariables ( [ ] string { "foo" } )
assert . ErrorContains ( t , err , "unexpected flag value for variable assignment: foo" )
}
func TestInitializeVariablesUndefinedVariables ( t * testing . T ) {
root := & Root {
Variables : map [ string ] * variable . Variable {
"foo" : {
Description : "A required variable" ,
} ,
} ,
}
err := root . InitializeVariables ( [ ] string { "bar=567" } )
assert . ErrorContains ( t , err , "variable bar has not been defined" )
}