import { describe, expect, it } from 'vitest' import { applyFileMentionReplacement, findActiveFileMention } from './file-mention-autocomplete' describe('findActiveFileMention', () => { it('detects mentions at the start of input', () => { const mention = findActiveFileMention({ text: '@src/components', cursorIndex: '@src/components'.length, }) expect(mention).toEqual({ start: 0, end: '@src/components'.length, query: 'src/components', }) }) it('detects mentions in the middle of input using cursor position', () => { const text = 'read "@src/com" before merging' const cursorIndex = text.indexOf('"') + 9 const mention = findActiveFileMention({ text, cursorIndex, }) expect(mention).toEqual({ start: text.indexOf('@'), end: cursorIndex, query: 'src/com', }) }) it('returns null when cursor is outside the mention token', () => { const text = 'please review @src/components now' const mention = findActiveFileMention({ text, cursorIndex: text.length, }) expect(mention).toBeNull() }) }) describe('applyFileMentionReplacement', () => { it('replaces only the active @query segment with a quoted relative path', () => { const text = 'open @src/com next' const next = applyFileMentionReplacement({ text, mention: { start: 5, end: 13, query: 'src/com' }, relativePath: 'src/components/chat.tsx', }) expect(next).toBe('open "src/components/chat.tsx" next') }) it('escapes double quotes in replacement path', () => { const text = '@foo' const next = applyFileMentionReplacement({ text, mention: { start: 0, end: 4, query: 'foo' }, relativePath: 'src/"quoted".ts', }) expect(next).toBe('"src/\\"quoted\\".ts"') }) })