- Update DeliveryPayload to use structured types for Content and Preferences, enhancing type safety and readability. - Modify tests to reflect changes in payload structure, ensuring proper serialization and deserialization of delivery content. - Implement a new robotHandler for processing delivery events, streamlining the handling of different delivery channels (email, webhook, process). - Remove the deprecated DeliveryCenter, consolidating delivery logic within the new handler for better maintainability. - Enhance error handling and logging during delivery processing to improve observability and debugging capabilities.
149 lines
3.7 KiB
Go
149 lines
3.7 KiB
Go
package events
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
robottypes "github.com/yaoapp/yao/agent/robot/types"
|
|
)
|
|
|
|
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: &robottypes.DeliveryContent{
|
|
Summary: "done",
|
|
Body: "full report",
|
|
},
|
|
Preferences: &robottypes.DeliveryPreferences{
|
|
Email: &robottypes.EmailPreference{
|
|
Enabled: true,
|
|
Targets: []robottypes.EmailTarget{{To: []string{"a@b.com"}}},
|
|
},
|
|
},
|
|
}
|
|
|
|
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.Equal(t, "done", parsed.Content.Summary)
|
|
assert.NotNil(t, parsed.Preferences)
|
|
assert.NotNil(t, parsed.Preferences.Email)
|
|
}
|