on main help sign in
fix(mcp/docker): harden tests
f6e7a43Christian Rocha
internal/config/docker_mcp.go+6−2
@@ -7,6 +7,11 @@ import (
7 "time"
7 "time"
8)
8)
9
9
10+var dockerMCPVersionRunner = func(ctx context.Context) error {
11+ cmd := exec.CommandContext(ctx, "docker", "mcp", "version")
12+ return cmd.Run()
13+}
14+
10// DockerMCPName is the name of the Docker MCP configuration.
15// DockerMCPName is the name of the Docker MCP configuration.
11const DockerMCPName = "docker"
16const DockerMCPName = "docker"
12
17
@@ -16,8 +21,7 @@ func IsDockerMCPAvailable() bool {
16 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
21 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
17 defer cancel()
22 defer cancel()
18
23
19− cmd := exec.CommandContext(ctx, "docker", "mcp", "version")
24+ err := dockerMCPVersionRunner(ctx)
20− err := cmd.Run()
21 return err == nil
25 return err == nil
22}
26}
23
27
internal/config/docker_mcp_test.go+39−14
@@ -1,6 +1,8 @@
1package config
1package config
2
2
3import (
3import (
4+ "context"
5+ "errors"
4 "os"
6 "os"
5 "path/filepath"
7 "path/filepath"
6 "testing"
8 "testing"
@@ -9,6 +11,17 @@ import (
9 "github.com/stretchr/testify/require"
11 "github.com/stretchr/testify/require"
10)
12)
11
13
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+
12func TestIsDockerMCPEnabled(t *testing.T) {
25func TestIsDockerMCPEnabled(t *testing.T) {
13 t.Parallel()
26 t.Parallel()
14
27
@@ -43,10 +56,8 @@ func TestIsDockerMCPEnabled(t *testing.T) {
43}
56}
44
57
45func TestEnableDockerMCP(t *testing.T) {
58func TestEnableDockerMCP(t *testing.T) {
46− t.Parallel()
47−
48 t.Run("adds docker mcp to config", func(t *testing.T) {
59 t.Run("adds docker mcp to config", func(t *testing.T) {
49− t.Parallel()
60+ setDockerMCPVersionRunner(t, func(context.Context) error { return nil })
50
61
51 // Create a temporary directory for config.
62 // Create a temporary directory for config.
52 tmpDir := t.TempDir()
63 tmpDir := t.TempDir()
@@ -61,11 +72,6 @@ func TestEnableDockerMCP(t *testing.T) {
61 resolver: NewShellVariableResolver(env.New()),
72 resolver: NewShellVariableResolver(env.New()),
62 }
73 }
63
74
64− // Only run this test if docker mcp is available.
65− if !IsDockerMCPAvailable() {
66− t.Skip("Docker MCP not available, skipping test")
67− }
68−
69 err := store.EnableDockerMCP()
75 err := store.EnableDockerMCP()
70 require.NoError(t, err)
76 require.NoError(t, err)
71
77
@@ -86,7 +92,7 @@ func TestEnableDockerMCP(t *testing.T) {
86 })
92 })
87
93
88 t.Run("fails when docker mcp not available", func(t *testing.T) {
94 t.Run("fails when docker mcp not available", func(t *testing.T) {
89− t.Parallel()
95+ setDockerMCPVersionRunner(t, func(context.Context) error { return errDockerUnavailable })
90
96
91 // Create a temporary directory for config.
97 // Create a temporary directory for config.
92 tmpDir := t.TempDir()
98 tmpDir := t.TempDir()
@@ -101,11 +107,6 @@ func TestEnableDockerMCP(t *testing.T) {
101 resolver: NewShellVariableResolver(env.New()),
107 resolver: NewShellVariableResolver(env.New()),
102 }
108 }
103
109
104− // Skip if docker mcp is actually available.
105− if IsDockerMCPAvailable() {
106− t.Skip("Docker MCP is available, skipping unavailable test")
107− }
108−
109 err := store.EnableDockerMCP()
110 err := store.EnableDockerMCP()
110 require.Error(t, err)
111 require.Error(t, err)
111 require.Contains(t, err.Error(), "docker mcp is not available")
112 require.Contains(t, err.Error(), "docker mcp is not available")
@@ -166,3 +167,27 @@ func TestDisableDockerMCP(t *testing.T) {
166 require.NoError(t, err)
167 require.NoError(t, err)
167 })
168 })
168}
169}
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+}