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');
    });
});