mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-23 05:37:11 +08:00
🐛 fix(table-designer): 修复索引编辑丢失与勾选异常
This commit is contained in:
95
frontend/src/components/tableDesignerIndexUtils.test.ts
Normal file
95
frontend/src/components/tableDesignerIndexUtils.test.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import {
|
||||
hasIndexFormChanged,
|
||||
normalizeIndexFormFromRow,
|
||||
shouldRestoreOriginalIndex,
|
||||
toggleIndexSelection,
|
||||
type IndexDisplaySnapshot,
|
||||
type IndexFormSnapshot,
|
||||
} from './tableDesignerIndexUtils';
|
||||
|
||||
describe('tableDesignerIndexUtils', () => {
|
||||
it('normalizes index rows for edit form reuse', () => {
|
||||
const row: IndexDisplaySnapshot = {
|
||||
key: 'idx_user_name',
|
||||
name: 'idx_user_name',
|
||||
indexType: 'btree',
|
||||
nonUnique: 0,
|
||||
columnNames: ['name'],
|
||||
};
|
||||
|
||||
expect(normalizeIndexFormFromRow(row, ['NORMAL', 'UNIQUE', 'PRIMARY', 'FULLTEXT', 'SPATIAL'])).toEqual({
|
||||
name: 'idx_user_name',
|
||||
columnNames: ['name'],
|
||||
kind: 'UNIQUE',
|
||||
indexType: 'BTREE',
|
||||
});
|
||||
});
|
||||
|
||||
it('detects no-op index edits as unchanged', () => {
|
||||
const previousForm: IndexFormSnapshot = {
|
||||
name: 'idx_user_name',
|
||||
columnNames: ['name'],
|
||||
kind: 'UNIQUE',
|
||||
indexType: 'BTREE',
|
||||
};
|
||||
const nextForm: IndexFormSnapshot = {
|
||||
name: 'idx_user_name',
|
||||
columnNames: ['name'],
|
||||
kind: 'UNIQUE',
|
||||
indexType: 'BTREE',
|
||||
};
|
||||
|
||||
expect(hasIndexFormChanged(previousForm, nextForm)).toBe(false);
|
||||
});
|
||||
|
||||
it('marks edits as changed when index columns differ', () => {
|
||||
const previousForm: IndexFormSnapshot = {
|
||||
name: 'idx_user_name',
|
||||
columnNames: ['name'],
|
||||
kind: 'NORMAL',
|
||||
indexType: 'DEFAULT',
|
||||
};
|
||||
const nextForm: IndexFormSnapshot = {
|
||||
name: 'idx_user_name',
|
||||
columnNames: ['name', 'email'],
|
||||
kind: 'NORMAL',
|
||||
indexType: 'DEFAULT',
|
||||
};
|
||||
|
||||
expect(hasIndexFormChanged(previousForm, nextForm)).toBe(true);
|
||||
});
|
||||
|
||||
it('toggles selected index keys without duplicates', () => {
|
||||
expect(toggleIndexSelection([], 'idx_user_name', true)).toEqual(['idx_user_name']);
|
||||
expect(toggleIndexSelection(['idx_user_name'], 'idx_user_name', true)).toEqual(['idx_user_name']);
|
||||
expect(toggleIndexSelection(['idx_user_name'], 'idx_user_name')).toEqual([]);
|
||||
});
|
||||
|
||||
it('keeps single-selection toggles stable across repeated clicks', () => {
|
||||
let selected = toggleIndexSelection([], 'idx_user_name');
|
||||
expect(selected).toEqual(['idx_user_name']);
|
||||
|
||||
selected = toggleIndexSelection(selected, 'idx_user_name');
|
||||
expect(selected).toEqual([]);
|
||||
|
||||
selected = toggleIndexSelection(selected, 'idx_user_name');
|
||||
expect(selected).toEqual(['idx_user_name']);
|
||||
|
||||
selected = toggleIndexSelection(selected, 'idx_user_email');
|
||||
expect(selected).toEqual(['idx_user_name', 'idx_user_email']);
|
||||
|
||||
selected = toggleIndexSelection(selected, 'idx_user_email');
|
||||
expect(selected).toEqual(['idx_user_name']);
|
||||
|
||||
selected = toggleIndexSelection(selected, 'idx_user_name');
|
||||
expect(selected).toEqual([]);
|
||||
});
|
||||
|
||||
it('only restores original index when create step fails after drop step', () => {
|
||||
expect(shouldRestoreOriginalIndex({ failedStatementIndex: 1 })).toBe(true);
|
||||
expect(shouldRestoreOriginalIndex({ failedStatementIndex: 0 })).toBe(false);
|
||||
expect(shouldRestoreOriginalIndex({})).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user