Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions apps/e2e/tests/backend/endpoints/api/v1/internal-metrics.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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 () => {
Comment thread
BilalG1 marked this conversation as resolved.
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 });
Comment thread
BilalG1 marked this conversation as resolved.

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);
Comment thread
BilalG1 marked this conversation as resolved.
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 }) => {
Expand Down