|
import { collections } from "$lib/server/database"; |
|
import { ObjectId } from "mongodb"; |
|
import { describe, expect, it } from "vitest"; |
|
|
|
import { insertLegacyConversation, insertSideBranchesConversation } from "./treeHelpers.spec"; |
|
import type { Message } from "$lib/types/Message"; |
|
import { addSibling } from "./addSibling"; |
|
|
|
const newMessage: Omit<Message, "id"> = { |
|
content: "new message", |
|
from: "user", |
|
}; |
|
|
|
Object.freeze(newMessage); |
|
|
|
describe("addSibling", async () => { |
|
it("should fail on empty conversations", () => { |
|
const conv = { |
|
_id: new ObjectId(), |
|
rootMessageId: undefined, |
|
messages: [], |
|
}; |
|
|
|
expect(() => addSibling(conv, newMessage, "not-a-real-id-test")).toThrow( |
|
"Cannot add a sibling to an empty conversation" |
|
); |
|
}); |
|
|
|
it("should fail on legacy conversations", async () => { |
|
const convId = await insertLegacyConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
expect(() => addSibling(conv, newMessage, conv.messages[0].id)).toThrow( |
|
"Cannot add a sibling to a legacy conversation" |
|
); |
|
}); |
|
|
|
it("should fail if the sibling message doesn't exist", async () => { |
|
const convId = await insertSideBranchesConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
expect(() => addSibling(conv, newMessage, "not-a-real-id-test")).toThrow( |
|
"The sibling message doesn't exist" |
|
); |
|
}); |
|
|
|
|
|
it("should fail if the sibling message is the root message", async () => { |
|
const convId = await insertSideBranchesConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
if (!conv.rootMessageId) throw new Error("Root message not found"); |
|
|
|
expect(() => addSibling(conv, newMessage, conv.rootMessageId as Message["id"])).toThrow( |
|
"The sibling message is the root message, therefore we can't add a sibling" |
|
); |
|
}); |
|
|
|
it("should add a sibling to a message", async () => { |
|
const convId = await insertSideBranchesConversation(); |
|
const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); |
|
if (!conv) throw new Error("Conversation not found"); |
|
|
|
|
|
|
|
const nChildren = conv.messages[1].children?.length; |
|
const siblingId = addSibling(conv, newMessage, conv.messages[2].id); |
|
const nChildrenNew = conv.messages[1].children?.length; |
|
|
|
if (!nChildren) throw new Error("No children found"); |
|
|
|
expect(nChildrenNew).toBe(nChildren + 1); |
|
|
|
|
|
const sibling = conv.messages.find((m) => m.id === siblingId); |
|
expect(sibling?.ancestors).toEqual(conv.messages[2].ancestors); |
|
}); |
|
}); |
|
|