package main import ( "bytes" "context" "encoding/json" "os" "path/filepath" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func readJSON(t *testing.T, path string) map[string]any { t.Helper() b, err := os.ReadFile(path) require.NoError(t, err) var out map[string]any require.NoError(t, json.Unmarshal(b, &out)) return out } func TestRunMode_Cloud_Default(t *testing.T) { dir := t.TempDir() outPath := filepath.Join(dir, ".mcp.json") t.Setenv("BRAIN_URL", "http://koala:30330") var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{"cloud", "--out", outPath}, strings.NewReader(""), &stdout, &stderr) require.NoError(t, err) got := readJSON(t, outPath) servers, ok := got["mcpServers"].(map[string]any) require.True(t, ok, "mcpServers must be a JSON object") assert.Contains(t, servers, "brain") assert.NotContains(t, servers, "routing") assert.NotContains(t, got, "_mode_note") } func TestRunMode_ClientLocal_HasRoutingEntry(t *testing.T) { dir := t.TempDir() outPath := filepath.Join(dir, ".mcp.json") t.Setenv("BRAIN_URL", "http://koala:30330") var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{"client-local", "--out", outPath}, strings.NewReader(""), &stdout, &stderr) require.NoError(t, err) got := readJSON(t, outPath) servers := got["mcpServers"].(map[string]any) require.Contains(t, servers, "brain") require.Contains(t, servers, "routing") routing := servers["routing"].(map[string]any) assert.NotContains(t, routing, "_routing_pending", "placeholder should be removed once Plan 6 ships") headers, ok := routing["headers"].(map[string]any) require.True(t, ok, "routing entry should have headers block") assert.Equal(t, "client-local", headers["X-Hyperguild-Mode"]) } func TestModeClientLocalHasRoutingHeader(t *testing.T) { tmp := t.TempDir() + "/mcp.json" out := &bytes.Buffer{} stderr := &bytes.Buffer{} require.NoError(t, runMode(context.Background(), []string{"client-local", "--out", tmp}, nil, out, stderr)) body, err := os.ReadFile(tmp) require.NoError(t, err) var doc map[string]any require.NoError(t, json.Unmarshal(body, &doc)) servers := doc["mcpServers"].(map[string]any) routing := servers["routing"].(map[string]any) assert.Equal(t, "http://koala:30310/mcp", routing["url"]) assert.NotContains(t, routing, "_routing_pending", "placeholder should be removed once Plan 6 ships") headers, ok := routing["headers"].(map[string]any) require.True(t, ok, "routing entry should have headers block") assert.Equal(t, "client-local", headers["X-Hyperguild-Mode"]) } func TestRunMode_Sovereign_HasModeNote(t *testing.T) { dir := t.TempDir() outPath := filepath.Join(dir, ".mcp.json") var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{"sovereign", "--out", outPath}, strings.NewReader(""), &stdout, &stderr) require.NoError(t, err) got := readJSON(t, outPath) assert.Contains(t, got, "_mode_note") servers := got["mcpServers"].(map[string]any) assert.Contains(t, servers, "brain") assert.NotContains(t, servers, "routing") } func TestRunMode_DefaultsOutToCwd(t *testing.T) { dir := t.TempDir() t.Chdir(dir) // Go 1.24+ — replaces the older os.Chdir-with-cleanup pattern var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{"cloud"}, strings.NewReader(""), &stdout, &stderr) require.NoError(t, err) _, statErr := os.Stat(filepath.Join(dir, ".mcp.json")) assert.NoError(t, statErr, ".mcp.json should exist in cwd") } func TestRunMode_UnknownMode(t *testing.T) { dir := t.TempDir() outPath := filepath.Join(dir, ".mcp.json") var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{"bogus", "--out", outPath}, strings.NewReader(""), &stdout, &stderr) assert.Error(t, err) assert.Contains(t, err.Error(), "unknown mode") } func TestRunMode_NoArgs(t *testing.T) { var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{}, strings.NewReader(""), &stdout, &stderr) assert.Error(t, err) } func TestRunMode_RefusesToOverwrite(t *testing.T) { dir := t.TempDir() outPath := filepath.Join(dir, ".mcp.json") require.NoError(t, os.WriteFile(outPath, []byte(`{"existing":"file"}`), 0o644)) var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{"cloud", "--out", outPath}, strings.NewReader(""), &stdout, &stderr) require.Error(t, err) assert.Contains(t, err.Error(), "exists") } func TestRunMode_Force(t *testing.T) { dir := t.TempDir() outPath := filepath.Join(dir, ".mcp.json") require.NoError(t, os.WriteFile(outPath, []byte(`{"existing":"file"}`), 0o644)) var stdout, stderr bytes.Buffer err := runMode(context.Background(), []string{"cloud", "--out", outPath, "--force"}, strings.NewReader(""), &stdout, &stderr) require.NoError(t, err) got := readJSON(t, outPath) assert.Contains(t, got, "mcpServers") assert.NotContains(t, got, "existing") }