feat(captain): align streaming fallbacks

This commit is contained in:
2026-06-05 13:57:30 +08:00
parent a7cd53aa62
commit 72211e6dda
8 changed files with 329 additions and 67 deletions
@@ -237,6 +237,48 @@ func TestCopilotThreadMessagesListAndCreateUseNestedPayloads(t *testing.T) {
require.Len(t, messages, 4)
}
func TestCopilotMessagePayloadUsesThreadPushShape(t *testing.T) {
f := newCopilotParityFixture(t)
thread := f.createThread(t, "Need help")
threadID := uintString(uint(thread["id"].(float64)))
path := f.captainPath("/copilot_threads/" + threadID + "/copilot_messages/")
w := f.request(f.router, http.MethodGet, path, nil)
require.Equal(t, http.StatusOK, w.Code, w.Body.String())
messages := decodeMap(t, w)["payload"].([]any)
message := messages[0].(map[string]any)
nestedThread := message["copilot_thread"].(map[string]any)
require.Equal(t, thread["id"], nestedThread["id"])
require.NotNil(t, nestedThread["user"])
require.Equal(t, thread["account_id"], nestedThread["account_id"])
require.Nil(t, nestedThread["assistant"])
require.NotNil(t, message["account_id"])
}
func TestCopilotMessagePushPayloadMatchesChatwootEventData(t *testing.T) {
f := newCopilotParityFixture(t)
thread := f.createThread(t, "Need help")
threadID := uintString(uint(thread["id"].(float64)))
path := f.captainPath("/copilot_threads/" + threadID + "/copilot_messages/")
w := f.request(f.router, http.MethodPost, path, map[string]any{"message": "Follow up", "conversation_id": 123})
require.Equal(t, http.StatusOK, w.Code, w.Body.String())
created := decodeMap(t, w)
var stored model.CopilotMessage
require.NoError(t, f.db.Preload("CopilotThread.User").Preload("CopilotThread.Assistant").First(&stored, uint(created["id"].(float64))).Error)
push := copilotMessagePushPayload(&stored)
nestedThread := push["copilot_thread"].(gin.H)
require.Equal(t, created["id"], float64(push["id"].(uint)))
require.Equal(t, "user", string(push["message_type"].(model.CopilotMessageType)))
require.Equal(t, "Follow up", push["message"].(map[string]any)["content"])
require.Nil(t, push["account_id"])
require.Equal(t, stored.CopilotThreadID, nestedThread["id"])
require.Nil(t, nestedThread["assistant"])
require.NotNil(t, nestedThread["user"])
}
func TestCopilotThreadMessagesAreAccountAndUserScoped(t *testing.T) {
f := newCopilotParityFixture(t)
thread := f.createThread(t, "Private thread")