Spaces:
Running
Running
File size: 2,427 Bytes
2b18d49 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | import { TranscriptView } from '../../js/components/transcript-view.js';
function makeContainer() {
// jsdom provides a real DOM — use a real div for simplicity
const div = document.createElement('div');
div.scrollTop = 0;
Object.defineProperty(div, 'scrollHeight', { value: 200, writable: true });
return div;
}
describe('TranscriptView', () => {
let view, container;
beforeEach(() => {
container = makeContainer();
view = new TranscriptView(container);
});
test('addMessage creates a new bubble for the first message', () => {
view.addMessage('user', 'Hello');
expect(container.children.length).toBe(1);
expect(container.querySelector('.user-message')).not.toBeNull();
expect(container.querySelector('.message-text').textContent).toBe('Hello');
});
test('addMessage appends text for consecutive same-speaker messages', () => {
view.addMessage('agent', 'Hello');
view.addMessage('agent', ' world');
expect(container.children.length).toBe(1);
expect(container.querySelector('.message-text').textContent).toBe('Hello world');
});
test('addMessage creates a new bubble for a different speaker', () => {
view.addMessage('user', 'Hi');
view.addMessage('agent', 'Hey');
expect(container.children.length).toBe(2);
});
test('addMessage ignores empty or whitespace-only text', () => {
view.addMessage('user', '');
view.addMessage('user', ' ');
expect(container.children.length).toBe(0);
});
test('system message has no avatar element', () => {
view.addMessage('system', 'Error occurred');
expect(container.querySelector('.system-message .message-avatar')).toBeNull();
});
test('clear removes all messages and resets state', () => {
view.addMessage('user', 'Hi');
view.addMessage('agent', 'Hey');
view.clear();
expect(container.innerHTML).toBe('');
expect(view.lastSpeaker).toBeNull();
expect(view.lastBubble).toBeNull();
});
test('after clear, a new message creates a fresh bubble', () => {
view.addMessage('user', 'Before');
view.clear();
view.addMessage('user', 'After');
expect(container.children.length).toBe(1);
expect(container.querySelector('.message-text').textContent).toBe('After');
});
});
|