Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2104035

Browse files
committed
test(coderd/x/chatd/chatstate): assert suffix messages keep input order
The test used a single suffix message and only checked the returned slice, so it could not detect a batch whose rows came back reordered or a history read that returned the suffix before its replacement. Use two distinguishable suffix messages, assert their IDs ascend with the input array, and reload through GetChatMessagesByChatID to check the active tail is the replacement followed by both notices in order.
1 parent 538ac27 commit 2104035

1 file changed

Lines changed: 33 additions & 6 deletions

File tree

coderd/x/chatd/chatstate/transitions_test.go

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,10 @@ func TestEditMessageInsertsSuffixMessages(t *testing.T) {
513513
return nil
514514
}))
515515

516-
suffix := userTextMessage("session notice", f.User.ID, f.Model.ID)
517-
suffix.Role = database.ChatMessageRoleSystem
516+
firstSuffix := userTextMessage("first notice", f.User.ID, f.Model.ID)
517+
firstSuffix.Role = database.ChatMessageRoleSystem
518+
secondSuffix := userTextMessage("second notice", f.User.ID, f.Model.ID)
519+
secondSuffix.Role = database.ChatMessageRoleSystem
518520
rawContent, err := chatprompt.MarshalParts([]codersdk.ChatMessagePart{
519521
codersdk.ChatMessageText("edited prompt"),
520522
})
@@ -524,20 +526,45 @@ func TestEditMessageInsertsSuffixMessages(t *testing.T) {
524526
require.NoError(t, m.Update(ctx, func(tx *chatstate.Tx, store database.Store) error {
525527
result, err = tx.EditMessage(chatstate.EditMessageInput{
526528
MessageID: targetID,
527-
SuffixMessages: []chatstate.Message{suffix},
529+
SuffixMessages: []chatstate.Message{firstSuffix, secondSuffix},
528530
CreatedBy: f.User.ID,
529531
Content: rawContent,
530532
})
531533
return err
532534
}))
533535

534536
require.Contains(t, result.DeletedMessageIDs, targetID)
535-
require.Len(t, result.SuffixMessages, 1)
536-
assertChatMessageText(t, result.SuffixMessages[0], "session notice")
537+
require.Len(t, result.SuffixMessages, 2)
538+
assertChatMessageText(t, result.SuffixMessages[0], "first notice")
539+
assertChatMessageText(t, result.SuffixMessages[1], "second notice")
537540
require.Greater(t, result.SuffixMessages[0].ID, result.ReplacementMessage.ID,
538-
"the suffix message must follow the replacement")
541+
"the suffix messages must follow the replacement")
542+
require.Greater(t, result.SuffixMessages[1].ID, result.SuffixMessages[0].ID,
543+
"suffix message IDs must ascend with the input array")
539544
_, err = f.DB.GetChatMessageByID(ctx, result.ReplacementMessage.ID)
540545
require.NoError(t, err, "the replacement message must stay active")
546+
547+
// Reloading is what the generation path does, so the input order has to
548+
// survive the round trip and not just the returned slice.
549+
history, err := f.DB.GetChatMessagesByChatID(ctx, database.GetChatMessagesByChatIDParams{
550+
ChatID: created.Chat.ID,
551+
})
552+
require.NoError(t, err)
553+
require.GreaterOrEqual(t, len(history), 3)
554+
tail := history[len(history)-3:]
555+
require.Equal(t, []int64{
556+
result.ReplacementMessage.ID,
557+
result.SuffixMessages[0].ID,
558+
result.SuffixMessages[1].ID,
559+
}, []int64{tail[0].ID, tail[1].ID, tail[2].ID})
560+
assertChatMessageText(t, tail[0], "edited prompt")
561+
assertChatMessageText(t, tail[1], "first notice")
562+
assertChatMessageText(t, tail[2], "second notice")
563+
564+
for _, message := range history {
565+
require.NotEqual(t, targetID, message.ID,
566+
"the edited message must not stay in active history")
567+
}
541568
}
542569

543570
// TestTransitionAbandon_RejectsUnowned verifies that calling Abandon

0 commit comments

Comments
 (0)