2023-06-02 11:49:39 +00:00
|
|
|
package databrickscfg
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2023-06-13 16:41:56 +00:00
|
|
|
"os"
|
2023-06-02 11:49:39 +00:00
|
|
|
"path/filepath"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/databricks/databricks-sdk-go/config"
|
|
|
|
"github.com/stretchr/testify/assert"
|
2023-06-13 16:41:56 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2023-06-02 11:49:39 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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 := "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("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("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("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("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("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("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)
|
|
|
|
}
|
|
|
|
|
2023-06-13 16:41:56 +00:00
|
|
|
func TestSaveToProfile_NewFileWithoutDefault(t *testing.T) {
|
2023-06-02 11:49:39 +00:00
|
|
|
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")
|
2023-06-13 16:41:56 +00:00
|
|
|
|
|
|
|
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))
|
2023-06-02 11:49:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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"])
|
|
|
|
}
|