Files
MyGoNavi/frontend/src/utils/redisSearchPattern.test.ts
Syngnat a06f45da28 feat(redis): 新增 Key 精确搜索模式
- 增加 Redis Key 模糊/精确搜索切换
- 精确模式不再追加通配符并保留大小写敏感匹配
- 转义 Redis glob 特殊字符避免误匹配
- 补充搜索模式回归测试
2026-04-26 20:34:07 +08:00

56 lines
1.7 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { normalizeRedisSearchDraftChange, normalizeRedisSearchInput } from './redisSearchPattern';
describe('normalizeRedisSearchInput', () => {
it('returns wildcard for empty input', () => {
expect(normalizeRedisSearchInput('')).toEqual({
keyword: '',
pattern: '*',
});
});
it('wraps plain keywords with wildcard for contains matching', () => {
expect(normalizeRedisSearchInput('order')).toEqual({
keyword: 'order',
pattern: '*[oO][rR][dD][eE][rR]*',
});
});
it('builds ascii case-insensitive patterns for letter keywords', () => {
expect(normalizeRedisSearchInput('agent')).toEqual({
keyword: 'agent',
pattern: '*[aA][gG][eE][nN][tT]*',
});
});
it('escapes redis glob special characters as literals', () => {
expect(normalizeRedisSearchInput('user:*:[id]?')).toEqual({
keyword: 'user:*:[id]?',
pattern: '*[uU][sS][eE][rR]:\\*:\\[[iI][dD]\\]\\?*',
});
});
it('uses literal key pattern without fuzzy wildcards in exact mode', () => {
expect(normalizeRedisSearchInput('Order:1001', 'exact')).toEqual({
keyword: 'Order:1001',
pattern: 'Order:1001',
});
});
it('escapes redis glob special characters in exact mode without adding wildcards', () => {
expect(normalizeRedisSearchInput('user:*:[id]?\\raw', 'exact')).toEqual({
keyword: 'user:*:[id]?\\raw',
pattern: 'user:\\*:\\[id\\]\\?\\\\raw',
});
});
it('marks empty draft changes for immediate reset search', () => {
expect(normalizeRedisSearchDraftChange('')).toEqual({
keyword: '',
pattern: '*',
shouldSearchImmediately: true,
});
});
});