TestClaimCommittedParts covers the per-role behavior of claimCommittedParts: - assistant messages claim every in-progress part with the committed message ID. - tool / user messages do not claim parts. - parts already claimed by an earlier assistant message are not re-claimed. - a chat with no live s
(t *testing.T)
| 6017 | // re-claimed. |
| 6018 | // - a chat with no live state is a no-op (does not panic). |
| 6019 | func TestClaimCommittedParts(t *testing.T) { |
| 6020 | t.Parallel() |
| 6021 | |
| 6022 | t.Run("AssistantClaimsAllInProgressParts", func(t *testing.T) { |
| 6023 | t.Parallel() |
| 6024 | |
| 6025 | server := &Server{ |
| 6026 | logger: slogtest.Make(t, nil), |
| 6027 | clock: quartz.NewMock(t), |
| 6028 | } |
| 6029 | chatID := uuid.New() |
| 6030 | state := server.getOrCreateStreamState(chatID) |
| 6031 | state.mu.Lock() |
| 6032 | state.buffer = []bufferedStreamPart{ |
| 6033 | makeCommittedPart(100, "old-1"), |
| 6034 | makeInProgressPart("new-1"), |
| 6035 | makeInProgressPart("new-2"), |
| 6036 | } |
| 6037 | state.mu.Unlock() |
| 6038 | |
| 6039 | server.claimCommittedParts(chatID, database.ChatMessage{ |
| 6040 | ID: 200, |
| 6041 | Role: database.ChatMessageRoleAssistant, |
| 6042 | }) |
| 6043 | |
| 6044 | state.mu.Lock() |
| 6045 | defer state.mu.Unlock() |
| 6046 | require.Equal(t, int64(100), state.buffer[0].committedMessageID, |
| 6047 | "already-claimed parts must keep their original message ID") |
| 6048 | require.Equal(t, int64(200), state.buffer[1].committedMessageID, |
| 6049 | "in-progress parts must be claimed by the new message ID") |
| 6050 | require.Equal(t, int64(200), state.buffer[2].committedMessageID, |
| 6051 | "in-progress parts must be claimed by the new message ID") |
| 6052 | }) |
| 6053 | |
| 6054 | t.Run("ToolMessageIsNoOp", func(t *testing.T) { |
| 6055 | t.Parallel() |
| 6056 | |
| 6057 | server := &Server{ |
| 6058 | logger: slogtest.Make(t, nil), |
| 6059 | clock: quartz.NewMock(t), |
| 6060 | } |
| 6061 | chatID := uuid.New() |
| 6062 | state := server.getOrCreateStreamState(chatID) |
| 6063 | state.mu.Lock() |
| 6064 | state.buffer = []bufferedStreamPart{ |
| 6065 | makeInProgressPart("a"), |
| 6066 | makeInProgressPart("b"), |
| 6067 | } |
| 6068 | state.mu.Unlock() |
| 6069 | |
| 6070 | server.claimCommittedParts(chatID, database.ChatMessage{ |
| 6071 | ID: 300, |
| 6072 | Role: database.ChatMessageRoleTool, |
| 6073 | }) |
| 6074 | |
| 6075 | state.mu.Lock() |
| 6076 | defer state.mu.Unlock() |
nothing calls this directly
no test coverage detected