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

195 lines
4.6 KiB
TypeScript
Vendored

import { strict as assert } from "node:assert";
import { test } from "vitest";
import { coerceDataGridCellValue, dataGridCellDisplayText, dataGridCellEditorText } from "../../apps/desktop/src/lib/dataGrid/dataGridCellCoercion.ts";
test("formats Postgres array cells with native brace syntax", () => {
const columnInfo = { data_type: "_text" };
assert.equal(
dataGridCellDisplayText({
value: ["draft", "发布", "needs space"],
databaseType: "postgres",
columnInfo,
}),
'{draft,发布,"needs space"}',
);
assert.equal(
dataGridCellEditorText({
value: ["draft", "发布", "needs space"],
databaseType: "postgres",
columnInfo,
}),
'{draft,发布,"needs space"}',
);
});
test("coerces JSON style input for Postgres array columns", () => {
assert.deepEqual(
coerceDataGridCellValue({
value: `["draft","发布"]`,
oldValue: "{legacy}",
databaseType: "postgres",
columnInfo: { data_type: "_text" },
}),
["draft", "发布"],
);
});
test("coerces PG brace-style input for Postgres array columns", () => {
assert.deepEqual(
coerceDataGridCellValue({
value: "{1,2,3}",
oldValue: [1, 2, 3],
databaseType: "postgres",
columnInfo: { data_type: "_int4" },
}),
[1, 2, 3],
);
});
test("preserves high precision numeric edits as text", () => {
assert.equal(
coerceDataGridCellValue({
value: "144847503924137986",
oldValue: 142189065666650,
databaseType: "sqlserver",
columnInfo: { data_type: "bigint" },
}),
"144847503924137986",
);
assert.equal(
coerceDataGridCellValue({
value: "12345678901234567890123456789012345678",
oldValue: 1,
databaseType: "postgres",
columnInfo: { data_type: "numeric(38,0)" },
}),
"12345678901234567890123456789012345678",
);
});
test("keeps safe numeric edits on the existing number path", () => {
assert.equal(
coerceDataGridCellValue({
value: "42",
oldValue: 1,
databaseType: "sqlserver",
columnInfo: { data_type: "int" },
}),
42,
);
assert.strictEqual(
coerceDataGridCellValue({
value: "42",
oldValue: 42,
databaseType: "sqlserver",
columnInfo: { data_type: "bigint" },
}),
42,
);
});
test("coerces PG brace-style string array", () => {
assert.deepEqual(
coerceDataGridCellValue({
value: `{draft,"needs space",发布}`,
oldValue: [],
databaseType: "postgres",
columnInfo: { data_type: "_text" },
}),
["draft", "needs space", "发布"],
);
});
test("preserves high precision numeric tokens in Postgres arrays", () => {
assert.deepEqual(
coerceDataGridCellValue({
value: "{144847503924137986,2}",
oldValue: [],
databaseType: "postgres",
columnInfo: { data_type: "_int8" },
}),
["144847503924137986", 2],
);
});
test("coerces PG brace-style array with NULL", () => {
assert.deepEqual(
coerceDataGridCellValue({
value: "{1,NULL,3}",
oldValue: [],
databaseType: "postgres",
columnInfo: { data_type: "_int4" },
}),
[1, null, 3],
);
});
test("coerces empty PG brace-style array", () => {
assert.deepEqual(
coerceDataGridCellValue({
value: "{}",
oldValue: [],
databaseType: "postgres",
columnInfo: { data_type: "_int4" },
}),
[],
);
});
test("PG array round-trip: format -> coerce -> same values", () => {
const original = ["draft", "发布", "needs space"];
const columnInfo = { data_type: "_text" };
const formatted = dataGridCellEditorText({
value: original,
databaseType: "postgres",
columnInfo,
});
const coerced = coerceDataGridCellValue({
value: formatted,
oldValue: undefined,
databaseType: "postgres",
columnInfo,
});
assert.deepEqual(coerced as string[], original);
});
test("unchanged PG array value returns oldValue reference to avoid false dirty", () => {
const oldValue = [1, 2, 3];
const formatted = dataGridCellEditorText({
value: oldValue,
databaseType: "postgres",
columnInfo: { data_type: "_int4" },
});
const result = coerceDataGridCellValue({
value: formatted,
oldValue,
databaseType: "postgres",
columnInfo: { data_type: "_int4" },
});
assert.strictEqual(result, oldValue);
});
test("changed PG array value returns new array reference", () => {
const oldValue = [1, 2, 3];
const newText = "{1,2,3,4}";
const result = coerceDataGridCellValue({
value: newText,
oldValue,
databaseType: "postgres",
columnInfo: { data_type: "_int4" },
});
assert.notStrictEqual(result, oldValue);
assert.deepEqual(result, [1, 2, 3, 4]);
});