import { describe, it, expect, beforeEach } from 'vitest'; import { ContextExtractor } from '../src/lib/extractor'; describe('ContextExtractor', () => { let extractor: ContextExtractor; beforeEach(() => { extractor = new ContextExtractor(); }); it('extracts nothing for unknown platforms', () => { expect(extractor.extract('unknown')).toBe(''); }); it('extracts ChatGPT conversation turns', () => { document.body.innerHTML = `
Hello AI
Hi there!
`; const result = extractor.extract('chatgpt'); expect(result).toContain('[user]: Hello AI'); expect(result).toContain('[assistant]: Hi there!'); }); it('falls back to article elements for ChatGPT', () => { document.body.innerHTML = `
First message
Second message
`; const result = extractor.extract('chatgpt'); expect(result).toContain('[user]: First message'); expect(result).toContain('[assistant]: Second message'); }); it('extracts Claude messages', () => { document.body.innerHTML = `
How do I refactor this?
Here is a suggestion...
`; const result = extractor.extract('claude'); expect(result).toContain('[human]: How do I refactor this?'); expect(result).toContain('[assistant]: Here is a suggestion...'); }); it('extracts Cursor chat', () => { document.body.innerHTML = `
Fix this bug
The issue is...
`; const result = extractor.extract('cursor'); expect(result).toContain('[user]: Fix this bug'); expect(result).toContain('[assistant]: The issue is...'); }); it('removes buttons and timestamps from content', () => { document.body.innerHTML = `
Some code 2:30 PM
`; const result = extractor.extract('chatgpt'); expect(result).toContain('Some code'); expect(result).not.toContain('Copy'); expect(result).not.toContain('2:30 PM'); }); it('returns empty string when no elements found', () => { document.body.innerHTML = '
Empty page
'; expect(extractor.extract('chatgpt')).toBe(''); }); it('skips very short text', () => { document.body.innerHTML = `
Hi
`; const result = extractor.extract('chatgpt'); expect(result).toBe(''); }); });