diff --git a/option/option.go b/option/option.go index 39fbb67..78712ee 100644 --- a/option/option.go +++ b/option/option.go @@ -8,6 +8,7 @@ import ( "errors" "os" "os/exec" + "strings" ) // Option customizes how tests are run. @@ -50,3 +51,34 @@ func (o *Option) NewCmd(args ...string) *exec.Cmd { cmd.Env = append(os.Environ(), o.env...) return cmd } + +func (o *Option) UpdateEnv(env string) (*Option, error) { + if i, exists := containsEnv(o.env, env); exists { + o.env[i] = env + } else { + o.env = append(o.env, env) + } + + return o, nil +} + +func (o *Option) DeleteEnv(env string) (*Option, error) { + if i, exists := containsEnv(o.env, env); exists { + o.env = append(o.env[:i], o.env[i+1:]...) + } + + return o, nil +} + +// containsEnv determines whether an environment variable exists. +func containsEnv(envs []string, targetEnv string) (int, bool) { + for i, env := range envs { + envKey := strings.Split(env, "=")[0] + targetEnvKey := strings.Split(targetEnv, "=")[0] + if envKey == targetEnvKey { + return i, true + } + } + + return -1, false +} diff --git a/tests/compose_build.go b/tests/compose_build.go index 3ece4d7..6d2a280 100644 --- a/tests/compose_build.go +++ b/tests/compose_build.go @@ -44,6 +44,22 @@ func ComposeBuild(o *option.Option) { gomega.Expect(output).Should(gomega.Equal("Compose build test")) }) + ginkgo.It("should build services defined in the compose file specified by the COMPOSE_FILE environment variable", func() { + envValue := fmt.Sprintf("COMPOSE_FILE=%s", composeFilePath) + o.UpdateEnv(envValue) + + command.Run(o, "compose", "build") + + imageList := command.GetAllImageNames(o) + gomega.Expect(imageList).Should(gomega.ContainElement(gomega.HaveSuffix(imageSuffix[0]))) + gomega.Expect(imageList).Should(gomega.ContainElement(gomega.HaveSuffix(imageSuffix[1]))) + // The built image should print 'Compose build test' when run. + output := command.StdoutStr(o, "run", localImages[defaultImage]) + gomega.Expect(output).Should(gomega.Equal("Compose build test")) + + o.DeleteEnv(envValue) + }) + ginkgo.It("should output progress in plain text format", func() { composeBuildOutput := command.StderrStr(o, "compose", "build", "--progress", "plain", "--no-cache", "--file", composeFilePath)