Skip to content
File

Blob: tests/worker/lib/ai/prompts.test.ts

typescript115 lines
1import { describe, expect, it } from "vitest";
2import { buildAskMessages, buildGenerateMessages, buildRewriteMessages } from "@/worker/lib/ai/prompts";
3 
4describe("buildRewriteMessages", () => {
5 it("includes all context pieces when present", () => {
6 const messages = buildRewriteMessages({
7 action: "proofread",
8 selectedText: "hello wrld",
9 parentBlock: "hello wrld how are you",
10 beforeBlock: "Previous paragraph text",
11 afterBlock: "Next paragraph text",
12 pageTitle: "My Page",
13 });
14 
15 expect(messages).toHaveLength(2);
16 expect(messages[0].role).toBe("system");
17 expect(messages[0].content).toContain("Proofread the selection");
18 expect(messages[0].content).toContain("writing assistant");
19 
20 expect(messages[1].role).toBe("user");
21 expect(messages[1].content).toContain("Page title: My Page");
22 expect(messages[1].content).toContain("Previous block: Previous paragraph text");
23 expect(messages[1].content).toContain("Current block: hello wrld how are you");
24 expect(messages[1].content).toContain("Next block: Next paragraph text");
25 expect(messages[1].content).toContain("Selection to rewrite:\nhello wrld");
26 });
27 
28 it("omits lines when optional fields are empty", () => {
29 const messages = buildRewriteMessages({
30 action: "formal",
31 selectedText: "the thing",
32 parentBlock: "",
33 beforeBlock: "",
34 afterBlock: "",
35 pageTitle: "",
36 });
37 expect(messages[0].content).toContain("more formal");
38 expect(messages[1].content).not.toContain("Page title:");
39 expect(messages[1].content).not.toContain("Previous block:");
40 expect(messages[1].content).not.toContain("Current block:");
41 expect(messages[1].content).not.toContain("Next block:");
42 expect(messages[1].content).toContain("Selection to rewrite:\nthe thing");
43 });
44 
45 it.each(["proofread", "formal", "casual", "simplify", "expand"] as const)(
46 "has action-specific instruction for %s",
47 (action) => {
48 const messages = buildRewriteMessages({
49 action,
50 selectedText: "x",
51 parentBlock: "",
52 beforeBlock: "",
53 afterBlock: "",
54 pageTitle: "",
55 });
56 expect(messages[0].content.length).toBeGreaterThan(20);
57 },
58 );
59});
60 
61describe("buildGenerateMessages", () => {
62 it("composes context with continuation instruction", () => {
63 const messages = buildGenerateMessages({
64 intent: "continue",
65 beforeBlock: "Once upon a time",
66 afterBlock: "The end.",
67 pageTitle: "Story",
68 });
69 expect(messages[0].content).toContain("Continue writing");
70 expect(messages[1].content).toContain("Page title: Story");
71 expect(messages[1].content).toContain("Text before the cursor:\nOnce upon a time");
72 expect(messages[1].content).toContain("Text after the cursor:\nThe end.");
73 expect(messages[1].content).toContain("Write the continuation at the cursor.");
74 });
75 
76 it("omits context lines when empty", () => {
77 const messages = buildGenerateMessages({
78 intent: "brainstorm",
79 beforeBlock: "",
80 afterBlock: "",
81 pageTitle: "",
82 });
83 expect(messages[0].content).toContain("Brainstorm");
84 expect(messages[1].content).not.toContain("Page title:");
85 expect(messages[1].content).not.toContain("before the cursor:");
86 expect(messages[1].content).not.toContain("after the cursor:");
87 expect(messages[1].content).toContain("Write the continuation at the cursor.");
88 });
89});
90 
91describe("buildAskMessages", () => {
92 it("includes title, context, and full history", () => {
93 const messages = buildAskMessages("Doc", "Body content here.", "What is this about?", [
94 { role: "user", content: "earlier question" },
95 { role: "assistant", content: "earlier answer" },
96 ]);
97 
98 expect(messages).toHaveLength(4);
99 expect(messages[0].role).toBe("system");
100 expect(messages[0].content).toContain("Page title: Doc");
101 expect(messages[0].content).toContain("Page content:\nBody content here.");
102 expect(messages[0].content).toContain("If the page does not contain the answer");
103 expect(messages[1]).toEqual({ role: "user", content: "earlier question" });
104 expect(messages[2]).toEqual({ role: "assistant", content: "earlier answer" });
105 expect(messages[3]).toEqual({ role: "user", content: "What is this about?" });
106 });
107 
108 it("marks page content as empty when absent", () => {
109 const messages = buildAskMessages("", "", "anything?", []);
110 expect(messages[0].content).toContain("Page content is empty.");
111 expect(messages[0].content).not.toContain("Page title:");
112 expect(messages[1]).toEqual({ role: "user", content: "anything?" });
113 });
114});