forked from CopilotKit/CopilotKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshared-state-streaming.spec.ts
More file actions
139 lines (115 loc) · 4.88 KB
/
Copy pathshared-state-streaming.spec.ts
File metadata and controls
139 lines (115 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import { test, expect } from "@playwright/test";
// Shared State (Streaming) — Document Viewer demo. The agent streams a
// `document` field in its state; the frontend renders it token-by-token
// in a read-only DocumentView panel alongside a CopilotSidebar.
test.describe("State Streaming", () => {
test.beforeEach(async ({ page }) => {
await page.goto("/demos/shared-state-streaming");
});
test("page loads with document panel and chat sidebar", async ({ page }) => {
// The document panel should mount with its testid
await expect(page.locator('[data-testid="document-view"]')).toBeVisible({
timeout: 15000,
});
// The "Document" heading inside the panel
await expect(page.getByText("Document")).toBeVisible({ timeout: 10000 });
// Character count starts at 0
await expect(
page.locator('[data-testid="document-char-count"]'),
).toHaveText("0 chars", { timeout: 10000 });
// The sidebar chat input should be present
await expect(
page.getByPlaceholder("Ask me to write something..."),
).toBeVisible({ timeout: 10000 });
});
test("empty state shows placeholder text", async ({ page }) => {
await expect(page.locator('[data-testid="document-view"]')).toBeVisible({
timeout: 15000,
});
// When no document has been streamed, the placeholder italic text shows
await expect(
page.getByText("Ask the agent to write something"),
).toBeVisible({ timeout: 10000 });
// document-content testid should NOT be present in the empty state
await expect(
page.locator('[data-testid="document-content"]'),
).not.toBeVisible();
});
test("starter suggestions render in the sidebar", async ({ page }) => {
// The suggestions defined in suggestions.ts should appear as buttons
for (const title of [
"Write a short poem",
"Draft an email",
"Explain quantum computing",
]) {
await expect(page.getByRole("button", { name: title })).toBeVisible({
timeout: 15000,
});
}
});
test("sending a message triggers document streaming", async ({ page }) => {
await expect(page.locator('[data-testid="document-view"]')).toBeVisible({
timeout: 15000,
});
// Send a message via the sidebar
const input = page.getByPlaceholder("Ask me to write something...");
await input.fill("Write a short poem about autumn leaves.");
await input.press("Enter");
// The document-content area should appear as the agent streams tokens
await expect(page.locator('[data-testid="document-content"]')).toBeVisible({
timeout: 60000,
});
// Content should have meaningful length (not empty)
const content = page.locator('[data-testid="document-content"]');
await expect(async () => {
const text = await content.textContent();
expect(text!.length).toBeGreaterThan(10);
}).toPass({ timeout: 60000 });
});
test("character count updates as document streams", async ({ page }) => {
await expect(page.locator('[data-testid="document-view"]')).toBeVisible({
timeout: 15000,
});
const charCount = page.locator('[data-testid="document-char-count"]');
await expect(charCount).toHaveText("0 chars");
// Send a message to trigger streaming
const input = page.getByPlaceholder("Ask me to write something...");
await input.fill("Write a short poem about autumn leaves.");
await input.press("Enter");
// Wait for char count to increase above 0
await expect(async () => {
const text = await charCount.textContent();
const count = parseInt(text!.replace(/\D/g, ""), 10);
expect(count).toBeGreaterThan(0);
}).toPass({ timeout: 60000 });
});
test("live badge appears while agent is streaming", async ({ page }) => {
await expect(page.locator('[data-testid="document-view"]')).toBeVisible({
timeout: 15000,
});
// No live badge before we send anything
await expect(
page.locator('[data-testid="document-live-badge"]'),
).not.toBeVisible();
// Send a message to trigger streaming
const input = page.getByPlaceholder("Ask me to write something...");
await input.fill("Write a short poem about autumn leaves.");
await input.press("Enter");
// The LIVE badge should appear while the agent is running
await expect(
page.locator('[data-testid="document-live-badge"]'),
).toBeVisible({ timeout: 60000 });
});
test("assistant responds in the sidebar chat", async ({ page }) => {
await expect(page.locator('[data-testid="document-view"]')).toBeVisible({
timeout: 15000,
});
const input = page.getByPlaceholder("Ask me to write something...");
await input.fill("Write a short poem about autumn leaves.");
await input.press("Enter");
// The sidebar should show an assistant message
await expect(
page.locator('[data-testid="copilot-assistant-message"]').first(),
).toBeVisible({ timeout: 60000 });
});
});