Files
wehub-resource-sync 70bf21e064
Deploy (to testing) and Test Playground Preview Worker / Deploy Playground Preview Worker (testing) (push) Has been skipped
Deploy Workers Shared Staging / Deploy Workers Shared Staging (push) Failing after 0s
Prerelease / build (push) Has been skipped
Handle Changesets / Handle Changesets (push) Has been cancelled
Semgrep OSS scan / semgrep-oss (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:11 +08:00

149 lines
3.8 KiB
TypeScript

import { describe, it } from "vitest";
import { getPlatformProxy } from "./shared";
describe("getPlatformProxy - ctx", () => {
it("should provide a no-op waitUntil method", async ({ expect }) => {
const { ctx, dispose } = await getPlatformProxy();
try {
let value = 4;
ctx.waitUntil(
new Promise((resolve) => {
value++;
resolve(value);
})
);
expect(value).toBe(5);
} finally {
await dispose();
}
});
it("should provide a no-op passThroughOnException method", async ({
expect,
}) => {
const { ctx, dispose } = await getPlatformProxy();
try {
expect(ctx.passThroughOnException()).toBe(undefined);
} finally {
await dispose();
}
});
it("should match the production runtime ctx object", async ({ expect }) => {
const { ctx, dispose } = await getPlatformProxy();
try {
expect(ctx.constructor.name).toBe("ExecutionContext");
expect(typeof ctx.waitUntil).toBe("function");
expect(typeof ctx.passThroughOnException).toBe("function");
expect(ctx.props).toEqual({});
ctx.waitUntil = ((str: string) => `- ${str} -`) as any;
expect(ctx.waitUntil("waitUntil can be overridden" as any)).toBe(
"- waitUntil can be overridden -"
);
ctx.passThroughOnException = ((str: string) => `_ ${str} _`) as any;
expect(
(ctx.passThroughOnException as any)(
"passThroughOnException can be overridden"
)
).toBe("_ passThroughOnException can be overridden _");
(ctx as any).text = "the ExecutionContext can be extended";
expect((ctx as any).text).toBe("the ExecutionContext can be extended");
} finally {
await dispose();
}
});
describe("detached methods should behave like workerd", () => {
it("destructured methods should throw illegal invocation errors", async ({
expect,
}) => {
const {
ctx: { waitUntil, passThroughOnException },
dispose,
} = await getPlatformProxy();
try {
expect(() => {
waitUntil(new Promise(() => {}));
}).toThrow("Illegal invocation");
expect(() => {
passThroughOnException();
}).toThrow("Illegal invocation");
} finally {
await dispose();
}
});
it("extracted methods should throw illegal invocation errors", async ({
expect,
}) => {
const { ctx, dispose } = await getPlatformProxy();
const waitUntil = ctx.waitUntil;
const passThroughOnException = ctx.passThroughOnException;
try {
expect(() => {
waitUntil(new Promise(() => {}));
}).toThrow("Illegal invocation");
expect(() => {
passThroughOnException();
}).toThrow("Illegal invocation");
} finally {
await dispose();
}
});
it("extracted methods which correctly bind this should not throw illegal invocation errors", async ({
expect,
}) => {
const { ctx, dispose } = await getPlatformProxy();
const waitUntil = ctx.waitUntil.bind(ctx);
const passThroughOnException = ctx.passThroughOnException;
try {
expect(() => {
waitUntil(new Promise(() => {}));
}).not.toThrow("Illegal invocation");
expect(() => {
passThroughOnException.apply(ctx, []);
}).not.toThrow("Illegal invocation");
expect(() => {
passThroughOnException.call(ctx);
}).not.toThrow("Illegal invocation");
} finally {
await dispose();
}
});
it("extracted methods which incorrectly bind this should throw illegal invocation errors", async ({
expect,
}) => {
const { ctx, dispose } = await getPlatformProxy();
const waitUntil = ctx.waitUntil.bind({});
const passThroughOnException = ctx.passThroughOnException;
try {
expect(() => {
waitUntil(new Promise(() => {}));
}).toThrow("Illegal invocation");
expect(() => {
passThroughOnException.apply(5, []);
}).toThrow("Illegal invocation");
expect(() => {
passThroughOnException.call(new Boolean());
}).toThrow("Illegal invocation");
} finally {
await dispose();
}
});
});
});