code.oscarkilo.com/okg/klee/klee_test.go

..
klee.go
klee_test.go
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)
      }))
}