Files
t8y2--dbx/packages/app-tests/tableColumnTemplates.test.ts
2026-07-13 13:09:14 +08:00

117 lines
5.1 KiB
TypeScript
Vendored

import { strict as assert } from "node:assert";
import { test } from "vitest";
import { createTableColumnTemplateDrafts, DEFAULT_TABLE_COLUMN_TEMPLATE_FIELDS, normalizeTableColumnTemplateFields, parseTableColumnTemplateFields, PRESET_FIELDS_TEMPLATE_ID, tableColumnTemplates, TABLE_COLUMN_TEMPLATE_DATABASE_TYPES } from "../../apps/desktop/src/lib/table/tableColumnTemplates.ts";
const sixCustomFields = [
"tenant_id | mysql:bigint | postgres:uuid | default:0 | comment:Tenant",
"request_id | mysql:varchar(64) | postgres:varchar(64)",
"created_time | mysql:datetime | postgres:timestamp | default:CURRENT_TIMESTAMP",
"modified_time | mysql:datetime | postgres:timestamp",
"creator_id | mysql:bigint | postgres:bigint",
"modifier_id | mysql:bigint | postgres:bigint | required:false",
];
test("has no built-in preset field names by default", () => {
assert.deepEqual(DEFAULT_TABLE_COLUMN_TEMPLATE_FIELDS, []);
assert.deepEqual(normalizeTableColumnTemplateFields(undefined), []);
assert.deepEqual(normalizeTableColumnTemplateFields([]), []);
assert.deepEqual(tableColumnTemplates(), [
{
id: PRESET_FIELDS_TEMPLATE_ID,
labelKey: "structureEditor.presetFieldsTemplate",
columnNames: [],
},
]);
});
test("builds no preset field drafts until users configure fields", () => {
const columns = createTableColumnTemplateDrafts({
templateId: PRESET_FIELDS_TEMPLATE_ID,
databaseType: "postgres",
createId: () => "id",
});
assert.deepEqual(columns, []);
});
test("builds configured preset field drafts", () => {
let id = 0;
const columns = createTableColumnTemplateDrafts({
templateId: PRESET_FIELDS_TEMPLATE_ID,
databaseType: "mysql",
columnNames: sixCustomFields,
createId: () => String(++id),
});
assert.deepEqual(
columns.map((column) => ({
id: column.id,
name: column.name,
dataType: column.dataType,
isNullable: column.isNullable,
defaultValue: column.defaultValue,
comment: column.comment,
})),
[
{ id: "new:1", name: "tenant_id", dataType: "bigint", isNullable: false, defaultValue: "0", comment: "Tenant" },
{ id: "new:2", name: "request_id", dataType: "varchar(64)", isNullable: false, defaultValue: "", comment: "" },
{ id: "new:3", name: "created_time", dataType: "datetime", isNullable: false, defaultValue: "CURRENT_TIMESTAMP", comment: "" },
{ id: "new:4", name: "modified_time", dataType: "datetime", isNullable: false, defaultValue: "", comment: "" },
{ id: "new:5", name: "creator_id", dataType: "bigint", isNullable: false, defaultValue: "", comment: "" },
{ id: "new:6", name: "modifier_id", dataType: "bigint", isNullable: true, defaultValue: "", comment: "" },
],
);
});
test("filters configured fields by current database type", () => {
const columns = createTableColumnTemplateDrafts({
templateId: PRESET_FIELDS_TEMPLATE_ID,
databaseType: "postgres",
columnNames: ["mysql_only | mysql:bigint", "postgres_only | postgres:uuid", "common_name | mysql:<empty> | postgres:<empty>", "common_code | mysql:varchar(64) | postgres:varchar(32)"],
createId: () => "id",
});
assert.deepEqual(
columns.map((column) => ({ name: column.name, dataType: column.dataType })),
[
{ name: "postgres_only", dataType: "uuid" },
{ name: "common_name", dataType: "" },
{ name: "common_code", dataType: "varchar(32)" },
],
);
});
test("normalizes configured preset fields without adding built-in fields", () => {
const [tenantId, requestId] = normalizeTableColumnTemplateFields([" tenant_id | mysql:bigint | postgres:uuid | default:0 ", "tenant_id | mysql:int", "", "request_id | mysql:varchar(64)"]);
assert.equal(tenantId, "tenant_id | mysql:bigint | postgres:uuid | default:0");
assert.equal(requestId, "request_id | mysql:varchar(64)");
const parsed = parseTableColumnTemplateFields(["tenant_id | mysql:bigint | postgres:uuid | nullable:true | default:0 | comment:Tenant"]);
assert.deepEqual(parsed[0], { name: "tenant_id", dataTypesByDatabase: { mysql: "bigint", postgres: "uuid" }, defaultValue: "0", isNullable: true, comment: "Tenant" });
});
test("limits preset field database types to create-table capable SQL structures", () => {
assert.ok(TABLE_COLUMN_TEMPLATE_DATABASE_TYPES.includes("mysql"));
assert.ok(TABLE_COLUMN_TEMPLATE_DATABASE_TYPES.includes("postgres"));
assert.ok(TABLE_COLUMN_TEMPLATE_DATABASE_TYPES.includes("clickhouse"));
assert.ok(!TABLE_COLUMN_TEMPLATE_DATABASE_TYPES.includes("mongodb"));
assert.ok(!TABLE_COLUMN_TEMPLATE_DATABASE_TYPES.includes("redis"));
assert.ok(!TABLE_COLUMN_TEMPLATE_DATABASE_TYPES.includes("elasticsearch"));
assert.ok(!TABLE_COLUMN_TEMPLATE_DATABASE_TYPES.includes("manticoresearch"));
});
test("skips configured preset fields that already exist", () => {
const columns = createTableColumnTemplateDrafts({
templateId: PRESET_FIELDS_TEMPLATE_ID,
databaseType: "mysql",
columnNames: sixCustomFields,
existingColumnNames: ["tenant_id", "MODIFIER_ID"],
createId: () => "x",
});
assert.deepEqual(
columns.map((column) => column.name),
["request_id", "created_time", "modified_time", "creator_id"],
);
});