195 lines
4.6 KiB
TypeScript
Vendored
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]);
|
|
});
|