Skip to content

Commit 775bdfd

Browse files
committed
test: add streaming test for message handler
- Test that user message upload creates assistant message and updates with deltas - Use powersynctest.OpenTestDBWithSchema for all message handler tests
1 parent a94d762 commit 775bdfd

1 file changed

Lines changed: 70 additions & 7 deletions

File tree

‎internal/upload/message_handler_test.go‎

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/usetero/cli/internal/chat/chattest"
1010
"github.com/usetero/cli/internal/log/logtest"
1111
"github.com/usetero/cli/internal/powersync"
12-
"github.com/usetero/cli/internal/sqlite/sqlitetest"
12+
"github.com/usetero/cli/internal/powersync/powersynctest"
1313
)
1414

1515
func TestMessageHandler_Handle(t *testing.T) {
@@ -18,7 +18,7 @@ func TestMessageHandler_Handle(t *testing.T) {
1818
t.Run("PUT user message uploads and streams response", func(t *testing.T) {
1919
t.Parallel()
2020

21-
db := sqlitetest.OpenTest(t)
21+
db := powersynctest.OpenTestDBWithSchema(t)
2222

2323
var calledWith struct {
2424
messageID string
@@ -65,10 +65,73 @@ func TestMessageHandler_Handle(t *testing.T) {
6565
}
6666
})
6767

68+
t.Run("PUT user message creates assistant message and updates with deltas", func(t *testing.T) {
69+
t.Parallel()
70+
71+
db := powersynctest.OpenTestDBWithSchema(t)
72+
73+
mock := &chattest.MockMessages{
74+
UploadUserMessageFunc: func(ctx context.Context, messageID, conversationID, content string, handler chat.StreamHandler) error {
75+
// Simulate streaming: message_start, then multiple deltas, then done
76+
if err := handler(chat.StreamEvent{Type: "message_start"}); err != nil {
77+
return err
78+
}
79+
if err := handler(chat.StreamEvent{Type: "content_block_delta", Text: &chat.TextDelta{Content: "Hello"}}); err != nil {
80+
return err
81+
}
82+
if err := handler(chat.StreamEvent{Type: "content_block_delta", Text: &chat.TextDelta{Content: " world"}}); err != nil {
83+
return err
84+
}
85+
if err := handler(chat.StreamEvent{Type: "content_block_delta", Text: &chat.TextDelta{Content: "!"}}); err != nil {
86+
return err
87+
}
88+
return handler(chat.StreamEvent{Done: true})
89+
},
90+
}
91+
92+
h := newMessageHandler(mock, db, logtest.New(t))
93+
94+
entry := &powersync.CrudEntry{
95+
Op: powersync.OpPut,
96+
RowID: "msg-1",
97+
Data: map[string]any{
98+
"role": "user",
99+
"conversation_id": "conv-1",
100+
"account_id": "acc-1",
101+
"content": "Hi",
102+
},
103+
}
104+
105+
err := h.Handle(context.Background(), entry)
106+
if err != nil {
107+
t.Fatalf("Handle() error = %v", err)
108+
}
109+
110+
// Verify assistant message was created and updated in SQLite
111+
rows, err := db.Query(context.Background(), "SELECT content FROM messages WHERE role = 'assistant'")
112+
if err != nil {
113+
t.Fatalf("Query error = %v", err)
114+
}
115+
defer rows.Close()
116+
117+
if !rows.Next() {
118+
t.Fatal("expected assistant message in database")
119+
}
120+
121+
var content string
122+
if err := rows.Scan(&content); err != nil {
123+
t.Fatalf("Scan error = %v", err)
124+
}
125+
126+
if content != "Hello world!" {
127+
t.Errorf("assistant message content = %q, want %q", content, "Hello world!")
128+
}
129+
})
130+
68131
t.Run("PUT user message returns error on failure", func(t *testing.T) {
69132
t.Parallel()
70133

71-
db := sqlitetest.OpenTest(t)
134+
db := powersynctest.OpenTestDBWithSchema(t)
72135

73136
mock := &chattest.MockMessages{
74137
UploadUserMessageFunc: func(ctx context.Context, messageID, conversationID, content string, handler chat.StreamHandler) error {
@@ -97,7 +160,7 @@ func TestMessageHandler_Handle(t *testing.T) {
97160
t.Run("PUT assistant message uploads for durability", func(t *testing.T) {
98161
t.Parallel()
99162

100-
db := sqlitetest.OpenTest(t)
163+
db := powersynctest.OpenTestDBWithSchema(t)
101164

102165
var calledWith struct {
103166
messageID string
@@ -148,7 +211,7 @@ func TestMessageHandler_Handle(t *testing.T) {
148211
t.Run("PATCH skips upload and returns nil", func(t *testing.T) {
149212
t.Parallel()
150213

151-
db := sqlitetest.OpenTest(t)
214+
db := powersynctest.OpenTestDBWithSchema(t)
152215
h := newMessageHandler(&chattest.MockMessages{}, db, logtest.New(t))
153216

154217
entry := &powersync.CrudEntry{
@@ -166,7 +229,7 @@ func TestMessageHandler_Handle(t *testing.T) {
166229
t.Run("DELETE skips upload and returns nil", func(t *testing.T) {
167230
t.Parallel()
168231

169-
db := sqlitetest.OpenTest(t)
232+
db := powersynctest.OpenTestDBWithSchema(t)
170233
h := newMessageHandler(&chattest.MockMessages{}, db, logtest.New(t))
171234

172235
entry := &powersync.CrudEntry{
@@ -184,7 +247,7 @@ func TestMessageHandler_Handle(t *testing.T) {
184247
t.Run("unknown role returns nil", func(t *testing.T) {
185248
t.Parallel()
186249

187-
db := sqlitetest.OpenTest(t)
250+
db := powersynctest.OpenTestDBWithSchema(t)
188251
h := newMessageHandler(&chattest.MockMessages{}, db, logtest.New(t))
189252

190253
entry := &powersync.CrudEntry{

0 commit comments

Comments
 (0)