Repository navigation
Expand file tree
/
Copy pathclaude_code_cli_test.go
More file actions
104 lines (99 loc) · 3.08 KB
/
Copy pathclaude_code_cli_test.go
File metadata and controls
104 lines (99 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"net/http"
"net/http/httptest"
"os"
"runtime"
"strings"
"testing"
"github.com/yetone/magpie/internal/claudecode"
)
// claudeCodeOut runs `magpie claude-code args…` and gives what it printed.
func claudeCodeOut(t *testing.T, args ...string) (string, error) {
t.Helper()
r, w, err := os.Pipe()
if err != nil {
t.Fatal(err)
}
old := os.Stdout
os.Stdout = w
var out strings.Builder
done := make(chan struct{})
go func() {
b, _ := io.ReadAll(r)
out.Write(b)
close(done)
}()
err = claudeCodeCmd(args)
w.Close()
os.Stdout = old
<-done
r.Close()
return out.String(), err
}
// `magpie claude-code install --yes` on a machine with no Claude Code (a
// container, Jorben on Discord) downloads the release's build, says from
// where and to where, and the subscription then runs it.
func TestClaudeCodeInstallDownloadsTheRelease(t *testing.T) {
platform, err := claudecode.Platform(runtime.GOOS, runtime.GOARCH, false)
if err != nil {
t.Skip(err)
}
if runtime.GOOS == "linux" {
if _, err := os.Stat("/lib/libc.musl-x86_64.so.1"); err == nil {
t.Skip("a musl Linux asks for the -musl build")
}
}
const body = "#!/bin/sh\necho '2.1.296 (Claude Code)'\n"
sum := sha256.Sum256([]byte(body))
exe := map[bool]string{true: "claude.exe", false: "claude"}[runtime.GOOS == "windows"]
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/latest":
fmt.Fprint(w, "2.1.296")
case "/2.1.296/manifest.json":
fmt.Fprintf(w, `{"version":"2.1.296","manifestSignatureEnforcement":"flag","platforms":{%q:{"binary":%q,"checksum":%q,"size":%d}}}`,
platform, exe, hex.EncodeToString(sum[:]), len(body))
case "/2.1.296/" + platform + "/" + exe:
fmt.Fprint(w, body)
default:
http.NotFound(w, r)
}
}))
defer srv.Close()
oldBase, oldOwn := claudecode.Base, claudeCode.own
claudecode.Base, claudeCode.own = srv.URL, func() string { return "" }
t.Cleanup(func() { claudecode.Base, claudeCode.own = oldBase, oldOwn; _ = claudecode.Remove() })
out, err := claudeCodeOut(t)
if err != nil || !strings.Contains(out, "magpie claude-code install") {
t.Fatalf("status before: %q, %v", out, err)
}
out, err = claudeCodeOut(t, "install", "--yes")
if err != nil {
t.Fatalf("install: %v\n%s", err, out)
}
for _, want := range []string{"2.1.296", srv.URL + "/2.1.296/" + platform + "/" + exe, claudecode.Root(), "SHA-256", "downloaded and checked"} {
if !strings.Contains(out, want) {
t.Errorf("install didn't say %q:\n%s", want, out)
}
}
if p, v := claudecode.Downloaded(); v != "2.1.296" || p == "" {
t.Fatalf("Downloaded() = %q, %q", p, v)
}
if out, _ := claudeCodeOut(t, "install", "--yes"); !strings.Contains(out, "downloaded already") {
t.Errorf("a second install: %q", out)
}
if out, _ := claudeCodeOut(t); !strings.Contains(out, "downloaded by magpie") {
t.Errorf("status after: %q", out)
}
if _, err := claudeCodeOut(t, "remove"); err != nil {
t.Fatal(err)
}
if p, _ := claudecode.Downloaded(); p != "" {
t.Errorf("remove left %s", p)
}
}