package agentbridge import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "git.cin.su/m/Assistant/contracts/work" ) func TestHTTPExecutorCarriesTypedDispatchAndDecodesResult(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost || r.URL.Path != "/v1/execute" { t.Fatalf("unexpected request: %s %s", r.Method, r.URL.Path) } var request work.AgentExecutionRequest if err := json.NewDecoder(r.Body).Decode(&request); err != nil { t.Fatal(err) } if request.WorkerID != "worker-1" || request.FencingToken != 7 || request.Intent.DispatchID != "dispatch-1" { t.Fatalf("request=%+v", request) } w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(work.AgentExecutionResult{State: work.AgentExecutionCompleted, Summary: "completed", ObservedAtUnixMillis: 2}) })) defer server.Close() executor, err := NewHTTPExecutor(server.URL, server.Client()) if err != nil { t.Fatal(err) } result, err := executor.Execute(context.Background(), work.AgentExecutionRequest{Intent: work.AgentDispatchIntent{DispatchID: "dispatch-1"}, WorkerID: "worker-1", FencingToken: 7}) if err != nil || result.State != work.AgentExecutionCompleted || result.Summary != "completed" { t.Fatalf("result=%+v err=%v", result, err) } } func TestHTTPExecutorRejectsUnavailableEndpoint(t *testing.T) { if _, err := NewHTTPExecutor("", nil); err != ErrUnavailable { t.Fatalf("expected unavailable, got %v", err) } }