diff --git a/cmd/aura/main.go b/cmd/aura/main.go index aa5c97c..ebd3edc 100644 --- a/cmd/aura/main.go +++ b/cmd/aura/main.go @@ -11,6 +11,7 @@ import ( "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" + "github.com/spf13/afero" ) var Version = "dev" @@ -18,7 +19,7 @@ var Version = "dev" func main() { cmd := aura.NewCmd() - cfg, err := clicfg.NewConfig() + cfg, err := clicfg.NewConfig(afero.NewOsFs()) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/cmd/neo4j/main.go b/cmd/neo4j/main.go index fa0f08f..d7af303 100644 --- a/cmd/neo4j/main.go +++ b/cmd/neo4j/main.go @@ -11,6 +11,7 @@ import ( "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" "github.com/neo4j/cli/pkg/neo4j" + "github.com/spf13/afero" ) var Version = "dev" @@ -18,7 +19,7 @@ var Version = "dev" func main() { cmd := neo4j.NewCmd() - cfg, err := clicfg.NewConfig() + cfg, err := clicfg.NewConfig(afero.NewOsFs()) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/go.mod b/go.mod index 9926867..74ed0c2 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/neo4j/cli go 1.22.2 require ( + github.com/spf13/afero v1.11.0 github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 @@ -22,7 +23,6 @@ require ( github.com/sagikazarmark/locafero v0.6.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/internal/testutils/testfs.go b/internal/testutils/testfs.go new file mode 100644 index 0000000..82e3cb5 --- /dev/null +++ b/internal/testutils/testfs.go @@ -0,0 +1,56 @@ +package testutils + +import ( + "io" + "os" + "path/filepath" + + "github.com/neo4j/cli/pkg/clicfg" + "github.com/spf13/afero" +) + +func GetDefaultTestFs() (afero.Fs, error) { + return GetTestFs("{}") +} + +func GetTestFs(config string) (afero.Fs, error) { + fs := afero.NewMemMapFs() + + configPath := filepath.Join(clicfg.ConfigPrefix, "neo4j", "cli", "config.json") + + if err := fs.MkdirAll(filepath.Dir(configPath), 0755); err != nil { + return nil, err + } + + f, err := fs.OpenFile(configPath, os.O_WRONLY|os.O_CREATE, 0600) + if err != nil { + return nil, err + } + defer f.Close() + + if _, err = f.Write([]byte(config)); err != nil { + return nil, err + } + + return fs, nil +} + +func GetTestConfig(fs afero.Fs) (string, error) { + configPath := filepath.Join(clicfg.ConfigPrefix, "neo4j", "cli", "config.json") + + file, err := fs.Open(configPath) + if err != nil { + return "", err + } + + b, err := io.ReadAll(file) + if err != nil { + return "", err + } + + if err := file.Close(); err != nil { + return "", err + } + + return string(b), nil +} diff --git a/pkg/aura/cmd/config/get_test.go b/pkg/aura/cmd/config/get_test.go index db11a5e..ea09de8 100644 --- a/pkg/aura/cmd/config/get_test.go +++ b/pkg/aura/cmd/config/get_test.go @@ -5,9 +5,9 @@ import ( "context" "fmt" "io" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -22,7 +22,10 @@ func TestGetConfig(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"config", "get", "auth-url"}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{"aura":{"auth-url":"test"}}`), nil) + fs, err := testutils.GetTestFs(`{"aura":{"auth-url":"test"}}`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") @@ -47,7 +50,10 @@ func TestGetConfigDefault(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"config", "get", "auth-url"}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader("{}"), nil) + fs, err := testutils.GetDefaultTestFs() + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/config/list_test.go b/pkg/aura/cmd/config/list_test.go index 6440853..3f1b3ea 100644 --- a/pkg/aura/cmd/config/list_test.go +++ b/pkg/aura/cmd/config/list_test.go @@ -5,9 +5,9 @@ import ( "context" "fmt" "io" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -22,7 +22,10 @@ func TestListConfigDefault(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"config", "list"}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader("{}"), nil) + fs, err := testutils.GetDefaultTestFs() + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/config/set_test.go b/pkg/aura/cmd/config/set_test.go index 5b65827..7771897 100644 --- a/pkg/aura/cmd/config/set_test.go +++ b/pkg/aura/cmd/config/set_test.go @@ -1,14 +1,11 @@ package config_test import ( - "bufio" - "bytes" "context" "fmt" - "io" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -21,8 +18,10 @@ func TestSetConfig(t *testing.T) { cmd := aura.NewCmd() cmd.SetArgs([]string{"config", "set", "auth-url", "test"}) - b := bytes.NewBufferString("") - cfg, err := clicfg.NewConfigFrom(strings.NewReader("{}"), bufio.NewWriter(b)) + fs, err := testutils.GetDefaultTestFs() + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") @@ -31,8 +30,8 @@ func TestSetConfig(t *testing.T) { err = cmd.ExecuteContext(ctx) assert.Nil(err) - out, err := io.ReadAll(b) + out, err := testutils.GetTestConfig(fs) assert.Nil(err) - assert.Equal(fmt.Sprintf(`{"aura":{"base-url":"%s","auth-url":"test","output":"json","credentials":[]}}`, clicfg.DefaultAuraBaseUrl), string(out)) + assert.Equal(fmt.Sprintf(`{"aura":{"base-url":"%s","auth-url":"test","output":"json","credentials":[]}}`, clicfg.DefaultAuraBaseUrl), out) } diff --git a/pkg/aura/cmd/credential/add_test.go b/pkg/aura/cmd/credential/add_test.go index 0e931cf..d73a570 100644 --- a/pkg/aura/cmd/credential/add_test.go +++ b/pkg/aura/cmd/credential/add_test.go @@ -1,14 +1,11 @@ package credential_test import ( - "bufio" - "bytes" "context" "fmt" - "io" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -21,8 +18,10 @@ func TestAddCredential(t *testing.T) { cmd := aura.NewCmd() cmd.SetArgs([]string{"credential", "add", "--name", "test", "--client-id", "testclientid", "--client-secret", "testclientsecret"}) - b := bytes.NewBufferString("") - cfg, err := clicfg.NewConfigFrom(strings.NewReader("{}"), bufio.NewWriter(b)) + fs, err := testutils.GetDefaultTestFs() + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") @@ -31,10 +30,10 @@ func TestAddCredential(t *testing.T) { err = cmd.ExecuteContext(ctx) assert.Nil(err) - out, err := io.ReadAll(b) + out, err := testutils.GetTestConfig(fs) assert.Nil(err) - assert.Equal(fmt.Sprintf(`{"aura":{"base-url":"%s","auth-url":"%s","output":"json","credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret","access-token":"","token-expiry":""}]}}`, clicfg.DefaultAuraBaseUrl, clicfg.DefaultAuraAuthUrl), string(out)) + assert.Equal(fmt.Sprintf(`{"aura":{"base-url":"%s","auth-url":"%s","output":"json","credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret","access-token":"","token-expiry":""}]}}`, clicfg.DefaultAuraBaseUrl, clicfg.DefaultAuraAuthUrl), out) } func TestAddCredentialIfAlreadyExists(t *testing.T) { @@ -43,7 +42,10 @@ func TestAddCredentialIfAlreadyExists(t *testing.T) { cmd := aura.NewCmd() cmd.SetArgs([]string{"credential", "add", "--name", "test", "--client-id", "testclientid", "--client-secret", "testclientsecret"}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{"aura":{"credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret"}]}}`), nil) + fs, err := testutils.GetTestFs(`{"aura":{"credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret"}]}}`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/credential/remove_test.go b/pkg/aura/cmd/credential/remove_test.go index e75f7fa..11d2e05 100644 --- a/pkg/aura/cmd/credential/remove_test.go +++ b/pkg/aura/cmd/credential/remove_test.go @@ -1,14 +1,11 @@ package credential_test import ( - "bufio" - "bytes" "context" "fmt" - "io" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -21,8 +18,10 @@ func TestRemoveCredential(t *testing.T) { cmd := aura.NewCmd() cmd.SetArgs([]string{"credential", "remove", "test"}) - b := bytes.NewBufferString("") - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{"aura":{"credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret"}]}}`), bufio.NewWriter(b)) + fs, err := testutils.GetTestFs(`{"aura":{"credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret"}]}}`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") @@ -31,7 +30,7 @@ func TestRemoveCredential(t *testing.T) { err = cmd.ExecuteContext(ctx) assert.Nil(err) - out, err := io.ReadAll(b) + out, err := testutils.GetTestConfig(fs) assert.Nil(err) assert.Equal(fmt.Sprintf(`{"aura":{"base-url":"%s","auth-url":"%s","output":"json","credentials":[]}}`, clicfg.DefaultAuraBaseUrl, clicfg.DefaultAuraAuthUrl), string(out)) diff --git a/pkg/aura/cmd/credential/use_test.go b/pkg/aura/cmd/credential/use_test.go index e1dfe30..5f13080 100644 --- a/pkg/aura/cmd/credential/use_test.go +++ b/pkg/aura/cmd/credential/use_test.go @@ -1,14 +1,11 @@ package credential_test import ( - "bufio" - "bytes" "context" "fmt" - "io" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -21,8 +18,10 @@ func TestUseCredential(t *testing.T) { cmd := aura.NewCmd() cmd.SetArgs([]string{"credential", "use", "test"}) - b := bytes.NewBufferString("") - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{"aura":{"credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret"}]}}`), bufio.NewWriter(b)) + fs, err := testutils.GetTestFs(`{"aura":{"credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret"}]}}`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") @@ -31,20 +30,22 @@ func TestUseCredential(t *testing.T) { err = cmd.ExecuteContext(ctx) assert.Nil(err) - out, err := io.ReadAll(b) + out, err := testutils.GetTestConfig(fs) assert.Nil(err) - assert.Equal(fmt.Sprintf(`{"aura":{"base-url":"%s","auth-url":"%s","output":"json","default-credential":"test","credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret","access-token":"","token-expiry":""}]}}`, clicfg.DefaultAuraBaseUrl, clicfg.DefaultAuraAuthUrl), string(out)) + assert.Equal(fmt.Sprintf(`{"aura":{"base-url":"%s","auth-url":"%s","output":"json","default-credential":"test","credentials":[{"name":"test","client-id":"testclientid","client-secret":"testclientsecret","access-token":"","token-expiry":""}]}}`, clicfg.DefaultAuraBaseUrl, clicfg.DefaultAuraAuthUrl), out) } -// TODO: currently fails when running with all tests - figure out what is going here func TestUseCredentialIfDoesNotExist(t *testing.T) { assert := assert.New(t) cmd := aura.NewCmd() cmd.SetArgs([]string{"credential", "use", "test"}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{}`), nil) + fs, err := testutils.GetDefaultTestFs() + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/customermanagedkey/get_test.go b/pkg/aura/cmd/customermanagedkey/get_test.go index d0638f3..655c477 100644 --- a/pkg/aura/cmd/customermanagedkey/get_test.go +++ b/pkg/aura/cmd/customermanagedkey/get_test.go @@ -7,9 +7,9 @@ import ( "io" "net/http" "net/http/httptest" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -62,7 +62,7 @@ func TestGetCustomerManagedKey(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"customer-managed-key", "get", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL), cmkId}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -71,7 +71,10 @@ func TestGetCustomerManagedKey(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") @@ -148,7 +151,7 @@ func TestGetCustomerManagedKeyAlias(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"cmk", "get", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL), cmkId}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -157,7 +160,10 @@ func TestGetCustomerManagedKeyAlias(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/customermanagedkey/list_test.go b/pkg/aura/cmd/customermanagedkey/list_test.go index caa02a1..d11873c 100644 --- a/pkg/aura/cmd/customermanagedkey/list_test.go +++ b/pkg/aura/cmd/customermanagedkey/list_test.go @@ -7,9 +7,9 @@ import ( "io" "net/http" "net/http/httptest" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -61,7 +61,7 @@ func TestListCustomerManagedKeys(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"customer-managed-key", "list", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL)}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -70,7 +70,10 @@ func TestListCustomerManagedKeys(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") @@ -147,7 +150,7 @@ func TestListCustomerManagedKeysAlias(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"cmk", "list", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL)}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -156,7 +159,10 @@ func TestListCustomerManagedKeysAlias(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/instance/get_test.go b/pkg/aura/cmd/instance/get_test.go index 55d6777..8f2ca0e 100644 --- a/pkg/aura/cmd/instance/get_test.go +++ b/pkg/aura/cmd/instance/get_test.go @@ -7,9 +7,9 @@ import ( "io" "net/http" "net/http/httptest" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -63,7 +63,7 @@ func TestGetInstance(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"instance", "get", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL), instanceId}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -72,7 +72,10 @@ func TestGetInstance(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/instance/list_test.go b/pkg/aura/cmd/instance/list_test.go index e5fa61d..d3e0bb0 100644 --- a/pkg/aura/cmd/instance/list_test.go +++ b/pkg/aura/cmd/instance/list_test.go @@ -7,9 +7,9 @@ import ( "io" "net/http" "net/http/httptest" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -74,7 +74,7 @@ func TestListInstances(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"instance", "list", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL)}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -83,7 +83,10 @@ func TestListInstances(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/tenant/get_test.go b/pkg/aura/cmd/tenant/get_test.go index 6b62b6a..27423ba 100644 --- a/pkg/aura/cmd/tenant/get_test.go +++ b/pkg/aura/cmd/tenant/get_test.go @@ -7,9 +7,9 @@ import ( "io" "net/http" "net/http/httptest" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -55,7 +55,7 @@ func TestGetTenant(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"tenant", "get", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL), tenantId}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -64,7 +64,10 @@ func TestGetTenant(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/aura/cmd/tenant/list_test.go b/pkg/aura/cmd/tenant/list_test.go index 1e93e81..5573158 100644 --- a/pkg/aura/cmd/tenant/list_test.go +++ b/pkg/aura/cmd/tenant/list_test.go @@ -7,9 +7,9 @@ import ( "io" "net/http" "net/http/httptest" - "strings" "testing" + "github.com/neo4j/cli/internal/testutils" "github.com/neo4j/cli/pkg/aura" "github.com/neo4j/cli/pkg/clicfg" "github.com/neo4j/cli/pkg/clictx" @@ -63,7 +63,7 @@ func TestListTenants(t *testing.T) { cmd.SetOut(b) cmd.SetArgs([]string{"tenant", "list", "--auth-url", fmt.Sprintf("%s/oauth/token", server.URL), "--base-url", fmt.Sprintf("%s/v1", server.URL)}) - cfg, err := clicfg.NewConfigFrom(strings.NewReader(`{ + fs, err := testutils.GetTestFs(`{ "aura": { "credentials": [{ "name": "test-cred", @@ -72,7 +72,10 @@ func TestListTenants(t *testing.T) { }], "default-credential": "test-cred" } - }`), nil) + }`) + assert.Nil(err) + + cfg, err := clicfg.NewConfig(fs) assert.Nil(err) ctx, err := clictx.NewContext(context.Background(), cfg, "test") diff --git a/pkg/clicfg/clicfg.go b/pkg/clicfg/clicfg.go index fe28474..fbbe98f 100644 --- a/pkg/clicfg/clicfg.go +++ b/pkg/clicfg/clicfg.go @@ -1,27 +1,26 @@ package clicfg import ( - "bufio" "encoding/json" "errors" "fmt" - "io" "os" "path/filepath" + "github.com/spf13/afero" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/spf13/viper" ) -var configPrefix string +var ConfigPrefix string const DefaultAuraBaseUrl = "https://api.neo4j.io/v1" const DefaultAuraAuthUrl = "https://api.neo4j.io/oauth/token" type Config struct { viper *viper.Viper - out *bufio.Writer + fs afero.Fs Aura AuraConfig `mapstructure:"aura" json:"aura"` } @@ -47,17 +46,22 @@ func (config *Config) Set(key string, value interface{}) error { } func (config *Config) Write() error { - content, err := json.Marshal(config) + configPath := filepath.Join(ConfigPrefix, "neo4j", "cli", "config.json") + + f, err := config.fs.OpenFile(configPath, os.O_WRONLY, 0600) if err != nil { return err } + defer f.Close() - n, err := config.out.Write(content) + content, err := json.Marshal(config) if err != nil { return err } - if err = config.out.Flush(); err != nil { + n, err := f.Write(content) + + if err != nil { return err } @@ -166,46 +170,40 @@ type AuraCredential struct { TokenExpiry string `mapstructure:"token-expiry" json:"token-expiry"` } -func NewConfig() (*Config, error) { - configPath := filepath.Join(configPrefix, "neo4j", "cli", "config.json") +func NewConfig(fs afero.Fs) (*Config, error) { + configPath := filepath.Join(ConfigPrefix, "neo4j", "cli", "config.json") - if err := os.MkdirAll(filepath.Dir(configPath), 0755); err != nil { + if err := fs.MkdirAll(filepath.Dir(configPath), 0755); err != nil { return nil, err } - f, err := os.OpenFile(configPath, os.O_WRONLY|os.O_CREATE, 0600) + f, err := fs.OpenFile(configPath, os.O_WRONLY|os.O_CREATE, 0600) if err != nil { return &Config{}, err } defer f.Close() - fi, err := os.Stat(configPath) + fi, err := fs.Stat(configPath) if err != nil { return &Config{}, err } - out := bufio.NewWriter(f) - if fi.Size() == 0 { - if _, err := out.Write([]byte("{}")); err != nil { + if _, err := f.Write([]byte("{}")); err != nil { return nil, err } - if err := out.Flush(); err != nil { + if err := f.Sync(); err != nil { return nil, err } } - in, err := os.Open(configPath) + in, err := fs.Open(configPath) if err != nil { return &Config{}, err } defer in.Close() - return NewConfigFrom(in, out) -} - -func NewConfigFrom(in io.Reader, out *bufio.Writer) (*Config, error) { Viper := viper.New() Viper.SetConfigType("json") @@ -218,14 +216,14 @@ func NewConfigFrom(in io.Reader, out *bufio.Writer) (*Config, error) { } var config Config - err := Viper.Unmarshal(&config) + err = Viper.Unmarshal(&config) if err != nil { return &Config{}, err } config.viper = Viper - config.out = out + config.fs = fs return &config, nil } diff --git a/pkg/clicfg/darwin.go b/pkg/clicfg/darwin.go index 1ce9a5d..00fc90c 100644 --- a/pkg/clicfg/darwin.go +++ b/pkg/clicfg/darwin.go @@ -11,5 +11,5 @@ func init() { currentUser, _ := user.Current() homeDir := currentUser.HomeDir - configPrefix = filepath.Join(homeDir, "Library/Preferences") + ConfigPrefix = filepath.Join(homeDir, "Library/Preferences") } diff --git a/pkg/clicfg/linux.go b/pkg/clicfg/linux.go index 136d29f..5f6db9d 100644 --- a/pkg/clicfg/linux.go +++ b/pkg/clicfg/linux.go @@ -19,8 +19,8 @@ func init() { if strings.HasPrefix(xdgConfigHome, "~/") { currentUser, _ := user.Current() homeDir := currentUser.HomeDir - configPrefix = filepath.Join(homeDir, xdgConfigHome[2:]) + ConfigPrefix = filepath.Join(homeDir, xdgConfigHome[2:]) } else { - configPrefix = xdgConfigHome + ConfigPrefix = xdgConfigHome } } diff --git a/pkg/clicfg/windows.go b/pkg/clicfg/windows.go index fb8d3a7..47e5a2f 100644 --- a/pkg/clicfg/windows.go +++ b/pkg/clicfg/windows.go @@ -15,5 +15,5 @@ func init() { log.Panic(err) } - configPrefix = p + ConfigPrefix = p }