mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-20 15:50:51 +08:00
- 定位策略:新增主键、唯一索引和 Oracle ROWID 三类安全行定位能力 - 查询编辑器:简单单表 SELECT 自动补充隐藏定位列,复杂结果保持只读 - 表预览:无主键表可通过唯一索引或 Oracle ROWID 安全编辑 - 提交流程:移除无主键整行 WHERE fallback,隐藏定位列不参与展示和写入 - 后端保护:Oracle、MySQL、PostgreSQL 更新删除必须恰好影响 1 行 - 测试覆盖:补充 QueryEditor、DataViewer、DataGrid 和 ApplyChanges 相关用例 Refs #419
45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { extractQueryResultTableRef } from './queryResultTable';
|
|
|
|
describe('extractQueryResultTableRef', () => {
|
|
it('preserves Oracle schema-qualified table names for editing', () => {
|
|
expect(extractQueryResultTableRef('SELECT * FROM MYCIMLED.EDC_LOG FETCH FIRST 500 ROWS ONLY', 'oracle', 'ANONYMOUS'))
|
|
.toEqual({
|
|
tableName: 'MYCIMLED.EDC_LOG',
|
|
metadataDbName: 'MYCIMLED',
|
|
metadataTableName: 'EDC_LOG',
|
|
});
|
|
});
|
|
|
|
it('uses current schema for unqualified Oracle tables', () => {
|
|
expect(extractQueryResultTableRef('SELECT * FROM EDC_LOG', 'oracle', 'MYCIMLED'))
|
|
.toEqual({
|
|
tableName: 'EDC_LOG',
|
|
metadataDbName: 'MYCIMLED',
|
|
metadataTableName: 'EDC_LOG',
|
|
});
|
|
});
|
|
|
|
it('keeps existing simple table behavior for MySQL-style qualified names', () => {
|
|
expect(extractQueryResultTableRef('SELECT * FROM app.users LIMIT 500', 'mysql', 'app'))
|
|
.toEqual({
|
|
tableName: 'users',
|
|
metadataDbName: 'app',
|
|
metadataTableName: 'users',
|
|
});
|
|
});
|
|
|
|
it('does not mark join results as editable table refs', () => {
|
|
expect(extractQueryResultTableRef('SELECT * FROM users u JOIN orders o ON u.id = o.user_id', 'oracle', 'APP'))
|
|
.toBeUndefined();
|
|
});
|
|
|
|
it('does not mark grouped or distinct results as editable table refs', () => {
|
|
expect(extractQueryResultTableRef('SELECT ID FROM users GROUP BY ID', 'mysql', 'app'))
|
|
.toBeUndefined();
|
|
expect(extractQueryResultTableRef('SELECT DISTINCT ID FROM users', 'mysql', 'app'))
|
|
.toBeUndefined();
|
|
});
|
|
});
|