Skip to content

Commit 372c953

Browse files
adewaleclaude
andcommitted
fix(e2e): Add retry logic for KV eventual consistency in session tests
The session-race.spec.ts E2E tests were failing in CI because they expected session data to be immediately available after creation. Cloudflare KV has eventual consistency, so data may not be available on first read. Added retry logic (3 attempts with 2-second waits) to all tests that verify session data via API: - "loaded session data persists after initial load" - "session data survives rapid page refresh" - "edits made after load are saved correctly" Also added debug logging to help diagnose any future consistency issues. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 6dd03af commit 372c953

File tree

1 file changed

+43
-9
lines changed

1 file changed

+43
-9
lines changed

app/e2e/session-race.spec.ts

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,22 @@ test.describe('Session Loading Race Condition', () => {
9292
await expect(page.locator('.track-row')).toHaveCount(2);
9393

9494
// Verify via API that the session still has correct data
95-
const verifyRes = await request.get(`${API_BASE}/api/sessions/${sessionId}`);
96-
expect(verifyRes.ok()).toBe(true);
95+
// Retry logic for KV eventual consistency
96+
let sessionData;
97+
for (let attempt = 0; attempt < 3; attempt++) {
98+
const verifyRes = await request.get(`${API_BASE}/api/sessions/${sessionId}`);
99+
expect(verifyRes.ok()).toBe(true);
100+
sessionData = await verifyRes.json();
101+
if (sessionData.tracks && sessionData.tracks.length > 0) break;
102+
console.log(`[TEST] Retry ${attempt + 1}: tracks undefined, waiting...`);
103+
await page.waitForTimeout(2000);
104+
}
105+
106+
// Log actual response for debugging
107+
if (!sessionData.tracks) {
108+
console.log('[TEST] Session data after retries:', JSON.stringify(sessionData, null, 2));
109+
}
97110

98-
const sessionData = await verifyRes.json();
99111
expect(sessionData.tracks).toHaveLength(2);
100112
expect(sessionData.tracks[0].id).toBe('race-track-1');
101113
expect(sessionData.tracks[1].id).toBe('race-track-2');
@@ -147,9 +159,20 @@ test.describe('Session Loading Race Condition', () => {
147159
// Should still have 1 track
148160
await expect(page.locator('.track-row')).toHaveCount(1);
149161

150-
// Verify via API
151-
const verifyRes = await request.get(`${API_BASE}/api/sessions/${sessionId}`);
152-
const sessionData = await verifyRes.json();
162+
// Verify via API with retry for KV consistency
163+
let sessionData;
164+
for (let attempt = 0; attempt < 3; attempt++) {
165+
const verifyRes = await request.get(`${API_BASE}/api/sessions/${sessionId}`);
166+
sessionData = await verifyRes.json();
167+
if (sessionData.tracks && sessionData.tracks.length > 0) break;
168+
console.log(`[TEST] Retry ${attempt + 1}: tracks undefined, waiting...`);
169+
await page.waitForTimeout(2000);
170+
}
171+
172+
if (!sessionData.tracks) {
173+
console.log('[TEST] Session data after retries:', JSON.stringify(sessionData, null, 2));
174+
}
175+
153176
expect(sessionData.tracks).toHaveLength(1);
154177
expect(sessionData.tracks[0].id).toBe('refresh-track');
155178
expect(sessionData.tempo).toBe(128);
@@ -208,9 +231,20 @@ test.describe('Session Loading Race Condition', () => {
208231

209232
expect(isActive).toBe(true);
210233

211-
// Also verify via API
212-
const verifyRes = await request.get(`${API_BASE}/api/sessions/${sessionId}`);
213-
const sessionData = await verifyRes.json();
234+
// Also verify via API with retry for KV consistency
235+
let sessionData;
236+
for (let attempt = 0; attempt < 3; attempt++) {
237+
const verifyRes = await request.get(`${API_BASE}/api/sessions/${sessionId}`);
238+
sessionData = await verifyRes.json();
239+
if (sessionData.tracks && sessionData.tracks.length > 0) break;
240+
console.log(`[TEST] Retry ${attempt + 1}: tracks undefined, waiting...`);
241+
await page.waitForTimeout(2000);
242+
}
243+
244+
if (!sessionData.tracks) {
245+
console.log('[TEST] Session data after retries:', JSON.stringify(sessionData, null, 2));
246+
}
247+
214248
expect(sessionData.tracks[0].steps[0]).toBe(true);
215249
});
216250

0 commit comments

Comments
 (0)