@@ -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