truncation.test.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { describe, test, expect } from "bun:test"
  2. import { Truncate } from "../../src/session/truncation"
  3. import path from "path"
  4. const FIXTURES_DIR = path.join(import.meta.dir, "fixtures")
  5. describe("Truncate", () => {
  6. describe("output", () => {
  7. test("truncates large json file by bytes", async () => {
  8. const content = await Bun.file(path.join(FIXTURES_DIR, "models-api.json")).text()
  9. const result = Truncate.output(content)
  10. expect(result.truncated).toBe(true)
  11. expect(Buffer.byteLength(result.content, "utf-8")).toBeLessThanOrEqual(Truncate.MAX_BYTES + 100)
  12. expect(result.content).toContain("truncated...")
  13. })
  14. test("returns content unchanged when under limits", () => {
  15. const content = "line1\nline2\nline3"
  16. const result = Truncate.output(content)
  17. expect(result.truncated).toBe(false)
  18. expect(result.content).toBe(content)
  19. })
  20. test("truncates by line count", () => {
  21. const lines = Array.from({ length: 100 }, (_, i) => `line${i}`).join("\n")
  22. const result = Truncate.output(lines, { maxLines: 10 })
  23. expect(result.truncated).toBe(true)
  24. expect(result.content.split("\n").length).toBeLessThanOrEqual(12)
  25. expect(result.content).toContain("...90 lines truncated...")
  26. })
  27. test("truncates by byte count", () => {
  28. const content = "a".repeat(1000)
  29. const result = Truncate.output(content, { maxBytes: 100 })
  30. expect(result.truncated).toBe(true)
  31. expect(result.content).toContain("truncated...")
  32. })
  33. test("truncates from head by default", () => {
  34. const lines = Array.from({ length: 10 }, (_, i) => `line${i}`).join("\n")
  35. const result = Truncate.output(lines, { maxLines: 3 })
  36. expect(result.truncated).toBe(true)
  37. expect(result.content).toContain("line0")
  38. expect(result.content).toContain("line1")
  39. expect(result.content).toContain("line2")
  40. expect(result.content).not.toContain("line9")
  41. })
  42. test("truncates from tail when direction is tail", () => {
  43. const lines = Array.from({ length: 10 }, (_, i) => `line${i}`).join("\n")
  44. const result = Truncate.output(lines, { maxLines: 3, direction: "tail" })
  45. expect(result.truncated).toBe(true)
  46. expect(result.content).toContain("line7")
  47. expect(result.content).toContain("line8")
  48. expect(result.content).toContain("line9")
  49. expect(result.content).not.toContain("line0")
  50. })
  51. test("uses default MAX_LINES and MAX_BYTES", () => {
  52. expect(Truncate.MAX_LINES).toBe(2000)
  53. expect(Truncate.MAX_BYTES).toBe(50 * 1024)
  54. })
  55. test("large single-line file truncates with byte message", async () => {
  56. const content = await Bun.file(path.join(FIXTURES_DIR, "models-api.json")).text()
  57. const result = Truncate.output(content)
  58. expect(result.truncated).toBe(true)
  59. expect(result.content).toContain("chars truncated...")
  60. expect(Buffer.byteLength(content, "utf-8")).toBeGreaterThan(Truncate.MAX_BYTES)
  61. })
  62. })
  63. })