on main help sign in
fix(mcp/docker): harden tests
commitf6e7a43a81b342bae6c7ed4d8f3c72087bc9de4c authorChristian Rocha <christian@rocha.is> dateThu 19 Mar 2026, 11:27 (7 months ago) parentdf094bd
2 files changed+45−16
internal/config/docker_mcp.go+6−2 internal/config/docker_mcp_test.go+39−14
internal/config/docker_mcp.go+6−2
@@ -7,6 +7,11 @@ import (
77 "time"
88)
99
10+var dockerMCPVersionRunner = func(ctx context.Context) error {
11+ cmd := exec.CommandContext(ctx, "docker", "mcp", "version")
12+ return cmd.Run()
13+}
14+
1015// DockerMCPName is the name of the Docker MCP configuration.
1116const DockerMCPName = "docker"
1217
@@ -16,8 +21,7 @@ func IsDockerMCPAvailable() bool {
1621 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
1722 defer cancel()
1823
19− cmd := exec.CommandContext(ctx, "docker", "mcp", "version")
20− err := cmd.Run()
24+ err := dockerMCPVersionRunner(ctx)
2125 return err == nil
2226}
2327
internal/config/docker_mcp_test.go+39−14
@@ -1,6 +1,8 @@
11package config
22
33import (
4+ "context"
5+ "errors"
46 "os"
57 "path/filepath"
68 "testing"
@@ -9,6 +11,17 @@ import (
911 "github.com/stretchr/testify/require"
1012)
1113
14+var errDockerUnavailable = errors.New("docker unavailable")
15+
16+func setDockerMCPVersionRunner(t *testing.T, runner func(context.Context) error) {
17+ t.Helper()
18+ orig := dockerMCPVersionRunner
19+ dockerMCPVersionRunner = runner
20+ t.Cleanup(func() {
21+ dockerMCPVersionRunner = orig
22+ })
23+}
24+
1225func TestIsDockerMCPEnabled(t *testing.T) {
1326 t.Parallel()
1427
@@ -43,10 +56,8 @@ func TestIsDockerMCPEnabled(t *testing.T) {
4356}
4457
4558func TestEnableDockerMCP(t *testing.T) {
46− t.Parallel()
47−
4859 t.Run("adds docker mcp to config", func(t *testing.T) {
49− t.Parallel()
60+ setDockerMCPVersionRunner(t, func(context.Context) error { return nil })
5061
5162 // Create a temporary directory for config.
5263 tmpDir := t.TempDir()
@@ -61,11 +72,6 @@ func TestEnableDockerMCP(t *testing.T) {
6172 resolver: NewShellVariableResolver(env.New()),
6273 }
6374
64− // Only run this test if docker mcp is available.
65− if !IsDockerMCPAvailable() {
66− t.Skip("Docker MCP not available, skipping test")
67− }
68−
6975 err := store.EnableDockerMCP()
7076 require.NoError(t, err)
7177
@@ -86,7 +92,7 @@ func TestEnableDockerMCP(t *testing.T) {
8692 })
8793
8894 t.Run("fails when docker mcp not available", func(t *testing.T) {
89− t.Parallel()
95+ setDockerMCPVersionRunner(t, func(context.Context) error { return errDockerUnavailable })
9096
9197 // Create a temporary directory for config.
9298 tmpDir := t.TempDir()
@@ -101,11 +107,6 @@ func TestEnableDockerMCP(t *testing.T) {
101107 resolver: NewShellVariableResolver(env.New()),
102108 }
103109
104− // Skip if docker mcp is actually available.
105− if IsDockerMCPAvailable() {
106− t.Skip("Docker MCP is available, skipping unavailable test")
107− }
108−
109110 err := store.EnableDockerMCP()
110111 require.Error(t, err)
111112 require.Contains(t, err.Error(), "docker mcp is not available")
@@ -166,3 +167,27 @@ func TestDisableDockerMCP(t *testing.T) {
166167 require.NoError(t, err)
167168 })
168169}
170+
171+func TestEnableDockerMCPWithRealDockerWhenAvailable(t *testing.T) {
172+ t.Parallel()
173+
174+ if !IsDockerMCPAvailable() {
175+ t.Skip("docker mcp not available on this machine")
176+ }
177+
178+ tmpDir := t.TempDir()
179+ configPath := filepath.Join(tmpDir, "crush.json")
180+
181+ cfg := &Config{
182+ MCP: make(map[string]MCPConfig),
183+ }
184+ store := &ConfigStore{
185+ config: cfg,
186+ globalDataPath: configPath,
187+ resolver: NewShellVariableResolver(env.New()),
188+ }
189+
190+ err := store.EnableDockerMCP()
191+ require.NoError(t, err)
192+ require.True(t, cfg.IsDockerMCPEnabled())
193+}