git-subtree-dir: services/core git-subtree-mainline:6f5e3a119fgit-subtree-split:6fdbc73753
108 lines
2.8 KiB
Go
108 lines
2.8 KiB
Go
package scheduler
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/nomadcode/nomadcode-core/internal/agent"
|
|
"github.com/nomadcode/nomadcode-core/internal/storage"
|
|
)
|
|
|
|
func TestRunAgentTaskCompletesFromMessage(t *testing.T) {
|
|
worker := &TaskWorker{
|
|
Agent: fakeAgentClient{
|
|
result: agent.SendMessageResult{
|
|
Message: &agent.Message{
|
|
Kind: "message",
|
|
Role: "agent",
|
|
MessageID: "msg-1",
|
|
Parts: []agent.Part{{Kind: "text", Text: "done"}},
|
|
},
|
|
Raw: json.RawMessage(`{"kind":"message","messageId":"msg-1"}`),
|
|
},
|
|
},
|
|
}
|
|
|
|
raw, message, err := worker.runAgentTask(context.Background(), storage.Task{
|
|
ID: "task-1",
|
|
Title: "Fix issue",
|
|
Source: "manual",
|
|
Payload: json.RawMessage(`{"prompt":"please fix it"}`),
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("runAgentTask returned error: %v", err)
|
|
}
|
|
if message != "done" {
|
|
t.Fatalf("unexpected message: %q", message)
|
|
}
|
|
|
|
var output map[string]any
|
|
if err := json.Unmarshal(raw, &output); err != nil {
|
|
t.Fatalf("decode output: %v", err)
|
|
}
|
|
if output["mode"] != "a2a" || output["message"] != "done" || output["message_id"] != "msg-1" {
|
|
t.Fatalf("unexpected output: %#v", output)
|
|
}
|
|
}
|
|
|
|
func TestRunAgentTaskRejectsNonTerminalTask(t *testing.T) {
|
|
worker := &TaskWorker{
|
|
Agent: fakeAgentClient{
|
|
result: agent.SendMessageResult{
|
|
Task: &agent.Task{
|
|
Kind: "task",
|
|
ID: "remote-1",
|
|
Status: agent.TaskStatus{State: agent.TaskStateWorking},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
_, _, err := worker.runAgentTask(context.Background(), storage.Task{
|
|
ID: "task-1",
|
|
Title: "Fix issue",
|
|
Source: "manual",
|
|
Payload: json.RawMessage(`{}`),
|
|
})
|
|
if err == nil || !strings.Contains(err.Error(), "non-terminal") {
|
|
t.Fatalf("expected non-terminal state error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestBuildAgentInputUsesPromptPayload(t *testing.T) {
|
|
input := buildAgentInput(storage.Task{
|
|
ID: "task-1",
|
|
Title: "Fallback title",
|
|
Source: "manual",
|
|
Payload: json.RawMessage(`{"prompt":"do the thing","instructions":"be concise"}`),
|
|
})
|
|
|
|
if !input.Blocking {
|
|
t.Fatal("expected blocking A2A call")
|
|
}
|
|
if !strings.Contains(input.Text, "be concise") || !strings.Contains(input.Text, "do the thing") {
|
|
t.Fatalf("unexpected text: %q", input.Text)
|
|
}
|
|
if input.Metadata["nomadcode_task_id"] != "task-1" {
|
|
t.Fatalf("unexpected metadata: %#v", input.Metadata)
|
|
}
|
|
}
|
|
|
|
type fakeAgentClient struct {
|
|
result agent.SendMessageResult
|
|
err error
|
|
}
|
|
|
|
func (c fakeAgentClient) SendMessage(context.Context, agent.SendMessageInput) (agent.SendMessageResult, error) {
|
|
return c.result, c.err
|
|
}
|
|
|
|
func (c fakeAgentClient) GetTask(context.Context, agent.GetTaskInput) (agent.Task, error) {
|
|
return agent.Task{}, nil
|
|
}
|
|
|
|
func (c fakeAgentClient) CancelTask(context.Context, agent.CancelTaskInput) (agent.Task, error) {
|
|
return agent.Task{}, nil
|
|
}
|