Files
MyGoNavi/frontend/src/utils/rowLocator.test.ts
tianqijiuyun-latiao 5fc29a6fd3 feat(i18n): 推进多语言剩余切片闭环
- 补齐 DataGrid、DataViewer、DefinitionViewer、JVM 等模块多语言文案与回归测试
- 收口 JVM 前后端展示、诊断、监控和资源呈现相关多语言路径
- 更新六语言共享词典并保留 raw 边界
2026-06-16 12:40:33 +08:00

158 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from 'vitest';
import {
ORACLE_ROWID_LOCATOR_COLUMN,
filterHiddenLocatorColumns,
resolveEditRowLocator,
resolveRowLocatorValues,
} from './rowLocator';
const uniqueIndex = (name: string, columnName: string, seqInIndex = 1) => ({
name,
columnName,
seqInIndex,
nonUnique: 0,
indexType: 'BTREE',
});
const normalIndex = (name: string, columnName: string, seqInIndex = 1) => ({
name,
columnName,
seqInIndex,
nonUnique: 1,
indexType: 'BTREE',
});
describe('resolveEditRowLocator', () => {
it('prefers primary keys over unique indexes', () => {
expect(resolveEditRowLocator({
dbType: 'mysql',
resultColumns: ['ID', 'EMAIL'],
primaryKeys: ['ID'],
indexes: [uniqueIndex('uk_email', 'EMAIL')],
})).toEqual({
strategy: 'primary-key',
columns: ['ID'],
valueColumns: ['ID'],
readOnly: false,
});
});
it('uses a unique index when there is no primary key', () => {
expect(resolveEditRowLocator({
dbType: 'mysql',
resultColumns: ['EMAIL', 'NAME'],
indexes: [uniqueIndex('uk_email', 'EMAIL')],
})).toEqual({
strategy: 'unique-key',
columns: ['EMAIL'],
valueColumns: ['EMAIL'],
readOnly: false,
});
});
it('sorts composite unique index columns by sequence', () => {
expect(resolveEditRowLocator({
dbType: 'postgres',
resultColumns: ['TENANT_ID', 'CODE', 'NAME'],
indexes: [
uniqueIndex('uk_tenant_code', 'CODE', 2),
uniqueIndex('uk_tenant_code', 'TENANT_ID', 1),
],
})).toMatchObject({
strategy: 'unique-key',
columns: ['TENANT_ID', 'CODE'],
valueColumns: ['TENANT_ID', 'CODE'],
readOnly: false,
});
});
it('ignores non-unique indexes', () => {
expect(resolveEditRowLocator({
dbType: 'mysql',
resultColumns: ['NAME'],
indexes: [normalIndex('idx_name', 'NAME')],
})).toMatchObject({
strategy: 'none',
readOnly: true,
});
});
it('keeps results read-only when primary key columns are missing from result columns', () => {
expect(resolveEditRowLocator({
dbType: 'oracle',
resultColumns: ['NAME'],
primaryKeys: ['ID'],
})).toMatchObject({
strategy: 'none',
readOnly: true,
reason: '结果集中缺少主键列 ID无法安全提交修改。',
});
});
it('uses Oracle ROWID when no primary or unique key is available', () => {
expect(resolveEditRowLocator({
dbType: 'oracle',
resultColumns: ['NAME', ORACLE_ROWID_LOCATOR_COLUMN],
allowOracleRowID: true,
})).toEqual({
strategy: 'oracle-rowid',
columns: ['ROWID'],
valueColumns: [ORACLE_ROWID_LOCATOR_COLUMN],
hiddenColumns: [ORACLE_ROWID_LOCATOR_COLUMN],
readOnly: false,
});
});
});
describe('resolveRowLocatorValues', () => {
it('extracts locator values from the original row', () => {
const locator = resolveEditRowLocator({
dbType: 'mysql',
resultColumns: ['EMAIL', 'NAME'],
indexes: [uniqueIndex('uk_email', 'EMAIL')],
});
expect(resolveRowLocatorValues(locator, { EMAIL: 'a@example.com', NAME: 'A' })).toEqual({
ok: true,
values: { EMAIL: 'a@example.com' },
});
});
it('rejects nullable unique locator values', () => {
const locator = resolveEditRowLocator({
dbType: 'mysql',
resultColumns: ['EMAIL', 'NAME'],
indexes: [uniqueIndex('uk_email', 'EMAIL')],
});
expect(resolveRowLocatorValues(locator, { EMAIL: null, NAME: 'A' }, {
emptyLocatorValue: (column) => `Locator column ${column} is empty, so changes cannot be submitted safely.`,
})).toEqual({
ok: false,
error: 'Locator column EMAIL is empty, so changes cannot be submitted safely.',
});
});
it('uses injected messages when no safe locator is available', () => {
expect(resolveRowLocatorValues(undefined, { EMAIL: 'a@example.com' }, {
noSafeLocator: () => 'No safe row locator is available for this result set.',
})).toEqual({
ok: false,
error: 'No safe row locator is available for this result set.',
});
});
});
describe('filterHiddenLocatorColumns', () => {
it('removes hidden Oracle ROWID columns from displayed columns', () => {
const locator = resolveEditRowLocator({
dbType: 'oracle',
resultColumns: ['NAME', ORACLE_ROWID_LOCATOR_COLUMN],
allowOracleRowID: true,
});
expect(filterHiddenLocatorColumns(['NAME', ORACLE_ROWID_LOCATOR_COLUMN], locator)).toEqual(['NAME']);
});
});