Files
OmniRoute/tests/unit/bun-support.test.ts
Rouzbeh† 7ddbaf69a4 feat(cli): add native Bun backend support and Dockerfile.bun (#11039)
4 — Suporte de backend nativo Bun + Dockerfile.bun multi-stage + fallback dinâmico de driver SQLite (better-sqlite3 prioritário sob Bun, bun:sqlite fallback; Node preservado) + correção de estabilidade do DAST CI smoke.
Validado a fundo (worktree board sobre tip): bun-support 4/4, typecheck:core limpo, dashboard-typecheck OK (220 dentro do baseline), open-sse-typecheck OK (5 pré-existentes), gate de runtime OK sob Node, changelog-integrity OK, file-size/complexity/cognitive/dead-code OK. Verificado que o driver preserva a cadeia Node/falback conforme AGENTS.md; teste bun-support presente. Baselines de typecheck removidos são ratchet honesto (erros não existem mais).
OBS: destravei 2 base-reds do tip neste turno (push direto 7ffa3ef): movi o changelog fragment da #11050 da seção inválida breaking/ para fixes/, e rebaselinei AddApiKeyModal 1067->1073 (crescimento da #11056). Sem isso a #11039 e o resto da fila ficariam vermelhos.
2026-08-21 21:28:43 -03:00

106 lines
3.7 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { getNodeRuntimeSupport } from "../../src/shared/utils/nodeRuntimeSupport.ts";
import { createSyncDriverFactory } from "../../src/lib/db/adapters/driverFactory.ts";
test("getNodeRuntimeSupport detects Bun as a supported runtime", () => {
const originalBun = process.versions.bun;
try {
(process.versions as Record<string, string>).bun = "1.1.20";
const support = getNodeRuntimeSupport("22.0.0");
assert.equal(support.nodeCompatible, true);
assert.equal(support.reason, "supported-bun");
assert.match(support.nodeVersion, /^bun-1\.1\.20/);
assert.match(support.supportedDisplay, /Bun 1\.1\+/);
} finally {
if (originalBun === undefined) {
delete (process.versions as Record<string, string | undefined>).bun;
} else {
process.versions.bun = originalBun;
}
}
});
test("createSyncDriverFactory prefers bun:sqlite built-in driver when running under Bun", () => {
const originalBun = process.versions.bun;
try {
(process.versions as Record<string, string>).bun = "1.1.20";
const dummyBunDb = {
query: () => ({ run: () => ({ changes: 1, lastInsertRowid: 1 }), get: () => null, all: () => [] }),
exec: () => {},
close: () => {},
};
const loader = (modName: string) => {
if (modName === "bun:sqlite") {
return { Database: function DummyBunDatabase() { return dummyBunDb; } };
}
throw new Error(`Unexpected module ${modName}`);
};
const factory = createSyncDriverFactory(loader, () => true);
const adapter = factory(":memory:");
assert.ok(adapter, "Adapter should be created via bun:sqlite");
assert.equal(adapter.driver, "bun:sqlite");
} finally {
if (originalBun === undefined) {
delete (process.versions as Record<string, string | undefined>).bun;
} else {
process.versions.bun = originalBun;
}
}
});
test("createSyncDriverFactory prefers better-sqlite3 when running under Node", () => {
const originalBun = process.versions.bun;
try {
delete (process.versions as Record<string, string | undefined>).bun;
const dummyBetterDb = {
open: true,
name: ":memory:",
inTransaction: false,
prepare: () => ({ run: () => ({ changes: 1, lastInsertRowid: 1 }) }),
exec: () => {},
close: () => {},
};
const loader = (modName: string) => {
if (modName === "better-sqlite3") {
return function DummyBetterSqlite() {
return dummyBetterDb;
};
}
throw new Error(`Unexpected module ${modName}`);
};
const factory = createSyncDriverFactory(loader, () => true);
const adapter = factory(":memory:");
assert.ok(adapter, "Adapter should be created via better-sqlite3");
assert.equal(adapter.driver, "better-sqlite3");
} finally {
if (originalBun === undefined) {
delete (process.versions as Record<string, string | undefined>).bun;
} else {
process.versions.bun = originalBun;
}
}
});
test("resolveNextBuildBundlerFlag automatically disables Turbopack and uses Webpack under Bun", async () => {
const originalBun = process.versions.bun;
try {
(process.versions as Record<string, string>).bun = "1.1.20";
const buildIsolated = await import("../../scripts/build/build-next-isolated.mjs");
assert.equal(buildIsolated.resolveNextBuildBundlerFlag({}), "--webpack");
assert.equal(buildIsolated.resolveNextBuildBundlerFlag({ OMNIROUTE_USE_TURBOPACK: "1" }), "--webpack");
} finally {
if (originalBun === undefined) {
delete (process.versions as Record<string, string | undefined>).bun;
} else {
process.versions.bun = originalBun;
}
}
});