TestFileReferencePreservation verifies file-reference parts survive the storage round-trip and convert to text for LLMs.
(t *testing.T)
| 1501 | // TestFileReferencePreservation verifies file-reference parts |
| 1502 | // survive the storage round-trip and convert to text for LLMs. |
| 1503 | func TestFileReferencePreservation(t *testing.T) { |
| 1504 | t.Parallel() |
| 1505 | |
| 1506 | raw, err := chatprompt.MarshalParts([]codersdk.ChatMessagePart{{ |
| 1507 | Type: codersdk.ChatMessagePartTypeFileReference, |
| 1508 | FileName: "main.go", |
| 1509 | StartLine: 10, |
| 1510 | EndLine: 20, |
| 1511 | Content: "func main() {}", |
| 1512 | }}) |
| 1513 | require.NoError(t, err) |
| 1514 | |
| 1515 | // Storage round-trip: all fields intact. |
| 1516 | parts, err := chatprompt.ParseContent(testMsg(codersdk.ChatMessageRoleUser, raw)) |
| 1517 | require.NoError(t, err) |
| 1518 | require.Len(t, parts, 1) |
| 1519 | assert.Equal(t, codersdk.ChatMessagePartTypeFileReference, parts[0].Type) |
| 1520 | assert.Equal(t, "main.go", parts[0].FileName) |
| 1521 | assert.Equal(t, 10, parts[0].StartLine) |
| 1522 | assert.Equal(t, 20, parts[0].EndLine) |
| 1523 | assert.Equal(t, "func main() {}", parts[0].Content) |
| 1524 | |
| 1525 | // LLM dispatch: file-reference becomes a TextPart. |
| 1526 | prompt, err := chatprompt.ConvertMessagesWithFiles( |
| 1527 | context.Background(), |
| 1528 | []database.ChatMessage{{ |
| 1529 | Role: database.ChatMessageRoleUser, |
| 1530 | Visibility: database.ChatMessageVisibilityBoth, |
| 1531 | Content: raw, |
| 1532 | }}, |
| 1533 | nil, |
| 1534 | slogtest.Make(t, nil), |
| 1535 | ) |
| 1536 | require.NoError(t, err) |
| 1537 | require.Len(t, prompt, 1) |
| 1538 | require.Len(t, prompt[0].Content, 1) |
| 1539 | |
| 1540 | textPart, ok := fantasy.AsMessagePart[fantasy.TextPart](prompt[0].Content[0]) |
| 1541 | require.True(t, ok, "file-reference should become TextPart for LLM") |
| 1542 | assert.Contains(t, textPart.Text, "[file-reference]") |
| 1543 | assert.Contains(t, textPart.Text, "main.go") |
| 1544 | assert.Contains(t, textPart.Text, "10-20") |
| 1545 | assert.Contains(t, textPart.Text, "func main() {}") |
| 1546 | } |
| 1547 | |
| 1548 | // TestAssistantWriteRoundTrip verifies the Stage 4 write path: |
| 1549 | // fantasy.Content (with ProviderMetadata) → PartFromContent → |
nothing calls this directly
no test coverage detected