forked from CopilotKit/CopilotKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhelpers.ts
More file actions
116 lines (102 loc) · 3.47 KB
/
Copy pathhelpers.ts
File metadata and controls
116 lines (102 loc) · 3.47 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
import { Page } from "@playwright/test";
import { test, expect } from "@playwright/test";
export async function sendChatMessage(page: Page, message: string) {
await page.getByPlaceholder("Type a message...").click();
await page.getByPlaceholder("Type a message...").fill(message);
await page.keyboard.press("Enter");
}
export async function waitForStepsAndEnsureStreaming(page: Page) {
await page.waitForSelector('[data-test-id="progress-steps"]');
console.log("✓ Progress steps container found");
// Track loading → done transitions instead of step appearances
const streamingResult = (await page.evaluate(() => {
return new Promise((resolve) => {
const progressContainer = document.querySelector(
'[data-test-id="progress-steps"]'
);
let doneTransitions = 0;
let transitionTimestamps: number[] = [];
let previousDoneCount = 0;
const checkTransitions = () => {
const currentDoneSteps = document.querySelectorAll(
'[data-test-id="progress-step-item_done"]'
);
const currentDoneCount = currentDoneSteps.length;
const totalSteps = document.querySelectorAll(
'[data-test-id="progress-step-item"]'
).length;
if (currentDoneCount > previousDoneCount) {
doneTransitions++;
transitionTimestamps.push(Date.now());
console.log(
`🔄 STATE TRANSITION: ${previousDoneCount} → ${currentDoneCount} done steps (transition #${doneTransitions})`
);
previousDoneCount = currentDoneCount;
}
// All steps completed
if (currentDoneCount === totalSteps && totalSteps > 0) {
resolve({
doneTransitions,
transitionTimestamps,
totalSteps,
});
return;
}
// Continue checking
setTimeout(checkTransitions, 50); // Fast polling for state changes
};
// Start checking
checkTransitions();
// Timeout after 30 seconds
setTimeout(() => {
resolve({
doneTransitions,
transitionTimestamps,
totalSteps: document.querySelectorAll(
'[data-test-id="progress-step-item"]'
).length,
});
}, 30000);
});
})) as {
doneTransitions: number;
transitionTimestamps: number[];
totalSteps: number;
};
console.log(
`🎯 Streaming result: ${streamingResult.doneTransitions} done transitions`
);
console.log(
`📅 Transition times: ${streamingResult.transitionTimestamps
.map((t) => new Date(t).toISOString())
.join(", ")}`
);
if (streamingResult.doneTransitions <= 1) {
console.log(
`❌ STREAMING FAILED: Only ${streamingResult.doneTransitions} state transition detected`
);
} else {
console.log(
`✅ STREAMING SUCCESS: ${streamingResult.doneTransitions} separate state transitions detected`
);
}
expect(streamingResult.doneTransitions).toBeGreaterThan(1);
}
export async function waitForResponse(page: Page) {
await page.waitForSelector('[data-test-id="copilot-chat-ready"]');
}
export async function waitForSuggestions(page: Page) {
// Wait for at least one suggestion to be visible
await page.waitForFunction(
() => {
const suggestions = document.querySelectorAll(
'[data-test-id="suggestion"]'
);
return (
suggestions.length > 0 &&
Array.from(suggestions).every((el) => el.isConnected)
);
},
{ timeout: 20000 }
);
}