- ftsHelpers: sanitizeFtsQuery (FTS5 special char escape) + computeCutoff (period → KST 자정) - search: notes_fts MATCH + status filter + rank order + sanitize + 빈 query → [] - reviewAggregate: period 별 totalCount/recentNotes(50)/tagCounts(DESC)/dueProgress(passed/pending)
35 lines
1.3 KiB
TypeScript
35 lines
1.3 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { sanitizeFtsQuery, computeCutoff } from '../../src/main/repository/ftsHelpers.js';
|
|
|
|
describe('sanitizeFtsQuery', () => {
|
|
it('strips FTS5 special chars', () => {
|
|
expect(sanitizeFtsQuery('"기획" *회의*')).toBe('기획 회의');
|
|
expect(sanitizeFtsQuery('foo: (bar)')).toBe('foo bar');
|
|
});
|
|
it('keeps Korean + alphanumeric tokens', () => {
|
|
expect(sanitizeFtsQuery('회의 결재 v2')).toBe('회의 결재 v2');
|
|
});
|
|
it('collapses whitespace', () => {
|
|
expect(sanitizeFtsQuery(' 회의 ')).toBe('회의');
|
|
});
|
|
it('returns empty string for whitespace-only', () => {
|
|
expect(sanitizeFtsQuery(' ')).toBe('');
|
|
});
|
|
});
|
|
|
|
describe('computeCutoff', () => {
|
|
// KST = UTC+9. KST 자정 = UTC 전날 15:00.
|
|
it('daily — KST 오늘 자정 ISO', () => {
|
|
const now = new Date('2026-05-10T05:30:00Z'); // KST 14:30
|
|
expect(computeCutoff('daily', now)).toBe('2026-05-09T15:00:00.000Z');
|
|
});
|
|
it('weekly — 7일 전 KST 자정', () => {
|
|
const now = new Date('2026-05-10T05:30:00Z');
|
|
expect(computeCutoff('weekly', now)).toBe('2026-05-02T15:00:00.000Z');
|
|
});
|
|
it('monthly — 30일 전 KST 자정', () => {
|
|
const now = new Date('2026-05-10T05:30:00Z');
|
|
expect(computeCutoff('monthly', now)).toBe('2026-04-09T15:00:00.000Z');
|
|
});
|
|
});
|