Files
WRNexusJS/scripts/test-package-kits.mjs
Clintchiz 586a6db8ff
Quality / quality (ubuntu-latest) (push) Failing after 21s
Quality / quality (windows-latest) (push) Canceled after 0s
release: WRNexusJS 0.8.0
2026-08-02 23:18:51 +05:30

229 lines
7.2 KiB
JavaScript

/* global FormData, Headers, console */
import assert from "node:assert/strict";
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import {
createKeyring,
createMemoryReplayStore,
encryptHttpBody,
decryptHttpBody,
createEncryptedRequest,
encryptResponse,
decryptEncryptedResponse,
} from "../packages/encryption/src/index.ts";
import {
createAccessToken,
createRefreshToken,
verifyAccessToken,
verifyRefreshToken,
hasScopes,
jwtCookie,
createTokenPair,
readJwtCookie,
} from "../packages/jwt/src/index.ts";
import { createDb, createRepository, batch, databaseHealth } from "../packages/db/src/index.ts";
import {
loadLocales,
resolveI18n,
makeT,
resolveLang,
renderI18nData,
} from "../packages/i18n/src/index.ts";
import {
createPicture,
createBlurPlaceholder,
imageCacheKey,
} from "../packages/image/src/index.ts";
import {
createRealtimeMessage,
parseRealtimeMessage,
roomMemberSummary,
} from "../packages/realtime/src/index.ts";
import { captchaFields, captchaHeaders, captchaTokenFrom } from "../packages/captcha/src/index.ts";
import { uploaderAttributes, formatFileSize } from "../packages/uploader/src/index.ts";
import { v, parseOrThrow, validationSummary } from "../packages/validation/src/index.ts";
import { authRoute, authFailure } from "../packages/auth/src/index.ts";
const keyring = createKeyring([
{ id: "active", secret: "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA=", active: true },
]);
const replayStore = createMemoryReplayStore(() => 1_000);
const envelope = await encryptHttpBody(
{ value: 42 },
{
keyring,
method: "POST",
url: "https://example.test/api/items",
requestId: "request-1",
timestamp: 1_000,
},
);
const decrypted = await decryptHttpBody(envelope, {
keyring,
method: "POST",
url: "https://example.test/api/items",
replayStore,
now: () => 1_000,
});
assert.deepEqual(decrypted.body, { value: 42 });
await assert.rejects(
() =>
decryptHttpBody(envelope, {
keyring,
method: "POST",
url: "https://example.test/api/items",
replayStore,
now: () => 1_000,
}),
/REPLAY/,
);
await assert.rejects(
() =>
decryptHttpBody(envelope, {
keyring,
method: "GET",
url: "https://example.test/api/items",
now: () => 1_000,
}),
/CONTEXT/,
);
const encryptedRequest = await createEncryptedRequest(
"https://example.test/api/items",
{ value: 42 },
{ keyring, method: "POST", requestId: "request-2" },
);
const encryptedResponse = await encryptResponse({ ok: true }, encryptedRequest, { keyring });
assert.equal(
(await decryptEncryptedResponse(encryptedResponse, encryptedRequest, { keyring })).body.ok,
true,
);
const secret = "a-secure-jwt-secret-for-package-kit-tests";
const access = await createAccessToken("user-1", secret, {
scopes: ["read", "write"],
now: 100,
expiresIn: 60,
});
const refresh = await createRefreshToken("user-1", secret, {
family: "family-1",
now: 100,
expiresIn: 600,
});
const accessClaims = await verifyAccessToken(access, secret, { now: 120 });
const refreshClaims = await verifyRefreshToken(refresh, secret, { now: 120 });
assert.equal(accessClaims.sub, "user-1");
assert.equal(refreshClaims.type, "refresh");
assert.equal(hasScopes(accessClaims, ["read", "write"]), true);
assert.match(jwtCookie(access), /^__Host-wrn_token=/);
assert.equal(readJwtCookie(`__Host-wrn_token=${access}`), access);
const tokenPair = await createTokenPair("user-1", {
accessSecret: secret,
accessOptions: { now: 100 },
refreshOptions: { now: 100 },
});
assert.equal((await verifyAccessToken(tokenPair.accessToken, secret, { now: 120 })).sub, "user-1");
const queries = [];
const driver = {
dialect: "sqlite",
async query(sql, params = []) {
queries.push({ sql, params });
if (/COUNT/.test(sql)) return [{ count: 2 }];
if (/SELECT 1 AS healthy/.test(sql)) return [{ healthy: 1 }];
return [{ id: 1, name: "One" }];
},
async exec(sql, params = []) {
queries.push({ sql, params });
return { changes: 1, lastInsertId: 1 };
},
async transaction(fn) {
return fn(this);
},
close() {},
};
const db = createDb(driver);
const repository = createRepository(db, { table: "items", allowedColumns: ["name"] });
assert.equal((await repository.find(1)).name, "One");
await repository.create({ name: "Two" });
await repository.update(1, { name: "Changed" });
assert.equal(await repository.count(), 2);
assert.deepEqual(batch([1, 2, 3, 4, 5], 2), [[1, 2], [3, 4], [5]]);
assert.equal((await databaseHealth(db)).ok, true);
assert.ok(queries.some((entry) => /INSERT INTO items/.test(entry.sql)));
assert.throws(() => batch([1, 2], Number.NaN), /finite/);
const localeDir = mkdtempSync(join(tmpdir(), "wrn-i18n-"));
try {
writeFileSync(join(localeDir, "en.json"), JSON.stringify({ common: { hello: "Hello {name}" } }));
mkdirSync(join(localeDir, "fr"));
writeFileSync(join(localeDir, "fr", "common.json"), JSON.stringify({ hello: "Bonjour {name}" }));
const i18n = resolveI18n(loadLocales(localeDir, { strict: true }), {
default: "en",
locales: ["en", "fr"],
});
assert.equal(makeT(i18n, "fr")("common.hello", { name: "Ajay" }), "Bonjour Ajay");
assert.equal(resolveLang(i18n, undefined, "fr;q=0.9,en;q=0.8"), "fr");
assert.equal(resolveLang(i18n, undefined, "*"), "en");
assert.match(renderI18nData(i18n, "fr"), /Bonjour/);
} finally {
rmSync(localeDir, { recursive: true, force: true });
}
const picture = createPicture({
src: "/hero.jpg",
alt: "Hero",
width: 1200,
height: 630,
widths: [480, 768, 1200],
formats: ["avif", "webp"],
});
assert.equal(picture.sources.length, 2);
assert.match(createBlurPlaceholder(), /^data:image\/svg\+xml/);
assert.equal(
imageCacheKey({ src: "/hero.jpg", width: 480 }),
imageCacheKey({ src: "/hero.jpg", width: 480 }),
);
const message = createRealtimeMessage({
type: "message",
room: "support",
data: { text: "Hello" },
});
assert.equal(
parseRealtimeMessage(JSON.stringify(message), { room: "support", allowedTypes: ["message"] })
.room,
"support",
);
assert.throws(
() => parseRealtimeMessage(JSON.stringify(message), { room: "other" }),
/does not match/,
);
assert.deepEqual(
roomMemberSummary([
{ userId: "1", status: "online" },
{ userId: "2", status: "away" },
]),
{ total: 2, online: 1, away: 1, busy: 0 },
);
const form = new FormData();
form.set("wrn-captcha-response", "token");
assert.equal(captchaTokenFrom(form), "token");
assert.deepEqual(captchaFields("token"), { "wrn-captcha-response": "token" });
assert.equal(new Headers(captchaHeaders("token")).get("x-wrn-captcha-token"), "token");
assert.equal(uploaderAttributes({ store: "public", multiple: true })["data-uploader"], "public");
assert.match(formatFileSize(1024), /KB/);
const schema = v.object({ email: v.string().email() });
assert.deepEqual(parseOrThrow(schema, { email: "user@example.com" }), {
email: "user@example.com",
});
assert.deepEqual(validationSummary({ email: "Invalid" }), [{ field: "email", message: "Invalid" }]);
assert.equal(authRoute("signIn", { basePath: "/auth" }), "/auth/sign-in");
assert.equal((await authFailure("invalid", "Invalid").json()).ok, false);
console.log("Package kit runtime probes passed.");