Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:23:53 +08:00

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();
});
});