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 }