yao/agent/robot/events/events_test.go
Max bc4787f857 Update executor to support V2 execution model and enhance event handling
- Implement V2 execution model in the standard executor, simplifying task execution to a single call without validation loops.
- Introduce support for resuming suspended executions, allowing for human input during task processing.
- Enhance event handling by pushing task completion and failure events to the event bus for better tracking and integration.
- Update tests to reflect changes in execution flow and ensure robust handling of task statuses and results.
2026-02-25 18:40:48 +08:00

146 lines
3.6 KiB
Go

package events
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestEventConstants(t *testing.T) {
expected := map[string]string{
"TaskNeedInput": "robot.task.need_input",
"TaskFailed": "robot.task.failed",
"TaskCompleted": "robot.task.completed",
"ExecWaiting": "robot.exec.waiting",
"ExecResumed": "robot.exec.resumed",
"ExecCompleted": "robot.exec.completed",
"ExecFailed": "robot.exec.failed",
"ExecCancelled": "robot.exec.cancelled",
"Delivery": "robot.delivery",
}
actual := map[string]string{
"TaskNeedInput": TaskNeedInput,
"TaskFailed": TaskFailed,
"TaskCompleted": TaskCompleted,
"ExecWaiting": ExecWaiting,
"ExecResumed": ExecResumed,
"ExecCompleted": ExecCompleted,
"ExecFailed": ExecFailed,
"ExecCancelled": ExecCancelled,
"Delivery": Delivery,
}
for name, exp := range expected {
assert.Equal(t, exp, actual[name], "Event constant %s mismatch", name)
}
assert.Len(t, actual, 9, "Expected exactly 9 event constants")
}
func TestNeedInputPayloadMarshalling(t *testing.T) {
payload := NeedInputPayload{
ExecutionID: "exec-123",
MemberID: "member-1",
TeamID: "team-1",
TaskID: "task-5",
Question: "What date range?",
ChatID: "chat-abc",
}
data, err := json.Marshal(payload)
require.NoError(t, err)
var parsed NeedInputPayload
err = json.Unmarshal(data, &parsed)
require.NoError(t, err)
assert.Equal(t, payload, parsed)
}
func TestTaskPayloadMarshalling(t *testing.T) {
t.Run("with error", func(t *testing.T) {
payload := TaskPayload{
ExecutionID: "exec-1",
MemberID: "member-1",
TeamID: "team-1",
TaskID: "task-1",
Error: "timeout",
ChatID: "chat-1",
}
data, err := json.Marshal(payload)
require.NoError(t, err)
var parsed TaskPayload
err = json.Unmarshal(data, &parsed)
require.NoError(t, err)
assert.Equal(t, payload, parsed)
})
t.Run("without error", func(t *testing.T) {
payload := TaskPayload{
ExecutionID: "exec-2",
MemberID: "member-2",
TeamID: "team-2",
TaskID: "task-2",
}
data, err := json.Marshal(payload)
require.NoError(t, err)
var parsed TaskPayload
err = json.Unmarshal(data, &parsed)
require.NoError(t, err)
assert.Equal(t, payload, parsed)
assert.Empty(t, parsed.Error)
})
}
func TestExecPayloadMarshalling(t *testing.T) {
payload := ExecPayload{
ExecutionID: "exec-100",
MemberID: "member-10",
TeamID: "team-10",
Status: "completed",
ChatID: "chat-100",
}
data, err := json.Marshal(payload)
require.NoError(t, err)
var parsed ExecPayload
err = json.Unmarshal(data, &parsed)
require.NoError(t, err)
assert.Equal(t, payload, parsed)
}
func TestDeliveryPayloadMarshalling(t *testing.T) {
payload := DeliveryPayload{
ExecutionID: "exec-d1",
MemberID: "member-d1",
TeamID: "team-d1",
ChatID: "chat-d1",
Content: map[string]interface{}{"summary": "done"},
Preferences: map[string]interface{}{"channel": "email"},
}
data, err := json.Marshal(payload)
require.NoError(t, err)
var parsed DeliveryPayload
err = json.Unmarshal(data, &parsed)
require.NoError(t, err)
assert.Equal(t, "exec-d1", parsed.ExecutionID)
assert.Equal(t, "member-d1", parsed.MemberID)
assert.NotNil(t, parsed.Content)
assert.NotNil(t, parsed.Preferences)
contentMap, ok := parsed.Content.(map[string]interface{})
require.True(t, ok)
assert.Equal(t, "done", contentMap["summary"])
prefMap, ok := parsed.Preferences.(map[string]interface{})
require.True(t, ok)
assert.Equal(t, "email", prefMap["channel"])
}