From 6ded3140df8da4997fbd111bd7e21b41ec0f8891 Mon Sep 17 00:00:00 2001 From: bigmomma Date: Tue, 9 Jun 2026 10:14:49 -0400 Subject: [PATCH] test: cover up remote-stack variable prompt Signed-off-by: bigmomma --- cmd/compose/compose.go | 26 ++++++------ cmd/compose/up_test.go | 90 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 11 deletions(-) diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index ce019e77d..1338d2802 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -138,17 +138,18 @@ func Adapt(fn Command) func(cmd *cobra.Command, args []string) error { } type ProjectOptions struct { - ProjectName string - Profiles []string - ConfigPaths []string - WorkDir string - ProjectDir string - EnvFiles []string - Compatibility bool - Progress string - Offline bool - All bool - insecureRegistries []string + ProjectName string + Profiles []string + ConfigPaths []string + WorkDir string + ProjectDir string + EnvFiles []string + Compatibility bool + Progress string + Offline bool + All bool + insecureRegistries []string + remoteLoadersOverride []loader.ResourceLoader } // ProjectFunc does stuff within a types.Project @@ -361,6 +362,9 @@ func (o *ProjectOptions) ToProject(ctx context.Context, dockerCli command.Cli, b } func (o *ProjectOptions) remoteLoaders(dockerCli command.Cli) []loader.ResourceLoader { + if o.remoteLoadersOverride != nil { + return o.remoteLoadersOverride + } if o.Offline { return nil } diff --git a/cmd/compose/up_test.go b/cmd/compose/up_test.go index f567e97ad..e6e7fd222 100644 --- a/cmd/compose/up_test.go +++ b/cmd/compose/up_test.go @@ -17,14 +17,43 @@ package compose import ( + "bytes" + "context" + "fmt" + "io" + "os" + "path/filepath" + "strings" "testing" + "github.com/compose-spec/compose-go/v2/loader" "github.com/compose-spec/compose-go/v2/types" + "github.com/docker/cli/cli/streams" + "go.uber.org/mock/gomock" "gotest.tools/v3/assert" "github.com/docker/compose/v5/pkg/api" + "github.com/docker/compose/v5/pkg/mocks" ) +type testRemoteLoader struct { + localPath string +} + +func (l testRemoteLoader) Accept(path string) bool { + return strings.HasPrefix(path, "test://") +} + +func (l testRemoteLoader) Load(context.Context, string) (string, error) { + return l.localPath, nil +} + +func (l testRemoteLoader) Dir(string) string { + return filepath.Dir(l.localPath) +} + +var _ loader.ResourceLoader = testRemoteLoader{} + func TestApplyScaleOpt(t *testing.T) { p := types.Project{ Services: types.Services{ @@ -89,3 +118,64 @@ func TestUpOptions_OnExit(t *testing.T) { }) } } + +func TestRunUpAllowsTemplatedPortFieldsInRemoteStackPrompt(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + dir := t.TempDir() + composePath := filepath.Join(dir, "compose.yaml") + assert.NilError(t, os.WriteFile(composePath, []byte(` +name: remote-defaults +services: + web: + image: nginx + ports: + - host_ip: "${LXKNS_ADDRESS:-127.0.0.1}" + published: "${LXKNS_PORT:-5010}" + target: 80 + protocol: tcp +`), 0o600)) + + in := io.NopCloser(bytes.NewBufferString("n\n")) + out := new(bytes.Buffer) + errOut := new(bytes.Buffer) + cli := mocks.NewMockCli(ctrl) + cli.EXPECT().In().Return(streams.NewIn(in)).AnyTimes() + cli.EXPECT().Out().Return(streams.NewOut(out)).AnyTimes() + cli.EXPECT().Err().Return(streams.NewOut(errOut)).AnyTimes() + + projectOptions := &ProjectOptions{ + ConfigPaths: []string{"test://remote/compose.yaml"}, + ProjectDir: dir, + remoteLoadersOverride: []loader.ResourceLoader{testRemoteLoader{localPath: composePath}}, + } + project := &types.Project{ + Name: "remote-defaults", + WorkingDir: dir, + Services: types.Services{ + "web": { + Name: "web", + Image: "nginx", + }, + }, + } + + err := runUp( + t.Context(), + cli, + &BackendOptions{}, + createOptions{}, + upOptions{}, + buildOptions{ProjectOptions: projectOptions}, + project, + nil, + ) + + assert.Error(t, err, "operation cancelled by user") + output := out.String() + assert.Assert(t, strings.Contains(output, `Your compose stack "test://remote/compose.yaml"`), output) + assert.Assert(t, strings.Contains(output, "LXKNS_ADDRESS"), output) + assert.Assert(t, strings.Contains(output, "LXKNS_PORT"), output) + assert.Assert(t, !strings.Contains(fmt.Sprint(err), "invalid ip address"), fmt.Sprint(err)) +}