77 lines
2.6 KiB
Go
77 lines
2.6 KiB
Go
package federation
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"orchestra/internal/domain"
|
|
"testing"
|
|
)
|
|
|
|
func TestClientRegistersPollsAndReadsArtifactAsWorker(t *testing.T) {
|
|
seen := map[string]bool{}
|
|
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Path == "/v1/federation/workers" {
|
|
seen["register"] = r.Header.Get("Authorization") == "Bearer admit"
|
|
w.WriteHeader(http.StatusCreated)
|
|
return
|
|
}
|
|
if r.Header.Get("X-Orchestra-Worker") != "h1" || r.Header.Get("Authorization") != "Bearer worker" {
|
|
t.Errorf("worker auth missing")
|
|
}
|
|
switch r.URL.Path {
|
|
case "/v1/federation/events":
|
|
seen["events"] = true
|
|
_, _ = w.Write([]byte(`{"cursor":3,"events":[{"seq":3,"id":"e","type":"TaskCreated","task_id":"t","version":1,"payload":{"source":"s","external_id":"x","project":"p"},"surface":"system"}]}`))
|
|
case "/v1/artifacts/abc":
|
|
seen["artifact"] = true
|
|
_, _ = w.Write([]byte(`{"meta":{"id":"x"}}`))
|
|
default:
|
|
t.Errorf("unexpected path %s", r.URL.Path)
|
|
w.WriteHeader(404)
|
|
}
|
|
}))
|
|
defer s.Close()
|
|
c := Client{BaseURL: s.URL, WorkerID: "h1", Token: "worker", AdmitToken: "admit"}
|
|
if err := c.Register(context.Background(), Worker{ID: "h1"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
es, cur, err := c.Events(context.Background(), 0)
|
|
if err != nil || cur != 3 || len(es) != 1 || es[0].Type != "TaskCreated" {
|
|
t.Fatalf("events=%v cursor=%d err=%v", es, cur, err)
|
|
}
|
|
b, err := c.Artifact(context.Background(), "abc")
|
|
if err != nil || string(b) != "{\"meta\":{\"id\":\"x\"}}" {
|
|
t.Fatalf("artifact=%s err=%v", b, err)
|
|
}
|
|
for _, k := range []string{"register", "events", "artifact"} {
|
|
if !seen[k] {
|
|
t.Errorf("%s not seen", k)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestClientReportsTypedLaunchAckAndNack(t *testing.T) {
|
|
seen := map[string]map[string]any{}
|
|
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var body map[string]any
|
|
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
seen[r.URL.Path] = body
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}))
|
|
defer s.Close()
|
|
c := Client{BaseURL: s.URL, WorkerID: "h1", Token: "worker"}
|
|
if err := c.Start(context.Background(), "task", "epoch", 7, domain.SessionEvidence{PaneID: "p"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := c.NackStart(context.Background(), "task", "epoch", 8, "invalid_handoff", "anchor mismatch", domain.SessionEvidence{PaneID: "p"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if seen["/v1/federation/workers/h1/start"]["expected_version"] != float64(7) || seen["/v1/federation/workers/h1/nack"]["failure_class"] != "invalid_handoff" {
|
|
t.Fatalf("launch reports=%#v", seen)
|
|
}
|
|
}
|