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) } }