diff --git a/runtime/tests/runtime-signing.test.mjs b/runtime/tests/runtime-signing.test.mjs index 158085a..6e5a7cf 100644 --- a/runtime/tests/runtime-signing.test.mjs +++ b/runtime/tests/runtime-signing.test.mjs @@ -430,7 +430,7 @@ test("fabricated x402 defaults use v1.1.0", async () => { }); -test("full chain clean -> summarize -> classify verifies with schema using partial x402 defaults", async () => { +test("full chain clean -> summarize -> classify verifies with schema using partial x402 defaults", { timeout: 20000 }, async () => { const keys = makeKeys(); const srv = await startServer({ RECEIPT_SIGNING_PRIVATE_KEY_PEM_B64: keys.privatePemB64, @@ -440,30 +440,62 @@ test("full chain clean -> summarize -> classify verifies with schema using parti }); async function runVerb(base, verb, content) { - const res = await fetch(`${base}/${verb}/v1.1.0`, { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ - x402: { verb, version: "1.1.0" }, - input: { content }, - }), - }); + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 10000); + + try { + const res = await fetch(`${base}/${verb}/v1.1.0`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + x402: { verb, version: "1.1.0" }, + input: { content }, + }), + signal: controller.signal, + }); + + const text = await res.text(); + + if (!res.ok) { + throw new Error(`HTTP ${res.status}: ${text}`); + } - assert.equal(res.status, 200); - return res.json(); + const json = JSON.parse(text); + return json; + + } catch (err) { + const cause = err?.cause?.code || err?.cause || err.message; + throw new Error(`runVerb(${verb}) failed: ${cause}`); + } finally { + clearTimeout(timeout); + } } try { const source = "Hello world. This is a test document. It contains multiple sentences."; + let finalReceipt; + + try { + const clean = await runVerb(srv.base, "clean", source); + + assert.ok(clean?.receipt?.result?.cleaned_content, "clean step missing cleaned_content"); + const cleanText = clean.receipt.result.cleaned_content; - const clean = await runVerb(srv.base, "clean", source); - const cleanText = clean.receipt.result.cleaned_content; + const summarize = await runVerb(srv.base, "summarize", cleanText); - const summarize = await runVerb(srv.base, "summarize", cleanText); - const summary = summarize.receipt.result.summary; + assert.ok(summarize?.receipt?.result?.summary, "summarize step missing summary"); + const summary = summarize.receipt.result.summary; - const classify = await runVerb(srv.base, "classify", summary); - const finalReceipt = classify.receipt; + const classify = await runVerb(srv.base, "classify", summary); + + assert.ok(classify?.receipt, "classify step missing receipt"); + finalReceipt = classify.receipt; + + } catch (err) { + console.error("CHAIN FAILURE DEBUG:"); + console.error(err); + throw err; + } assert.equal(finalReceipt.x402.entry, "x402://classifyagent.eth/classify/v1.1.0"); @@ -474,6 +506,8 @@ test("full chain clean -> summarize -> classify verifies with schema using parti }); const verifyJson = await verifyRes.json(); + console.log("VERIFY RESULT:", verifyJson); + assert.equal(verifyRes.status, 200); assert.equal(verifyJson.checks.signature_valid, true); assert.equal(verifyJson.checks.hash_matches, true);