|
import { collections } from "$lib/server/database"; |
|
import { ObjectId } from "mongodb"; |
|
import { describe, expect, it } from "vitest"; |
|
|
|
import { |
|
insertLegacyConversation, |
|
insertLinearBranchConversation, |
|
insertSideBranchesConversation, |
|
} from "./treeHelpers.spec"; |
|
import { buildSubtree } from "./buildSubtree"; |
|
|
|
describe("buildSubtree", () => { |
|
it("a subtree in a legacy conversation should be just a slice", async () => { |
|
const convId = await insertLegacyConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
|
|
const id = conv.messages[2].id; |
|
const subtree = buildSubtree(conv, id); |
|
expect(subtree).toEqual(conv.messages.slice(0, 3)); |
|
|
|
|
|
const id2 = conv.messages[0].id; |
|
const subtree2 = buildSubtree(conv, id2); |
|
expect(subtree2).toEqual(conv.messages.slice(0, 1)); |
|
|
|
|
|
const id3 = conv.messages[conv.messages.length - 1].id; |
|
const subtree3 = buildSubtree(conv, id3); |
|
expect(subtree3).toEqual(conv.messages); |
|
}); |
|
|
|
it("a subtree in a linear branch conversation should be the ancestors and the message", async () => { |
|
const convId = await insertLinearBranchConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
|
|
const id = conv.messages[1].id; |
|
const subtree = buildSubtree(conv, id); |
|
expect(subtree).toEqual([conv.messages[0], conv.messages[1]]); |
|
|
|
|
|
const id2 = conv.messages[0].id; |
|
const subtree2 = buildSubtree(conv, id2); |
|
expect(subtree2).toEqual([conv.messages[0]]); |
|
|
|
|
|
const id3 = conv.messages[conv.messages.length - 1].id; |
|
const subtree3 = buildSubtree(conv, id3); |
|
expect(subtree3).toEqual(conv.messages); |
|
}); |
|
|
|
it("should throw an error if the message is not found", async () => { |
|
const convId = await insertLinearBranchConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
const id = "not-a-real-id-test"; |
|
|
|
expect(() => buildSubtree(conv, id)).toThrow("Message not found"); |
|
}); |
|
|
|
it("should throw an error if the ancestor is not found", async () => { |
|
const convId = await insertLinearBranchConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
const id = "1-1-1-1-2"; |
|
|
|
conv.messages[1].ancestors = ["not-a-real-id-test"]; |
|
|
|
expect(() => buildSubtree(conv, id)).toThrow("Ancestor not found"); |
|
}); |
|
|
|
it("should work on empty conversations", () => { |
|
const conv = { |
|
_id: new ObjectId(), |
|
rootMessageId: undefined, |
|
messages: [], |
|
}; |
|
|
|
const subtree = buildSubtree(conv, "not-a-real-id-test"); |
|
expect(subtree).toEqual([]); |
|
}); |
|
|
|
it("should work for conversation with subtrees", async () => { |
|
const convId = await insertSideBranchesConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
const subtree = buildSubtree(conv, "1-1-1-1-2"); |
|
expect(subtree).toEqual([conv.messages[0], conv.messages[1]]); |
|
|
|
const subtree2 = buildSubtree(conv, "1-1-1-1-4"); |
|
expect(subtree2).toEqual([ |
|
conv.messages[0], |
|
conv.messages[1], |
|
conv.messages[2], |
|
conv.messages[3], |
|
]); |
|
|
|
const subtree3 = buildSubtree(conv, "1-1-1-1-6"); |
|
expect(subtree3).toEqual([conv.messages[0], conv.messages[4], conv.messages[5]]); |
|
|
|
const subtree4 = buildSubtree(conv, "1-1-1-1-7"); |
|
expect(subtree4).toEqual([conv.messages[0], conv.messages[4], conv.messages[6]]); |
|
}); |
|
}); |
|
|