Files
openclaw/test/scripts/check-sqlite-transaction-boundary.test.ts
Peter Steinberger c70aee247e refactor(scripts): migrate JavaScript tools to TypeScript (#121005)
* refactor(scripts): migrate JavaScript tools to TypeScript

* fix(ci): keep changed-scope preflight zero-install

* fix(ci): preserve zero-install script owners

* fix(ci): complete script migration follow-through

* fix(release): keep stable closeout zero-install

* fix(scripts): preserve standalone execution boundaries

* fix(scripts): repair standalone loader boundaries

* fix(scripts): normalize gateway observation ids

* fix(scripts): keep Docker packager standalone

* test(scripts): preserve rebase cleanup helpers

* test(sessions): use tracked temp directory
2026-08-09 07:21:35 -07:00

106 lines
3.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { findSqliteTransactionBoundaryViolations } from "../../scripts/check-sqlite-transaction-boundary.mts";
describe("SQLite transaction boundary guard", () => {
it("rejects removed async transaction primitives", () => {
expect(
findSqliteTransactionBoundaryViolations(`
import { runSqliteImmediateTransactionAsync } from "./sqlite-transaction.js";
export async function runOpenClawAgentWriteTransactionAsync() {}
await database.runSqliteImmediateTransactionAsync(async () => undefined);
`),
).toEqual([
{
line: 2,
reason:
'imports removed async SQLite transaction primitive "runSqliteImmediateTransactionAsync"',
},
{
line: 3,
reason:
'declares removed async SQLite transaction primitive "runOpenClawAgentWriteTransactionAsync"',
},
{
line: 4,
reason:
'calls removed async SQLite transaction primitive "runSqliteImmediateTransactionAsync"',
},
]);
});
it("rejects inline async callbacks passed to synchronous transaction helpers", () => {
expect(
findSqliteTransactionBoundaryViolations(`
runSqliteImmediateTransactionSync(db, async () => await prepare());
runOpenClawAgentWriteTransaction(async (database) => await write(database), options);
runOpenClawStateWriteTransaction(async (database) => await write(database));
`),
).toEqual([
{
line: 2,
reason:
'passes an async callback to synchronous SQLite transaction helper "runSqliteImmediateTransactionSync"',
},
{
line: 3,
reason:
'passes an async callback to synchronous SQLite transaction helper "runOpenClawAgentWriteTransaction"',
},
{
line: 4,
reason:
'passes an async callback to synchronous SQLite transaction helper "runOpenClawStateWriteTransaction"',
},
]);
});
it("rejects local async function references passed as callbacks", () => {
expect(
findSqliteTransactionBoundaryViolations(`
async function writeRows() {}
const writeAgentRows = async () => undefined;
runSqliteImmediateTransactionSync(db, writeRows);
runOpenClawAgentWriteTransaction(writeAgentRows, options);
`),
).toEqual([
{
line: 4,
reason:
'passes an async callback to synchronous SQLite transaction helper "runSqliteImmediateTransactionSync"',
},
{
line: 5,
reason:
'passes an async callback to synchronous SQLite transaction helper "runOpenClawAgentWriteTransaction"',
},
]);
});
it("tracks aliases of synchronous transaction imports", () => {
expect(
findSqliteTransactionBoundaryViolations(`
import { runSqliteImmediateTransactionSync as transact } from "./sqlite-transaction.js";
transact(db, async () => undefined);
`),
).toEqual([
{
line: 3,
reason:
'passes an async callback to synchronous SQLite transaction helper "runSqliteImmediateTransactionSync"',
},
]);
});
it("allows asynchronous preparation followed by a synchronous commit callback", () => {
expect(
findSqliteTransactionBoundaryViolations(`
const prepared = await prepareMutation();
runOpenClawAgentWriteTransaction((database) => {
validate(database, prepared.expected);
apply(database, prepared.patch);
}, options);
`),
).toEqual([]);
});
});