Files
MyGoNavi/frontend/src/utils/aiTableSchemaTool.test.ts
Syngnat 51675f9d05 🐛 fix(ai): 修复多方言执行与 DDL 降级
- SQL 执行:移除 AI 工具和代码块预览中硬编码的 LIMIT 50
- 方言适配:按连接类型和自定义驱动别名生成只读 SQL 预览限流语句
- Oracle 兼容:Oracle、自定义 Oracle 和达梦改用 ROWNUM 语法限制行数
- 权限降级:获取表 DDL 失败时自动降级为字段元数据摘要
- 上下文优化:手动添加表结构上下文时复用同一套 DDL 降级逻辑
- 测试覆盖:新增 AI SQL 限流和表结构降级单元测试
Refs #418
2026-04-28 14:03:48 +08:00

52 lines
2.1 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, 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');
});
});