Spaces:
Paused
Paused
| import { collections } from "$lib/server/database"; | |
| import { ObjectId } from "mongodb"; | |
| import { describe, expect, it } from "vitest"; | |
| import { insertLegacyConversation, insertSideBranchesConversation } from "./treeHelpers.spec"; | |
| import { addChildren } from "./addChildren"; | |
| import type { Message } from "$lib/types/Message"; | |
| const newMessage: Omit<Message, "id"> = { | |
| content: "new message", | |
| from: "user", | |
| }; | |
| Object.freeze(newMessage); | |
| describe("addChildren", async () => { | |
| it("should let you append 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"); | |
| const convLength = conv.messages.length; | |
| addChildren(conv, newMessage, conv.messages[conv.messages.length - 1].id); | |
| expect(conv.messages.length).toEqual(convLength + 1); | |
| }); | |
| it("should not let you create branches 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(() => addChildren(conv, newMessage, conv.messages[0].id)).toThrow(); | |
| }); | |
| it("should not let you create a message that already exists", async () => { | |
| const convId = await insertLegacyConversation(); | |
| const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); | |
| if (!conv) throw new Error("Conversation not found"); | |
| const messageThatAlreadyExists: Message = { | |
| id: conv.messages[0].id, | |
| content: "new message", | |
| from: "user", | |
| }; | |
| expect(() => addChildren(conv, messageThatAlreadyExists, conv.messages[0].id)).toThrow(); | |
| }); | |
| it("should let you create branches on conversations 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 nChildren = conv.messages[0].children?.length; | |
| if (!nChildren) throw new Error("No children found"); | |
| addChildren(conv, newMessage, conv.messages[0].id); | |
| expect(conv.messages[0].children?.length).toEqual(nChildren + 1); | |
| }); | |
| it("should let you create a new leaf", async () => { | |
| const convId = await insertSideBranchesConversation(); | |
| const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); | |
| if (!conv) throw new Error("Conversation not found"); | |
| const parentId = conv.messages[conv.messages.length - 1].id; | |
| const nChildren = conv.messages[conv.messages.length - 1].children?.length; | |
| if (nChildren === undefined) throw new Error("No children found"); | |
| expect(nChildren).toEqual(0); | |
| addChildren(conv, newMessage, parentId); | |
| expect(conv.messages[conv.messages.length - 2].children?.length).toEqual(nChildren + 1); | |
| }); | |
| it("should let you append to an empty conversation without specifying a parentId", async () => { | |
| const conv = { | |
| _id: new ObjectId(), | |
| rootMessageId: undefined, | |
| messages: [] as Message[], | |
| }; | |
| addChildren(conv, newMessage); | |
| expect(conv.messages.length).toEqual(1); | |
| expect(conv.rootMessageId).toEqual(conv.messages[0].id); | |
| }); | |
| it("should throw if you don't specify a parentId in a conversation with messages", async () => { | |
| const convId = await insertLegacyConversation(); | |
| const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); | |
| if (!conv) throw new Error("Conversation not found"); | |
| expect(() => addChildren(conv, newMessage)).toThrow(); | |
| }); | |
| it("should return the id of the new message", async () => { | |
| const convId = await insertLegacyConversation(); | |
| const conv = await collections.conversations.findOne({ _id: new ObjectId(convId) }); | |
| if (!conv) throw new Error("Conversation not found"); | |
| expect(addChildren(conv, newMessage, conv.messages[conv.messages.length - 1].id)).toEqual( | |
| conv.messages[conv.messages.length - 1].id | |
| ); | |
| }); | |
| }); | |