ContextKeeper v1.0.0 — Persistent AI coding session context Chrome extension
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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 = `
|
||||
<div data-testid="conversation-turn-1">
|
||||
<div>Hello AI</div>
|
||||
</div>
|
||||
<div data-testid="conversation-turn-2">
|
||||
<div>Hi there!</div>
|
||||
</div>
|
||||
`;
|
||||
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 = `
|
||||
<article>First message</article>
|
||||
<article>Second message</article>
|
||||
`;
|
||||
const result = extractor.extract('chatgpt');
|
||||
expect(result).toContain('[user]: First message');
|
||||
expect(result).toContain('[assistant]: Second message');
|
||||
});
|
||||
|
||||
it('extracts Claude messages', () => {
|
||||
document.body.innerHTML = `
|
||||
<div class="message">How do I refactor this?</div>
|
||||
<div class="message">Here is a suggestion...</div>
|
||||
`;
|
||||
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 = `
|
||||
<div class="chat-message">Fix this bug</div>
|
||||
<div class="chat-message">The issue is...</div>
|
||||
`;
|
||||
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 = `
|
||||
<article>
|
||||
Some code
|
||||
<button>Copy</button>
|
||||
<span class="timestamp">2:30 PM</span>
|
||||
</article>
|
||||
`;
|
||||
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 = '<div>Empty page</div>';
|
||||
expect(extractor.extract('chatgpt')).toBe('');
|
||||
});
|
||||
|
||||
it('skips very short text', () => {
|
||||
document.body.innerHTML = `
|
||||
<article>Hi</article>
|
||||
<article></article>
|
||||
`;
|
||||
const result = extractor.extract('chatgpt');
|
||||
expect(result).toBe('');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user