- Updated the API documentation in TODO.md to reflect the completion of the Go API implementation and end-to-end tests for the main flow (P0 → P1 → P2 → P3 → P4). - Clarified that Process handlers and JSAPI are optional features, moving them to Phase 12, while emphasizing that the Go API is sufficient for MVP integration. - Removed obsolete API files (`api.go`, `jsapi.go`, `process.go`) as they were stubs and not implemented in Phase 10, streamlining the codebase. - Revised the structure of the TODO.md to better outline the goals and tasks for Phases 11 and 12, ensuring clear tracking of progress and dependencies.
170 lines
4.6 KiB
Go
170 lines
4.6 KiB
Go
package api_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/yaoapp/yao/agent/robot/api"
|
|
"github.com/yaoapp/yao/agent/robot/types"
|
|
"github.com/yaoapp/yao/agent/testutils"
|
|
)
|
|
|
|
// TestTriggerValidation tests parameter validation for Trigger
|
|
func TestTriggerValidation(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("Skipping integration test")
|
|
}
|
|
|
|
testutils.Prepare(t)
|
|
defer testutils.Clean(t)
|
|
|
|
ctx := types.NewContext(nil, nil)
|
|
|
|
t.Run("returns error for empty member_id", func(t *testing.T) {
|
|
result, err := api.Trigger(ctx, "", &api.TriggerRequest{
|
|
Type: types.TriggerHuman,
|
|
})
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "member_id is required")
|
|
})
|
|
|
|
t.Run("returns error for nil request", func(t *testing.T) {
|
|
result, err := api.Trigger(ctx, "test_member", nil)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "trigger request is required")
|
|
})
|
|
|
|
t.Run("returns error when manager not started", func(t *testing.T) {
|
|
result, err := api.Trigger(ctx, "test_member", &api.TriggerRequest{
|
|
Type: types.TriggerHuman,
|
|
})
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "not started")
|
|
})
|
|
}
|
|
|
|
// TestTriggerManualValidation tests parameter validation for TriggerManual
|
|
func TestTriggerManualValidation(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("Skipping integration test")
|
|
}
|
|
|
|
testutils.Prepare(t)
|
|
defer testutils.Clean(t)
|
|
|
|
ctx := types.NewContext(nil, nil)
|
|
|
|
t.Run("returns error for empty member_id", func(t *testing.T) {
|
|
result, err := api.TriggerManual(ctx, "", types.TriggerClock, nil)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "member_id is required")
|
|
})
|
|
|
|
t.Run("returns error when manager not started", func(t *testing.T) {
|
|
result, err := api.TriggerManual(ctx, "test_member", types.TriggerClock, nil)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "not started")
|
|
})
|
|
}
|
|
|
|
// TestInterveneValidation tests parameter validation for Intervene
|
|
func TestInterveneValidation(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("Skipping integration test")
|
|
}
|
|
|
|
testutils.Prepare(t)
|
|
defer testutils.Clean(t)
|
|
|
|
ctx := types.NewContext(nil, nil)
|
|
|
|
t.Run("returns error for empty member_id", func(t *testing.T) {
|
|
result, err := api.Intervene(ctx, "", &api.TriggerRequest{
|
|
Type: types.TriggerHuman,
|
|
Action: types.ActionTaskAdd,
|
|
})
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "member_id is required")
|
|
})
|
|
|
|
t.Run("returns error for nil request", func(t *testing.T) {
|
|
result, err := api.Intervene(ctx, "test_member", nil)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "intervention request is required")
|
|
})
|
|
}
|
|
|
|
// TestHandleEventValidation tests parameter validation for HandleEvent
|
|
func TestHandleEventValidation(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("Skipping integration test")
|
|
}
|
|
|
|
testutils.Prepare(t)
|
|
defer testutils.Clean(t)
|
|
|
|
ctx := types.NewContext(nil, nil)
|
|
|
|
t.Run("returns error for empty member_id", func(t *testing.T) {
|
|
result, err := api.HandleEvent(ctx, "", &api.TriggerRequest{
|
|
Type: types.TriggerEvent,
|
|
Source: types.EventWebhook,
|
|
EventType: "test.event",
|
|
})
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "member_id is required")
|
|
})
|
|
|
|
t.Run("returns error for nil request", func(t *testing.T) {
|
|
result, err := api.HandleEvent(ctx, "test_member", nil)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "event request is required")
|
|
})
|
|
}
|
|
|
|
// TestTriggerWithManagerStarted tests trigger APIs when manager is running
|
|
func TestTriggerWithManagerStarted(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("Skipping integration test")
|
|
}
|
|
|
|
testutils.Prepare(t)
|
|
defer testutils.Clean(t)
|
|
|
|
// Start manager
|
|
err := api.Start()
|
|
require.NoError(t, err)
|
|
defer api.Stop()
|
|
|
|
ctx := types.NewContext(nil, nil)
|
|
|
|
t.Run("returns not accepted for non-existent robot", func(t *testing.T) {
|
|
result, err := api.Trigger(ctx, "non_existent_robot_xyz", &api.TriggerRequest{
|
|
Type: types.TriggerHuman,
|
|
Action: types.ActionTaskAdd,
|
|
})
|
|
// Should not error, but return not accepted
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, result)
|
|
assert.False(t, result.Accepted)
|
|
})
|
|
|
|
t.Run("returns error for invalid trigger type", func(t *testing.T) {
|
|
result, err := api.Trigger(ctx, "test_member", &api.TriggerRequest{
|
|
Type: "invalid_type",
|
|
})
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
assert.Contains(t, err.Error(), "invalid trigger type")
|
|
})
|
|
}
|