diff --git a/apps/e2e/tests/backend/endpoints/api/v1/internal-metrics.test.ts b/apps/e2e/tests/backend/endpoints/api/v1/internal-metrics.test.ts index efc718c648..affde77d4e 100644 --- a/apps/e2e/tests/backend/endpoints/api/v1/internal-metrics.test.ts +++ b/apps/e2e/tests/backend/endpoints/api/v1/internal-metrics.test.ts @@ -2,6 +2,7 @@ import { wait } from "@stackframe/stack-shared/dist/utils/promises"; import { expect } from "vitest"; import { NiceResponse, it } from "../../../../helpers"; import { Auth, InternalApiKey, Project, backendContext, createMailbox, niceBackendFetch } from "../../../backend-helpers"; +import { Result } from "@stackframe/stack-shared/dist/utils/results"; async function ensureAnonymousUsersAreStillExcluded(metricsResponse: NiceResponse) { for (let i = 0; i < 2; i++) { @@ -125,29 +126,38 @@ it("should exclude anonymous users from metrics", async ({ expect }) => { await Auth.Anonymous.signUp(); } - await wait(3000); // the event log is async, so let's give it some time to be written to the DB + // the event log is async, so let's give it some time to be written to the DB + const result = await Result.retry(async () => { + const response = await niceBackendFetch("/api/v1/internal/metrics", { accessType: 'admin' }); + if (JSON.stringify(response.body) === JSON.stringify(beforeMetrics.body)) { + return Result.ok(response); + } + return Result.error(response); + }, 5, { exponentialDelayBase: 200 }); - const response = await niceBackendFetch("/api/v1/internal/metrics", { accessType: 'admin' }); - expect(beforeMetrics.body).toEqual(response.body); + if (result.status === "error") { + expect(beforeMetrics.body).toEqual(result.error); + throw new Error("Metrics response mismatch, should never be reached"); + } // Verify that total_users only counts the 1 regular user, not the anonymous ones - expect(response.body.total_users).toBe(1); + expect(result.data.body.total_users).toBe(1); // Verify anonymous users don't appear in recently_registered - expect(response.body.recently_registered.length).toBe(1); - expect(response.body.recently_registered.every((user: any) => !user.is_anonymous)).toBe(true); + expect(result.data.body.recently_registered.length).toBe(1); + expect(result.data.body.recently_registered.every((user: any) => !user.is_anonymous)).toBe(true); // Verify anonymous users don't appear in recently_active - expect(response.body.recently_active.every((user: any) => !user.is_anonymous)).toBe(true); + expect(result.data.body.recently_active.every((user: any) => !user.is_anonymous)).toBe(true); // Verify anonymous users aren't counted in daily_users - const lastDayUsers = response.body.daily_users[response.body.daily_users.length - 1]; + const lastDayUsers = result.data.body.daily_users[result.data.body.daily_users.length - 1]; expect(lastDayUsers.activity).toBe(1); // Verify users_by_country only includes regular users - expect(response.body.users_by_country["US"]).toBe(1); + expect(result.data.body.users_by_country["US"]).toBe(1); - await ensureAnonymousUsersAreStillExcluded(response); + await ensureAnonymousUsersAreStillExcluded(result.data); }); it("should handle anonymous users with activity correctly", async ({ expect }) => {