- 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.
146 lines
3.6 KiB
Go
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"])
|
|
}
|