Step 7 of the consolidation: reflect gitea-mcp as an available connection
(Gitea-as-audit-trail is an invariant going forward) and stop emitting the
now-iceboxed routing pod.
- cmd/hyperguild mode.go: every mode (cloud/client-local/sovereign) now lists
brain + gitea; removed the client-local `routing` entry (koala:30310, the
iceboxed pod). Tests updated to the new contract.
- .mcp.json: add gitea-mcp (git-mcp.d-ma.be, Bearer ${GITEA_MCP_TOKEN}).
- cmd/hyperguild/README: modes doc updated (brain+gitea, no routing).
Refs #75.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
143 lines
4.6 KiB
Go
143 lines
4.6 KiB
Go
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.Contains(t, servers, "gitea")
|
|
assert.NotContains(t, servers, "routing")
|
|
assert.NotContains(t, got, "_mode_note")
|
|
}
|
|
|
|
func TestRunMode_ClientLocal_NoRouting_HasGitea(t *testing.T) {
|
|
// #75: the routing pod is iceboxed; the consolidated harness is brain + gitea.
|
|
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, "gitea")
|
|
assert.NotContains(t, servers, "routing", "routing pod iceboxed (#75)")
|
|
}
|
|
|
|
func TestModeGiteaEntryPresentAndWellFormed(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)
|
|
require.NotContains(t, servers, "routing")
|
|
gitea, ok := servers["gitea"].(map[string]any)
|
|
require.True(t, ok, "gitea entry must be present (audit-trail invariant)")
|
|
assert.Equal(t, "https://git-mcp.d-ma.be/mcp", gitea["url"])
|
|
}
|
|
|
|
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.Contains(t, servers, "gitea")
|
|
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")
|
|
}
|