Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,17 @@ func (c *Config) ValidateConfig() error {
func Load(dir string, out io.Writer) (*Config, error) {
cfg := InitEmptyConfig()

if err := env.Parse(cfg); err != nil {
return nil, err
}

err := parseConfigFiles(dir, out, func(dir string) error {
return parseConfigFile(dir, cfg)
})
if err != nil {
return nil, err
}

err = env.Parse(cfg)

return cfg, err
}

Expand Down Expand Up @@ -282,13 +284,13 @@ func parseConfigFiles(dir string, out io.Writer, fn func(string) error) error {

parent = filepath.Dir(parent)
}
for i, file := range files {
for i, f := range files {
if i == 0 {
_, _ = fmt.Fprintln(out, tml.Sprintf("Parsing config from file: <green>'%s'</green>", file))
_, _ = fmt.Fprintln(out, tml.Sprintf("Parsing config from file: <green>'%s'</green>", f))
} else {
_, _ = fmt.Fprintln(out, tml.Sprintf("Merging with config from file: <green>'%s'</green>", file))
_, _ = fmt.Fprintln(out, tml.Sprintf("Merging with config from file: <green>'%s'</green>", f))
}
if err := fn(file); err != nil {
if err := fn(f); err != nil {
return err
}
}
Expand Down
75 changes: 75 additions & 0 deletions pkg/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,81 @@ func teardown(tempDir string) {
_ = os.RemoveAll(tempDir)
}

func TestLoad_Env_Overrides_YAML(t *testing.T) {
os.Clearenv()
defer SetEnv("BUILDKITE_TOKEN", "test")()

yaml := `
ci:
buildkite:
organisation: example
token: abc
vcs:
github:
organisation: example
token: abc
`
file := filepath.Join(name, ".scaffold.yaml")
_ = ioutil.WriteFile(file, []byte(yaml), 0777)
defer func() { _ = os.Remove(file) }()

out := &bytes.Buffer{}

cfg, err := Load(name, out)
assert.NoError(t, err)
assert.NotNil(t, cfg)
assert.Equal(t, "test", cfg.CI.Buildkite.Token)
}

func TestLoad_SubDir_Overrides_Dir(t *testing.T) {
os.Clearenv()

yaml := `
ci:
buildkite:
organisation: example
token: abc
vcs:
github:
organisation: example
token: abc
`
subYaml := `
ci:
buildkite:
organisation: example
token: test
vcs:
github:
organisation: example
token: abc
`
file := filepath.Join(name, ".scaffold.yaml")
_ = ioutil.WriteFile(file, []byte(yaml), 0777)
defer func() { _ = os.Remove(file) }()
sub := filepath.Join(name, "sub")
_ = os.MkdirAll(sub, 0777)
defer func() { _ = os.RemoveAll(sub) }()
_ = ioutil.WriteFile(filepath.Join(sub, ".scaffold.yaml"), []byte(subYaml), 0777)

out := &bytes.Buffer{}

cfg, err := Load(sub, out)
assert.NoError(t, err)
assert.NotNil(t, cfg)
assert.Equal(t, "test", cfg.CI.Buildkite.Token)
}

func TestParseConfigFile_Return_Error_For_Unreadable_File(t *testing.T) {
out := &bytes.Buffer{}
dir := filepath.Join(name, ".scaffold.yaml")
_ = os.MkdirAll(dir, 0777)
defer func() { _ = os.RemoveAll(dir) }()

_, err := Load(name, out)
assert.EqualError(t, err, fmt.Sprintf("read %s: is a directory", dir))
}

func TestValidateConfig_No_VCS_Configured(t *testing.T) {
cfg := InitEmptyConfig()
err := cfg.ValidateConfig()
Expand Down
12 changes: 12 additions & 0 deletions pkg/config/testing.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// +build !prod

package config

import (
"os"
)

func SetEnv(key, value string) func() {
_ = os.Setenv(key, value)
return func() { _ = os.Unsetenv(key) }
}
26 changes: 26 additions & 0 deletions pkg/scaffold_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,32 @@ vcs:
assert.Equal(t, fmt.Sprintf("\x1b[0mParsing config from file: \x1b[32m'%s'\x1b[39m\x1b[0m\n\x1b[0m\x1b[31mGET https://api.buildkite.com/v2/user: 401 Authentication required. Please supply a valid API Access Token: https://buildkite.com/docs/apis/rest-api#authentication\x1b[39m\x1b[0m\n", file), out.String())
}

func TestScaffold_Fails_For_Multiple_Configured_CIs(t *testing.T) {
defer SetEnv("GITLAB_GROUP", "test")()
defer SetEnv("GITLAB_TOKEN", "test")()

yaml := `
ci:
buildkite:
organisation: example
token: abc
vcs:
github:
organisation: example
token: abc
`
file := filepath.Join(name, ".scaffold.yaml")
_ = ioutil.WriteFile(file, []byte(yaml), 0777)
defer func() { _ = os.Remove(file) }()

out := bytes.Buffer{}

exitCode := Setup(name, &out, "project")

assert.Equal(t, -3, exitCode)
assert.Equal(t, fmt.Sprintf("\x1b[0mParsing config from file: \x1b[32m'%s'\x1b[39m\x1b[0m\n\x1b[0m\x1b[31mscaffold CI already defined, please check configuration\x1b[39m\x1b[0m\n", file), out.String())
}

func TestScaffold_Configure_Error(t *testing.T) {
cfg := config.InitEmptyConfig()
cfg.CurrentCI = &mockCi{configErr: errors.New("config error")}
Expand Down