mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-20 15:50:51 +08:00
- SQL 执行:移除 AI 工具和代码块预览中硬编码的 LIMIT 50 - 方言适配:按连接类型和自定义驱动别名生成只读 SQL 预览限流语句 - Oracle 兼容:Oracle、自定义 Oracle 和达梦改用 ROWNUM 语法限制行数 - 权限降级:获取表 DDL 失败时自动降级为字段元数据摘要 - 上下文优化:手动添加表结构上下文时复用同一套 DDL 降级逻辑 - 测试覆盖:新增 AI SQL 限流和表结构降级单元测试 Refs #418
52 lines
2.1 KiB
TypeScript
52 lines
2.1 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
||
|
||
import { resolveAITableSchemaToolResult } from './aiTableSchemaTool';
|
||
|
||
describe('resolveAITableSchemaToolResult', () => {
|
||
it('returns DDL directly when DDL fetch succeeds', async () => {
|
||
const fetchColumns = vi.fn();
|
||
|
||
const result = await resolveAITableSchemaToolResult({
|
||
tableName: 'USERS',
|
||
fetchDDL: vi.fn().mockResolvedValue({ success: true, data: 'CREATE TABLE USERS (ID NUMBER)' }),
|
||
fetchColumns,
|
||
});
|
||
|
||
expect(result).toEqual({ success: true, content: 'CREATE TABLE USERS (ID NUMBER)' });
|
||
expect(fetchColumns).not.toHaveBeenCalled();
|
||
});
|
||
|
||
it('falls back to column metadata when DDL fetch fails due to permissions', async () => {
|
||
const result = await resolveAITableSchemaToolResult({
|
||
tableName: 'USERS',
|
||
fetchDDL: vi.fn().mockResolvedValue({ success: false, message: 'ORA-31603: object not found or insufficient privileges' }),
|
||
fetchColumns: vi.fn().mockResolvedValue({
|
||
success: true,
|
||
data: [
|
||
{ Name: 'ID', Type: 'NUMBER', Nullable: 'NO', Default: null, Comment: '主键' },
|
||
{ Name: 'NAME', Type: 'VARCHAR2(64)', Nullable: 'YES' },
|
||
],
|
||
}),
|
||
});
|
||
|
||
expect(result.success).toBe(true);
|
||
expect(result.content).toContain('DDL 获取失败,已降级为字段元数据摘要');
|
||
expect(result.content).toContain('ORA-31603');
|
||
expect(result.content).toContain('可用字段:ID, NAME');
|
||
expect(result.content).toContain('"field":"ID"');
|
||
expect(result.content).toContain('"type":"NUMBER"');
|
||
});
|
||
|
||
it('returns a combined failure when both DDL and column metadata fail', async () => {
|
||
const result = await resolveAITableSchemaToolResult({
|
||
tableName: 'USERS',
|
||
fetchDDL: vi.fn().mockResolvedValue({ success: false, message: 'DDL permission denied' }),
|
||
fetchColumns: vi.fn().mockResolvedValue({ success: false, message: 'columns permission denied' }),
|
||
});
|
||
|
||
expect(result.success).toBe(false);
|
||
expect(result.content).toContain('DDL permission denied');
|
||
expect(result.content).toContain('columns permission denied');
|
||
});
|
||
});
|