Skip to content

Commit 23e0b54

Browse files
jodeleeuwclaude
andcommitted
fix: replace polling with direct read in data-emulator log tests
The log increment tests used waitForLog() which polled Firestore in a loop for up to 30s. Under CI load with parallel test files, the combined time for two requests + two polling cycles often exceeded the 30s jest timeout, causing flaky failures. Since writeLog() is awaited inside apiData before the response is sent, the log document is guaranteed to exist by the time saveData() returns. Replace the polling with a simple direct read after a small delay, and remove the now-unused waitForLog helper. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent d412c79 commit 23e0b54

1 file changed

Lines changed: 13 additions & 15 deletions

File tree

functions/src/__tests__/data-emulator.test.js

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,6 @@ const config = {
3030

3131
jest.setTimeout(30000);
3232

33-
async function waitForLog(db, docId, field, expectedValue, timeoutMs = 30000) {
34-
const start = Date.now();
35-
while (Date.now() - start < timeoutMs) {
36-
const doc = await db.collection("logs").doc(docId).get();
37-
if (doc.exists && doc.data()?.[field] === expectedValue) {
38-
return doc;
39-
}
40-
await new Promise((resolve) => setTimeout(resolve, 250));
41-
}
42-
return db.collection("logs").doc(docId).get();
43-
}
4433

4534
beforeAll(async () => {
4635
initializeApp(config);
@@ -78,20 +67,26 @@ describe("apiData", () => {
7867
it("should increment the write request log for the experiment when there is a complete request", async () => {
7968
const db = getFirestore();
8069
await db.collection("logs").doc("testlog").delete();
70+
// writeLog is awaited inside apiData before the response is sent,
71+
// so the log document should exist by the time we get the response.
8172
await saveData({
8273
experimentID: "testlog",
8374
data: "test",
8475
filename: "test",
8576
});
86-
let doc = await waitForLog(db, "testlog", "saveData", 1);
77+
// Small delay to allow Firestore emulator to sync
78+
await new Promise((resolve) => setTimeout(resolve, 500));
79+
let doc = await db.collection("logs").doc("testlog").get();
80+
expect(doc.exists).toBe(true);
8781
expect(doc.data().saveData).toBe(1);
8882

8983
await saveData({
9084
experimentID: "testlog",
9185
data: "test",
9286
filename: "test",
9387
});
94-
doc = await waitForLog(db, "testlog", "saveData", 2);
88+
await new Promise((resolve) => setTimeout(resolve, 500));
89+
doc = await db.collection("logs").doc("testlog").get();
9590
expect(doc.data().saveData).toBe(2);
9691
});
9792

@@ -106,7 +101,9 @@ describe("apiData", () => {
106101
filename: "test",
107102
});
108103

109-
let doc = await waitForLog(db, "data-testexp", "logError", 1);
104+
await new Promise((resolve) => setTimeout(resolve, 500));
105+
let doc = await db.collection("logs").doc("data-testexp").get();
106+
expect(doc.exists).toBe(true);
110107
expect(doc.data().logError).toBe(1);
111108

112109
await db.collection("experiments").doc("data-testexp").set(
@@ -124,7 +121,8 @@ describe("apiData", () => {
124121
filename: "test",
125122
});
126123

127-
doc = await waitForLog(db, "data-testexp", "logError", 2);
124+
await new Promise((resolve) => setTimeout(resolve, 500));
125+
doc = await db.collection("logs").doc("data-testexp").get();
128126
expect(doc.data().logError).toBe(2);
129127

130128
});

0 commit comments

Comments
 (0)