import { readFileSync } from "node:fs"; import { strict as assert } from "node:assert"; import test from "node:test"; const source = readFileSync("apps/desktop/src/components/structure/TableStructureEditorDialog.vue", "utf8"); const clickhouseSource = readFileSync("crates/dbx-core/src/db/clickhouse_driver.rs", "utf8"); test("column comments can be expanded into a multiline editor", () => { assert.match(source, /PopoverContent/); assert.match(source, /v-model="column\.comment"/); assert.match(source, / { assert.match(source, /const nextColumns = await api\.getColumns/); assert.match(source, /api\s*\n\s*\.listIndexes[\s\S]*\.catch\(\(\) => \[\]\)/); assert.match(source, /api\s*\n\s*\.listForeignKeys[\s\S]*\.catch\(\(\) => \[\]\)/); assert.match(source, /api\s*\n\s*\.listTriggers[\s\S]*\.catch\(\(\) => \[\]\)/); }); test("ClickHouse column metadata preserves comments for structure editing", () => { assert.match(clickhouseSource, /SELECT name, type, default_kind, default_expression, is_in_primary_key, comment/); assert.match(clickhouseSource, /comment:\s*row\.get\(5\)/); }); test("structure editor loads immediately when mounted open", () => { assert.match(source, /watch\(\s*open,[\s\S]*\{\s*immediate:\s*true\s*\},?\s*\)/); }); test("structure editor gates controls through table structure capabilities", () => { assert.match(source, /getTableStructureCapabilities/); assert.match(source, /const structureCapabilities = computed/); assert.match(source, /function isColumnNameDisabled/); assert.match(source, /function isColumnTypeDisabled/); assert.match(source, /function isColumnDefaultDisabled/); assert.match(source, /function isColumnCommentDisabled/); assert.match(source, /function canDropColumn/); assert.match(source, /function canEditIndexDraft/); assert.match(source, /structureCapabilities\.value\.createIndex/); assert.match(source, /structureCapabilities\.value\.dropIndex/); assert.match(source, /structureCapabilities\.value\.indexInclude/); assert.match(source, /structureCapabilities\.value\.indexFilter/); });