|
|
@@ -0,0 +1,71 @@
|
|
|
+import { describe, it, expect, vi, beforeEach } from "vitest"
|
|
|
+import * as os from "os"
|
|
|
+import * as path from "path"
|
|
|
+import * as fs from "fs/promises"
|
|
|
+
|
|
|
+// Mocks (use hoisted to avoid initialization ordering issues)
|
|
|
+const hoisted = vi.hoisted(() => ({
|
|
|
+ safeWriteJsonMock: vi.fn().mockResolvedValue(undefined),
|
|
|
+}))
|
|
|
+vi.mock("../../../utils/safeWriteJson", () => ({
|
|
|
+ safeWriteJson: hoisted.safeWriteJsonMock,
|
|
|
+}))
|
|
|
+
|
|
|
+// Import after mocks
|
|
|
+import { saveTaskMessages } from "../taskMessages"
|
|
|
+
|
|
|
+let tmpBaseDir: string
|
|
|
+
|
|
|
+beforeEach(async () => {
|
|
|
+ hoisted.safeWriteJsonMock.mockClear()
|
|
|
+ // Create a unique, writable temp directory to act as globalStoragePath
|
|
|
+ tmpBaseDir = await fs.mkdtemp(path.join(os.tmpdir(), "roo-test-"))
|
|
|
+})
|
|
|
+
|
|
|
+describe("taskMessages.saveTaskMessages", () => {
|
|
|
+ beforeEach(() => {
|
|
|
+ hoisted.safeWriteJsonMock.mockClear()
|
|
|
+ })
|
|
|
+
|
|
|
+ it("persists messages as-is", async () => {
|
|
|
+ const messages: any[] = [
|
|
|
+ {
|
|
|
+ role: "assistant",
|
|
|
+ content: "Hello",
|
|
|
+ metadata: {
|
|
|
+ gpt5: {
|
|
|
+ previous_response_id: "resp_123",
|
|
|
+ },
|
|
|
+ other: "keep",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ { role: "user", content: "Do thing" },
|
|
|
+ ]
|
|
|
+
|
|
|
+ await saveTaskMessages({
|
|
|
+ messages,
|
|
|
+ taskId: "task-1",
|
|
|
+ globalStoragePath: tmpBaseDir,
|
|
|
+ })
|
|
|
+
|
|
|
+ expect(hoisted.safeWriteJsonMock).toHaveBeenCalledTimes(1)
|
|
|
+ const [, persisted] = hoisted.safeWriteJsonMock.mock.calls[0]
|
|
|
+ expect(persisted).toEqual(messages)
|
|
|
+ })
|
|
|
+
|
|
|
+ it("persists messages without modification when no metadata", async () => {
|
|
|
+ const messages: any[] = [
|
|
|
+ { role: "assistant", content: "Hi" },
|
|
|
+ { role: "user", content: "Yo" },
|
|
|
+ ]
|
|
|
+
|
|
|
+ await saveTaskMessages({
|
|
|
+ messages,
|
|
|
+ taskId: "task-2",
|
|
|
+ globalStoragePath: tmpBaseDir,
|
|
|
+ })
|
|
|
+
|
|
|
+ const [, persisted] = hoisted.safeWriteJsonMock.mock.calls[0]
|
|
|
+ expect(persisted).toEqual(messages)
|
|
|
+ })
|
|
|
+})
|