package klee
import "encoding/json"
import "net/http"
import "net/http/httptest"
import "testing"
func TestGetPR(t *testing.T) {
srv := mockPR(t, &PR{
Number: 1,
Author: "op.claude",
State: "open",
Files: []string{"root/reports/claude/x.md"},
})
defer srv.Close()
c := NewClient(srv.URL, "key")
pr, err := c.GetPR("brain", 1)
check(t, err == nil, "err: %v", err)
check(t, pr.Number == 1, "number: %d", pr.Number)
check(t, pr.Author == "op.claude",
"author: %s", pr.Author)
check(t, len(pr.Files) == 1,
"files: %d", len(pr.Files))
}
func TestGetComments(t *testing.T) {
srv := mockComments(t, []Comment{
{Author: "op.helper", Verdict: "approve"},
{Author: "op.claude", Verdict: ""},
})
defer srv.Close()
c := NewClient(srv.URL, "key")
cs, err := c.GetComments("brain", 1)
check(t, err == nil, "err: %v", err)
check(t, len(cs) == 2, "len: %d", len(cs))
check(t, cs[0].Verdict == "approve",
"verdict: %s", cs[0].Verdict)
}
func TestMergePR(t *testing.T) {
merged := false
srv := httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
check(t, r.Method == "POST",
"method: %s", r.Method)
check(t, r.URL.Path == "/brain/pr/1/merge",
"path: %s", r.URL.Path)
merged = true
w.Header().Set(
"Content-Type", "application/json")
json.NewEncoder(w).Encode(
&PR{Number: 1, Merged: true})
}))
defer srv.Close()
c := NewClient(srv.URL, "key")
pr, err := c.MergePR("brain", 1)
check(t, err == nil, "err: %v", err)
check(t, merged, "merge not called")
check(t, pr.Merged, "not merged")
}
func TestGetPR_NotFound(t *testing.T) {
srv := httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
}))
defer srv.Close()
c := NewClient(srv.URL, "key")
_, err := c.GetPR("brain", 99)
check(t, err != nil, "want error")
}
func TestCreateRepo(t *testing.T) {
var got CreateRepoRequest
srv := httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
json.NewDecoder(r.Body).Decode(&got)
w.WriteHeader(204)
}))
defer srv.Close()
c := NewClient(srv.URL, "key")
err := c.CreateRepo(CreateRepoRequest{
RepoName: "test-repo",
ReaderUsername: "igor.agents",
})
check(t, err == nil, "err: %v", err)
check(t, got.RepoName == "test-repo",
"name: %s", got.RepoName)
check(t, got.ReaderUsername == "igor.agents",
"reader: %s", got.ReaderUsername)
}
func TestAgentName(t *testing.T) {
check(t, AgentName("op.claude") == "claude",
"got %s", AgentName("op.claude"))
check(t, AgentName("op.sub.helper") == "helper",
"got %s", AgentName("op.sub.helper"))
check(t, AgentName("root") == "root",
"got %s", AgentName("root"))
}
func TestAddComment(t *testing.T) {
srv := httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
var req AddCommentRequest
json.NewDecoder(r.Body).Decode(&req)
w.Header().Set(
"Content-Type", "application/json")
json.NewEncoder(w).Encode(&Comment{
ID: 1,
Author: "op.claude",
Body: req.Body,
Verdict: req.Verdict,
})
}))
defer srv.Close()
c := NewClient(srv.URL, "key")
comment, err := c.AddComment("brain", 1,
AddCommentRequest{
Body: "LGTM",
Verdict: "approve",
})
check(t, err == nil, "err: %v", err)
check(t, comment.Body == "LGTM",
"body: %s", comment.Body)
check(t, comment.Verdict == "approve",
"verdict: %s", comment.Verdict)
}
// --- helpers ---
func check(
t *testing.T, ok bool, format string,
args ...interface{},
) {
t.Helper()
if !ok {
t.Errorf(format, args...)
}
}
func mockPR(
t *testing.T, pr *PR,
) *httptest.Server {
t.Helper()
return httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
w.Header().Set(
"Content-Type", "application/json")
json.NewEncoder(w).Encode(pr)
}))
}
func mockComments(
t *testing.T, comments []Comment,
) *httptest.Server {
t.Helper()
return httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
w.Header().Set(
"Content-Type", "application/json")
json.NewEncoder(w).Encode(comments)
}))
}