b3a7f98e5a
CI / E2E Cloudflare (4/8) (push) Failing after 0s
CI / E2E Cloudflare (8/8) (push) Failing after 1s
CI / Lint (push) Failing after 1s
Auto Extract / Extract (push) Failing after 4s
CI / Version Check (push) Failing after 9s
CI / Integration Tests (push) Failing after 1s
CI / E2E tests (1/8) (push) Failing after 1s
CI / E2E tests (2/8) (push) Failing after 2s
CI / E2E tests (3/8) (push) Failing after 2s
CI / Browser Tests (push) Failing after 1s
CI / E2E tests (5/8) (push) Failing after 1s
CI / E2E Cloudflare (2/8) (push) Failing after 2s
CI / Typecheck (push) Failing after 1s
CI / Changeset Validation (push) Failing after 2s
CI / E2E Cloudflare (5/8) (push) Failing after 1s
CI / E2E Cloudflare (6/8) (push) Failing after 1s
CI / E2E Cloudflare (7/8) (push) Failing after 1s
CodeQL / Analyze (javascript-typescript) (push) Failing after 1s
Format / Format (push) Failing after 0s
CodeQL / Analyze (actions) (push) Failing after 4s
CI / E2E tests (4/8) (push) Failing after 1s
CI / E2E tests (6/8) (push) Failing after 1s
CI / E2E tests (7/8) (push) Failing after 2s
CI / E2E tests (8/8) (push) Failing after 1s
CI / E2E Cloudflare (1/8) (push) Failing after 1s
CI / E2E Cloudflare (3/8) (push) Failing after 2s
Preview Releases / Publish Preview (push) Failing after 0s
zizmor / Run zizmor (push) Failing after 1s
Release / Release (push) Failing after 2s
CI / Smoke Tests (push) Failing after 5m36s
CI / Tests (push) Failing after 6m36s
Release / Sync Templates (push) Has been skipped
CI / E2E Tests (push) Has been cancelled
35 lines
1.6 KiB
TypeScript
35 lines
1.6 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
|
|
// `after()` lazily imports this virtual module (provided by the Astro
|
|
// integration at build time, absent in unit tests). Stub it so the lazy
|
|
// import resolves cleanly to a no-op lifetime extender.
|
|
vi.mock("virtual:emdash/wait-until", () => ({ waitUntil: undefined }));
|
|
|
|
import { resolveSessionUser } from "../../../src/astro/session-user.js";
|
|
|
|
describe("resolveSessionUser", () => {
|
|
it("returns the session user when the read resolves", async () => {
|
|
const session = { get: vi.fn(async () => ({ id: "user_1" })) };
|
|
await expect(resolveSessionUser(session)).resolves.toEqual({ id: "user_1" });
|
|
expect(session.get).toHaveBeenCalledWith("user");
|
|
});
|
|
|
|
it("returns undefined when there is no session", async () => {
|
|
await expect(resolveSessionUser(undefined)).resolves.toBeUndefined();
|
|
});
|
|
|
|
// The core #1274 guarantee: a read that never settles (a workerd context
|
|
// cancelled mid-read) must not hang — the timeout backstop resolves it.
|
|
it("falls back to undefined instead of hanging when the read never settles", async () => {
|
|
const session = { get: () => new Promise<{ id: string }>(() => {}) };
|
|
await expect(resolveSessionUser(session, 20)).resolves.toBeUndefined();
|
|
});
|
|
|
|
// Fail-closed: a rejecting read resolves to undefined (caller treats the
|
|
// request as unauthenticated) rather than throwing.
|
|
it("fails closed to undefined when the read rejects", async () => {
|
|
const session = { get: () => Promise.reject(new Error("boom")) };
|
|
await expect(resolveSessionUser(session, 20)).resolves.toBeUndefined();
|
|
});
|
|
});
|