Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 51 additions & 17 deletions runtime/tests/runtime-signing.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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");

Expand All @@ -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);
Expand Down
Loading