databricks-cli/libs/databrickscfg/ops_test.go

228 lines
5.6 KiB
Go

package databrickscfg
import (
"context"
"os"
"path/filepath"
"testing"
"github.com/databricks/databricks-sdk-go/config"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestLoadOrCreate(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "databrickscfg")
file, err := loadOrCreateConfigFile(path)
assert.NoError(t, err)
assert.NotNil(t, file)
assert.FileExists(t, path)
}
func TestLoadOrCreate_NotAllowed(t *testing.T) {
path := "/dev/databrickscfg"
file, err := loadOrCreateConfigFile(path)
assert.Error(t, err)
assert.Nil(t, file)
assert.NoFileExists(t, path)
}
func TestLoadOrCreate_Bad(t *testing.T) {
path := "profile/testdata/badcfg"
file, err := loadOrCreateConfigFile(path)
assert.Error(t, err)
assert.Nil(t, file)
}
func TestMatchOrCreateSection_Direct(t *testing.T) {
cfg := &config.Config{
Profile: "query",
}
file, err := loadOrCreateConfigFile("profile/testdata/databrickscfg")
assert.NoError(t, err)
ctx := context.Background()
section, err := matchOrCreateSection(ctx, file, cfg)
assert.NoError(t, err)
assert.NotNil(t, section)
assert.Equal(t, "query", section.Name())
}
func TestMatchOrCreateSection_AccountID(t *testing.T) {
cfg := &config.Config{
AccountID: "abc",
}
file, err := loadOrCreateConfigFile("profile/testdata/databrickscfg")
assert.NoError(t, err)
ctx := context.Background()
section, err := matchOrCreateSection(ctx, file, cfg)
assert.NoError(t, err)
assert.NotNil(t, section)
assert.Equal(t, "acc", section.Name())
}
func TestMatchOrCreateSection_NormalizeHost(t *testing.T) {
cfg := &config.Config{
Host: "https://query/?o=abracadabra",
}
file, err := loadOrCreateConfigFile("profile/testdata/databrickscfg")
assert.NoError(t, err)
ctx := context.Background()
section, err := matchOrCreateSection(ctx, file, cfg)
assert.NoError(t, err)
assert.NotNil(t, section)
assert.Equal(t, "query", section.Name())
}
func TestMatchOrCreateSection_NoProfileOrHost(t *testing.T) {
cfg := &config.Config{}
file, err := loadOrCreateConfigFile("profile/testdata/databrickscfg")
assert.NoError(t, err)
ctx := context.Background()
_, err = matchOrCreateSection(ctx, file, cfg)
assert.EqualError(t, err, "cannot create new profile: empty section name")
}
func TestMatchOrCreateSection_MultipleProfiles(t *testing.T) {
cfg := &config.Config{
Host: "https://foo",
}
file, err := loadOrCreateConfigFile("profile/testdata/databrickscfg")
assert.NoError(t, err)
ctx := context.Background()
_, err = matchOrCreateSection(ctx, file, cfg)
assert.EqualError(t, err, "multiple profiles matched: foo1, foo2")
}
func TestMatchOrCreateSection_NewProfile(t *testing.T) {
cfg := &config.Config{
Host: "https://bar",
Profile: "delirium",
}
file, err := loadOrCreateConfigFile("profile/testdata/databrickscfg")
assert.NoError(t, err)
ctx := context.Background()
section, err := matchOrCreateSection(ctx, file, cfg)
assert.NoError(t, err)
assert.NotNil(t, section)
assert.Equal(t, "delirium", section.Name())
}
func TestSaveToProfile_ErrorOnLoad(t *testing.T) {
ctx := context.Background()
err := SaveToProfile(ctx, &config.Config{
ConfigFile: "testdata/badcfg",
})
assert.Error(t, err)
}
func TestSaveToProfile_ErrorOnMatch(t *testing.T) {
ctx := context.Background()
err := SaveToProfile(ctx, &config.Config{
Host: "https://foo",
})
assert.Error(t, err)
}
func TestSaveToProfile_NewFileWithoutDefault(t *testing.T) {
ctx := context.Background()
path := filepath.Join(t.TempDir(), "databrickscfg")
err := SaveToProfile(ctx, &config.Config{
ConfigFile: path,
Profile: "abc",
Host: "https://foo",
Token: "xyz",
})
assert.NoError(t, err)
assert.NoFileExists(t, path+".bak")
contents, err := os.ReadFile(path)
require.NoError(t, err)
assert.Equal(t,
`; The profile defined in the DEFAULT section is to be used as a fallback when no profile is explicitly specified.
[DEFAULT]
[abc]
host = https://foo
token = xyz
`, string(contents))
}
func TestSaveToProfile_NewFileWithDefault(t *testing.T) {
ctx := context.Background()
path := filepath.Join(t.TempDir(), "databrickscfg")
err := SaveToProfile(ctx, &config.Config{
ConfigFile: path,
Profile: "DEFAULT",
Host: "https://foo",
Token: "xyz",
})
assert.NoError(t, err)
assert.NoFileExists(t, path+".bak")
contents, err := os.ReadFile(path)
require.NoError(t, err)
assert.Equal(t,
`[DEFAULT]
host = https://foo
token = xyz
`, string(contents))
}
func TestSaveToProfile_ClearingPreviousProfile(t *testing.T) {
ctx := context.Background()
path := filepath.Join(t.TempDir(), "databrickscfg")
err := SaveToProfile(ctx, &config.Config{
ConfigFile: path,
Profile: "abc",
Host: "https://foo",
Token: "xyz",
})
assert.NoError(t, err)
err = SaveToProfile(ctx, &config.Config{
ConfigFile: path,
Profile: "bcd",
Host: "https://bar",
Token: "zyx",
})
assert.NoError(t, err)
assert.FileExists(t, path+".bak")
err = SaveToProfile(ctx, &config.Config{
ConfigFile: path,
Host: "https://foo",
AuthType: "databricks-cli",
})
assert.NoError(t, err)
file, err := loadOrCreateConfigFile(path)
assert.NoError(t, err)
assert.Len(t, file.Sections(), 3)
assert.True(t, file.HasSection("DEFAULT"))
assert.True(t, file.HasSection("bcd"))
assert.True(t, file.HasSection("bcd"))
dlft, err := file.GetSection("DEFAULT")
assert.NoError(t, err)
assert.Len(t, dlft.KeysHash(), 0)
abc, err := file.GetSection("abc")
assert.NoError(t, err)
raw := abc.KeysHash()
assert.Len(t, raw, 2)
assert.Equal(t, "https://foo", raw["host"])
assert.Equal(t, "databricks-cli", raw["auth_type"])
}