dbx/tests/databaseExport.test.ts

97 lines
2.6 KiB
TypeScript

import { strict as assert } from "node:assert";
import test from "node:test";
import {
DATABASE_EXPORT_INSERT_BATCH_SIZE,
DATABASE_EXPORT_ROW_LIMIT,
buildExportPageSql,
buildDatabaseSqlExport,
buildInsertStatements,
formatSqlLiteral,
} from "../src/lib/databaseExport.ts";
test("formats SQL literals for exported INSERT statements", () => {
assert.equal(formatSqlLiteral(null), "NULL");
assert.equal(formatSqlLiteral(42), "42");
assert.equal(formatSqlLiteral(true), "TRUE");
assert.equal(formatSqlLiteral("O'Hara"), "'O''Hara'");
});
test("builds batched INSERT statements for one exported table", () => {
const statements = buildInsertStatements({
qualifiedTableName: "`users`",
columns: ["id", "name"],
rows: [
[1, "Ada"],
[2, "O'Hara"],
[3, "Linus"],
],
quoteIdentifier: (name) => `\`${name}\``,
batchSize: 2,
});
assert.deepEqual(statements, [
"INSERT INTO `users` (`id`, `name`) VALUES (1, 'Ada'), (2, 'O''Hara');",
"INSERT INTO `users` (`id`, `name`) VALUES (3, 'Linus');",
]);
});
test("builds capped export page queries", () => {
assert.equal(
buildExportPageSql({
databaseType: "mysql",
tableName: "users",
limit: 500,
offset: 1000,
}),
"SELECT * FROM `users` LIMIT 500 OFFSET 1000;",
);
assert.equal(
buildExportPageSql({
databaseType: "sqlserver",
schema: "dbo",
tableName: "accounts",
limit: DATABASE_EXPORT_ROW_LIMIT,
}),
`SELECT * FROM [dbo].[accounts] ORDER BY (SELECT NULL) OFFSET 0 ROWS FETCH NEXT ${DATABASE_EXPORT_ROW_LIMIT} ROWS ONLY`,
);
});
test("builds a database SQL export with DDL before data", () => {
const sql = buildDatabaseSqlExport({
databaseName: "app",
exportedAt: new Date("2026-05-02T00:00:00.000Z"),
rowLimitPerTable: DATABASE_EXPORT_ROW_LIMIT,
tables: [
{
displayName: "users",
qualifiedTableName: "`users`",
ddl: "CREATE TABLE `users` (`id` int);",
columns: ["id"],
rows: [[1]],
truncated: true,
},
],
quoteIdentifier: (name) => `\`${name}\``,
insertBatchSize: DATABASE_EXPORT_INSERT_BATCH_SIZE,
});
assert.equal(
sql,
[
"-- DBX database export",
"-- Database: app",
"-- Exported at: 2026-05-02T00:00:00.000Z",
`-- Row limit per table: ${DATABASE_EXPORT_ROW_LIMIT}`,
"",
"-- Structure for users",
"CREATE TABLE `users` (`id` int);",
"",
"-- Data for users",
`-- Exported rows: 1 (truncated at ${DATABASE_EXPORT_ROW_LIMIT})`,
"INSERT INTO `users` (`id`) VALUES (1);",
"",
].join("\n"),
);
});