fix service gateway deadlines and roleplay controls
This commit is contained in:
32
scripts/deadline-hierarchy.test.ts
Normal file
32
scripts/deadline-hierarchy.test.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { INTERACTIVE_SERVICE_TIMEOUT_MS, serviceJson, roleplayService } from "../src/services/product-service-clients.js";
|
||||
|
||||
assert.equal(INTERACTIVE_SERVICE_TIMEOUT_MS, 240_000, "interactive service deadline must stay inside the 300s proxy budget");
|
||||
|
||||
const originalFetch = globalThis.fetch;
|
||||
const originalTimeout = AbortSignal.timeout;
|
||||
const requests: Request[] = [];
|
||||
let capturedTimeout = 0;
|
||||
AbortSignal.timeout = ((ms: number) => {
|
||||
capturedTimeout = ms;
|
||||
return new AbortController().signal;
|
||||
}) as typeof AbortSignal.timeout;
|
||||
globalThis.fetch = (async (input, init) => {
|
||||
const request = new Request(input, init);
|
||||
requests.push(request);
|
||||
return new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "content-type": "application/json" } });
|
||||
}) as typeof fetch;
|
||||
try {
|
||||
await roleplayService.plan("session-1", "user-1");
|
||||
assert.equal(new URL(requests[0]!.url).pathname, "/api/v1/roleplays/sessions/session-1/plan");
|
||||
assert.equal(capturedTimeout, INTERACTIVE_SERVICE_TIMEOUT_MS, "interactive plan calls must use the inner deadline");
|
||||
|
||||
requests.length = 0;
|
||||
capturedTimeout = 0;
|
||||
await serviceJson("http://service.test", "/slow", { timeoutMs: 17 });
|
||||
assert.equal(capturedTimeout, 17);
|
||||
} finally {
|
||||
AbortSignal.timeout = originalTimeout;
|
||||
globalThis.fetch = originalFetch;
|
||||
}
|
||||
console.log("deadline hierarchy tests passed");
|
||||
@@ -12,9 +12,13 @@ globalThis.fetch = (async (input, init) => {
|
||||
? { drafts: [{ session_id: "draft-1" }] }
|
||||
: url.pathname.endsWith("/plan")
|
||||
? { session_id: "draft-1", status: "draft" }
|
||||
: url.pathname.endsWith("/configure/approve")
|
||||
? { session_id: "draft-1", status: "configured", approved: true }
|
||||
: { deleted: true, session_id: "draft-1" };
|
||||
: url.pathname.endsWith("/video-usage")
|
||||
? { used: 1, limit: 3, remaining: 2 }
|
||||
: url.pathname.endsWith("/vip-check")
|
||||
? { valid: true }
|
||||
: url.pathname.endsWith("/configure/approve")
|
||||
? { session_id: "draft-1", status: "configured", approved: true }
|
||||
: { deleted: true, session_id: "draft-1" };
|
||||
return new Response(JSON.stringify(body), {
|
||||
status: 200,
|
||||
headers: { "content-type": "application/json" },
|
||||
@@ -42,13 +46,16 @@ try {
|
||||
assert.equal(deleted.status, 200);
|
||||
assert.deepEqual(await deleted.json(), { deleted: true, session_id: "draft-1" });
|
||||
|
||||
assert.equal(requests.length, 4);
|
||||
assert.match(requests[0]!.url, /\/api\/v1\/roleplays\/drafts\?user_id=user_test&limit=25$/);
|
||||
assert.match(requests[1]!.url, /\/api\/v1\/roleplays\/sessions\/draft-1\/plan$/);
|
||||
assert.match(requests[2]!.url, /\/api\/v1\/roleplays\/configure\/approve$/);
|
||||
assert.equal(requests[3]!.method, "DELETE");
|
||||
assert.match(requests[3]!.url, /\/api\/v1\/roleplays\/drafts\/draft-1$/);
|
||||
for (const request of requests) {
|
||||
const usage = await app.request("http://backend.test/roleplay/video-usage");
|
||||
assert.equal(usage.status, 200);
|
||||
assert.deepEqual(await usage.json(), { used: 1, limit: 3, remaining: 2 });
|
||||
const vip = await app.request("http://backend.test/roleplay/vip-check?code=grow26");
|
||||
assert.equal(vip.status, 200);
|
||||
assert.deepEqual(await vip.json(), { valid: true });
|
||||
assert.match(requests.find((request) => request.url.includes("/api/v1/roleplays/vip-check"))?.url ?? "", /code=grow26&user_id=user_test$/);
|
||||
assert.match(requests.find((request) => request.url.includes("/api/v1/roleplays/video-usage"))?.url ?? "", /\/api\/v1\/roleplays\/video-usage\?user_id=user_test$/);
|
||||
assert.ok(requests.length >= 5);
|
||||
for (const request of requests.filter((request) => request.url.includes("/api/v1/"))) {
|
||||
assert.equal(request.headers.get("x-growqr-user"), "user_test");
|
||||
assert.match(request.headers.get("authorization") ?? "", /^Bearer /);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user