mirror of
https://github.com/Youzini-afk/ST-Bionic-Memory-Ecology.git
synced 2026-05-15 14:20:35 +08:00
104 lines
3.4 KiB
JavaScript
104 lines
3.4 KiB
JavaScript
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
AUTHORITY_SESSION_HEADER,
|
|
AuthorityHttpClient,
|
|
AuthorityHttpError,
|
|
} from "../runtime/authority-http-client.js";
|
|
|
|
function jsonResponse(status, payload) {
|
|
return {
|
|
ok: status >= 200 && status < 300,
|
|
status,
|
|
headers: {
|
|
get(name) {
|
|
return String(name || "").toLowerCase() === "content-type" ? "application/json" : "";
|
|
},
|
|
},
|
|
async json() {
|
|
return payload;
|
|
},
|
|
};
|
|
}
|
|
|
|
{
|
|
const calls = [];
|
|
const client = new AuthorityHttpClient({
|
|
baseUrl: "https://authority.example.test/root",
|
|
fetchImpl: async (url, options = {}) => {
|
|
calls.push({ url, options });
|
|
if (url.endsWith("/session/init") && calls.filter((call) => call.url.endsWith("/session/init")).length === 1) {
|
|
return jsonResponse(200, { sessionToken: "old-session" });
|
|
}
|
|
if (url.endsWith("/session/init")) {
|
|
return jsonResponse(200, { sessionToken: "new-session" });
|
|
}
|
|
if (url.endsWith("/data") && options.headers?.[AUTHORITY_SESSION_HEADER] === "old-session") {
|
|
return jsonResponse(401, { code: "session-expired", message: "session expired" });
|
|
}
|
|
if (url.endsWith("/data") && options.headers?.[AUTHORITY_SESSION_HEADER] === "new-session") {
|
|
return jsonResponse(200, { ok: true, value: 42 });
|
|
}
|
|
return jsonResponse(500, { error: "unexpected" });
|
|
},
|
|
});
|
|
const result = await client.requestJson("/data", { session: true, body: { q: 1 } });
|
|
assert.deepEqual(result, { ok: true, value: 42 });
|
|
assert.deepEqual(
|
|
calls.map((call) => [call.url, call.options.headers?.[AUTHORITY_SESSION_HEADER] || ""]),
|
|
[
|
|
["https://authority.example.test/root/session/init", ""],
|
|
["https://authority.example.test/root/data", "old-session"],
|
|
["https://authority.example.test/root/session/init", ""],
|
|
["https://authority.example.test/root/data", "new-session"],
|
|
],
|
|
);
|
|
}
|
|
|
|
{
|
|
const calls = [];
|
|
const client = new AuthorityHttpClient({
|
|
baseUrl: "https://authority.example.test/root",
|
|
fetchImpl: async (url, options = {}) => {
|
|
calls.push({ url, options });
|
|
if (url.endsWith("/session/init")) {
|
|
return jsonResponse(200, { sessionToken: "permission-session" });
|
|
}
|
|
return jsonResponse(403, { code: "permission-denied", message: "permission denied" });
|
|
},
|
|
});
|
|
await assert.rejects(
|
|
() => client.requestJson("/private", { session: true, body: {} }),
|
|
(error) => {
|
|
assert.equal(error instanceof AuthorityHttpError, true);
|
|
assert.equal(error.status, 403);
|
|
assert.equal(error.category, "permission");
|
|
return true;
|
|
},
|
|
);
|
|
assert.equal(calls.filter((call) => call.url.endsWith("/session/init")).length, 1);
|
|
}
|
|
|
|
{
|
|
const client = new AuthorityHttpClient({
|
|
baseUrl: "https://authority.example.test/root",
|
|
timeoutMs: 5,
|
|
fetchImpl: async (_url, options = {}) => await new Promise((_resolve, reject) => {
|
|
options.signal?.addEventListener("abort", () => {
|
|
reject(Object.assign(new Error("aborted"), { name: "AbortError" }));
|
|
}, { once: true });
|
|
}),
|
|
});
|
|
await assert.rejects(
|
|
() => client.requestJson("/slow", { session: false }),
|
|
(error) => {
|
|
assert.equal(error instanceof AuthorityHttpError, true);
|
|
assert.equal(error.category, "timeout");
|
|
assert.equal(error.code, "timeout");
|
|
return true;
|
|
},
|
|
);
|
|
}
|
|
|
|
console.log("authority-http-client tests passed");
|