mcp-framework/cmd/mcp-framework/build_test.go

155 lines
3.7 KiB
Go

package main
import (
"bytes"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
"testing"
)
func TestRunBuildBuildsArtifactFromManifest(t *testing.T) {
projectDir := t.TempDir()
writeBuildFixture(t, projectDir, "demo-mcp", `
module example.com/demo
go 1.25.0
`, `
binary_name = "demo-mcp"
[build]
main_package = "./cmd/demo-mcp"
output_dir = "build"
version_var = "main.version"
`, `
package main
import "fmt"
var version = "dev"
func main() {
fmt.Print(version)
}
`)
var stdout bytes.Buffer
var stderr bytes.Buffer
err := run([]string{
"build",
"--manifest-dir", projectDir,
"--goos", runtime.GOOS,
"--goarch", runtime.GOARCH,
"--version", "1.2.3",
}, &stdout, &stderr)
if err != nil {
t.Fatalf("run returned error: %v (stderr: %s)", err, stderr.String())
}
artifactPath := artifactPath(projectDir, "build", "demo-mcp", runtime.GOOS, runtime.GOARCH)
if _, err := os.Stat(artifactPath); err != nil {
t.Fatalf("expected artifact at %s: %v", artifactPath, err)
}
output, err := exec.Command(artifactPath).Output()
if err != nil {
t.Fatalf("run artifact: %v", err)
}
if strings.TrimSpace(string(output)) != "1.2.3" {
t.Fatalf("artifact output = %q, want %q", strings.TrimSpace(string(output)), "1.2.3")
}
}
func TestRunBuildUsesManifestVersionVar(t *testing.T) {
projectDir := t.TempDir()
writeBuildFixture(t, projectDir, "custom-version", `
module example.com/custom-version
go 1.25.0
`, `
binary_name = "custom-version"
[build]
main_package = "./cmd/custom-version"
output_dir = "dist"
version_var = "main.releaseVersion"
`, `
package main
import "fmt"
var releaseVersion = "dev"
func main() {
fmt.Print(releaseVersion)
}
`)
var stdout bytes.Buffer
var stderr bytes.Buffer
err := run([]string{
"build",
"--manifest-dir", projectDir,
"--goos", runtime.GOOS,
"--goarch", runtime.GOARCH,
"--version", "9.9.9",
}, &stdout, &stderr)
if err != nil {
t.Fatalf("run returned error: %v (stderr: %s)", err, stderr.String())
}
artifactPath := artifactPath(projectDir, "dist", "custom-version", runtime.GOOS, runtime.GOARCH)
output, err := exec.Command(artifactPath).Output()
if err != nil {
t.Fatalf("run artifact: %v", err)
}
if strings.TrimSpace(string(output)) != "9.9.9" {
t.Fatalf("artifact output = %q, want %q", strings.TrimSpace(string(output)), "9.9.9")
}
}
func TestBuildHelp(t *testing.T) {
var stdout bytes.Buffer
var stderr bytes.Buffer
if err := run([]string{"build", "--help"}, &stdout, &stderr); err != nil {
t.Fatalf("run returned error: %v", err)
}
output := stdout.String()
if !strings.Contains(output, "--manifest-dir") {
t.Fatalf("build help should mention --manifest-dir: %q", output)
}
if !strings.Contains(output, "version_var") {
t.Fatalf("build help should mention manifest build config: %q", output)
}
}
func writeBuildFixture(t *testing.T, projectDir, binaryName, goModContent, manifestContent, mainContent string) {
t.Helper()
if err := os.WriteFile(filepath.Join(projectDir, "go.mod"), []byte(strings.TrimSpace(goModContent)+"\n"), 0o644); err != nil {
t.Fatalf("write go.mod: %v", err)
}
if err := os.WriteFile(filepath.Join(projectDir, "mcp.toml"), []byte(strings.TrimSpace(manifestContent)+"\n"), 0o644); err != nil {
t.Fatalf("write mcp.toml: %v", err)
}
cmdDir := filepath.Join(projectDir, "cmd", binaryName)
if err := os.MkdirAll(cmdDir, 0o755); err != nil {
t.Fatalf("mkdir cmd dir: %v", err)
}
if err := os.WriteFile(filepath.Join(cmdDir, "main.go"), []byte(strings.TrimSpace(mainContent)+"\n"), 0o644); err != nil {
t.Fatalf("write main.go: %v", err)
}
}
func artifactPath(projectDir, outDir, binaryName, goos, goarch string) string {
name := binaryName + "-" + goos + "-" + goarch
if goos == "windows" {
name += ".exe"
}
return filepath.Join(projectDir, outDir, name)
}