1package main
2
3import (
4 "encoding/json"
5 "os"
6 "path/filepath"
7 "testing"
8)
9
10func TestHandleSetupAddGrepGlobal(t *testing.T) {
11 tmp := t.TempDir()
12 t.Setenv("ZOT_HOME", tmp)
13
14 out, err := handleSetup([]string{"add", "grep"}, tmp)
15 if err != nil {
16 t.Fatalf("handleSetup add grep: %v", err)
17 }
18 if out == "" {
19 t.Fatal("expected setup output")
20 }
21
22 data, err := os.ReadFile(filepath.Join(tmp, "mcp.json"))
23 if err != nil {
24 t.Fatalf("read mcp.json: %v", err)
25 }
26 var cfg Config
27 if err := json.Unmarshal(data, &cfg); err != nil {
28 t.Fatalf("parse mcp.json: %v", err)
29 }
30 grep := cfg.MCPServers["grep"]
31 if grep.Transport != "streamable-http" || grep.URL != "https://mcp.grep.app/" {
32 t.Fatalf("unexpected grep config: %+v", grep)
33 }
34 if len(grep.Headers) != 0 {
35 t.Fatalf("protocol headers must not be written to mcp.json: %+v", grep.Headers)
36 }
37}
38
39func TestHandleSetupAddFilesystemProject(t *testing.T) {
40 cwd := t.TempDir()
41
42 _, err := handleSetup([]string{"add", "filesystem", "--project"}, cwd)
43 if err != nil {
44 t.Fatalf("handleSetup add filesystem: %v", err)
45 }
46
47 data, err := os.ReadFile(filepath.Join(cwd, ".zot", "mcp.json"))
48 if err != nil {
49 t.Fatalf("read project mcp.json: %v", err)
50 }
51 var cfg Config
52 if err := json.Unmarshal(data, &cfg); err != nil {
53 t.Fatalf("parse project mcp.json: %v", err)
54 }
55 fs := cfg.MCPServers["filesystem"]
56 if fs.Command != "npx" || len(fs.Args) != 3 || fs.Args[2] != cwd {
57 t.Fatalf("unexpected filesystem config: %+v", fs)
58 }
59}
60
61func TestHandleSetupDuplicate(t *testing.T) {
62 tmp := t.TempDir()
63 t.Setenv("ZOT_HOME", tmp)
64
65 if _, err := handleSetup([]string{"add", "grep"}, tmp); err != nil {
66 t.Fatalf("first add failed: %v", err)
67 }
68 if _, err := handleSetup([]string{"add", "grep"}, tmp); err == nil {
69 t.Fatal("expected duplicate server error")
70 }
71}