@servicetitan/titan-chat-ui-common 7.1.2 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/hooks/use-customization-chat.js +2 -1
- package/dist/hooks/use-customization-chat.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/__mocks__/support-chat.mock.js +13 -12
- package/dist/models/__mocks__/support-chat.mock.js.map +1 -1
- package/dist/models/chat-customizations.js +2 -1
- package/dist/models/chat-customizations.js.map +1 -1
- package/dist/models/file-descriptor.js +2 -1
- package/dist/models/file-descriptor.js.map +1 -1
- package/dist/models/index.d.ts +2 -2
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1 -2
- package/dist/models/index.js.map +1 -1
- package/dist/models/support-chat.js +37 -41
- package/dist/models/support-chat.js.map +1 -1
- package/dist/stores/__tests__/chat-ui.store.test.js +117 -106
- package/dist/stores/__tests__/chat-ui.store.test.js.map +1 -1
- package/dist/stores/chat-ui-backend-echo.store.js +86 -87
- package/dist/stores/chat-ui-backend-echo.store.js.map +1 -1
- package/dist/stores/chat-ui-backend.store.js +1 -0
- package/dist/stores/chat-ui-backend.store.js.map +1 -1
- package/dist/stores/chat-ui.store.d.ts +2 -2
- package/dist/stores/chat-ui.store.d.ts.map +1 -1
- package/dist/stores/chat-ui.store.js +307 -329
- package/dist/stores/chat-ui.store.js.map +1 -1
- package/dist/stores/index.d.ts +4 -2
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +2 -1
- package/dist/stores/index.js.map +1 -1
- package/dist/utils/__tests__/text-utils.test.js +33 -14
- package/dist/utils/__tests__/text-utils.test.js.map +1 -1
- package/dist/utils/test-utils.js +5 -5
- package/dist/utils/test-utils.js.map +1 -1
- package/dist/utils/text-utils.js +12 -12
- package/dist/utils/text-utils.js.map +1 -1
- package/package.json +2 -2
- package/src/models/index.ts +2 -2
- package/src/stores/chat-ui.store.ts +1 -3
- package/src/stores/index.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,72 +1,60 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
1
14
|
import { expect } from '@jest/globals';
|
|
2
15
|
import { autorun } from 'mobx';
|
|
3
|
-
import { ChatEndReason, ChatError, ChatMessageState, ChatParticipantIcon, ChatRunState
|
|
16
|
+
import { ChatEndReason, ChatError, ChatMessageState, ChatParticipantIcon, ChatRunState } from '../../models';
|
|
4
17
|
import { initTestContainer } from '../../utils/test-utils';
|
|
5
18
|
import { ChatUiEvent, ChatUiStore, symbolAgent, symbolUser } from '../chat-ui.store';
|
|
6
19
|
const mockAudio = {
|
|
7
20
|
Audio: {
|
|
8
|
-
play: jest.fn().mockResolvedValue(undefined)
|
|
9
|
-
}
|
|
21
|
+
play: jest.fn().mockResolvedValue(undefined)
|
|
22
|
+
}
|
|
10
23
|
};
|
|
11
24
|
const mockEventEmitter = {
|
|
12
25
|
on: jest.fn(),
|
|
13
26
|
off: jest.fn(),
|
|
14
27
|
emit: jest.fn(),
|
|
15
28
|
listeners: jest.fn(),
|
|
16
|
-
listenerCount: jest.fn()
|
|
29
|
+
listenerCount: jest.fn()
|
|
17
30
|
};
|
|
18
|
-
jest.mock('events', ()
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
Object.defineProperty(this, "off", {
|
|
28
|
-
enumerable: true,
|
|
29
|
-
configurable: true,
|
|
30
|
-
writable: true,
|
|
31
|
-
value: mockEventEmitter.off
|
|
32
|
-
});
|
|
33
|
-
Object.defineProperty(this, "emit", {
|
|
34
|
-
enumerable: true,
|
|
35
|
-
configurable: true,
|
|
36
|
-
writable: true,
|
|
37
|
-
value: mockEventEmitter.emit
|
|
38
|
-
});
|
|
39
|
-
Object.defineProperty(this, "listeners", {
|
|
40
|
-
enumerable: true,
|
|
41
|
-
configurable: true,
|
|
42
|
-
writable: true,
|
|
43
|
-
value: mockEventEmitter.listeners
|
|
44
|
-
});
|
|
45
|
-
Object.defineProperty(this, "listenerCount", {
|
|
46
|
-
enumerable: true,
|
|
47
|
-
configurable: true,
|
|
48
|
-
writable: true,
|
|
49
|
-
value: mockEventEmitter.listenerCount
|
|
50
|
-
});
|
|
31
|
+
jest.mock('events', ()=>({
|
|
32
|
+
EventEmitter: class {
|
|
33
|
+
constructor(){
|
|
34
|
+
_define_property(this, "on", mockEventEmitter.on);
|
|
35
|
+
_define_property(this, "off", mockEventEmitter.off);
|
|
36
|
+
_define_property(this, "emit", mockEventEmitter.emit);
|
|
37
|
+
_define_property(this, "listeners", mockEventEmitter.listeners);
|
|
38
|
+
_define_property(this, "listenerCount", mockEventEmitter.listenerCount);
|
|
39
|
+
}
|
|
51
40
|
}
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
describe('[ChatUiStore]', () => {
|
|
41
|
+
}));
|
|
42
|
+
const initContainer = initTestContainer(ChatUiStore, ()=>{});
|
|
43
|
+
describe('[ChatUiStore]', ()=>{
|
|
56
44
|
let container;
|
|
57
45
|
let store;
|
|
58
46
|
let audioBackup;
|
|
59
|
-
beforeEach(()
|
|
47
|
+
beforeEach(()=>{
|
|
60
48
|
container = initContainer();
|
|
61
49
|
store = container.get(ChatUiStore);
|
|
62
50
|
jest.useFakeTimers();
|
|
63
51
|
jest.setSystemTime(Date.parse('2021-01-01T00:00:00.000Z'));
|
|
64
52
|
audioBackup = global.Audio;
|
|
65
|
-
global.Audio = jest.fn().mockImplementation(()
|
|
66
|
-
|
|
67
|
-
|
|
53
|
+
global.Audio = jest.fn().mockImplementation(()=>({
|
|
54
|
+
play: mockAudio.Audio.play
|
|
55
|
+
}));
|
|
68
56
|
});
|
|
69
|
-
afterEach(()
|
|
57
|
+
afterEach(()=>{
|
|
70
58
|
if (audioBackup) {
|
|
71
59
|
global.Audio = audioBackup;
|
|
72
60
|
}
|
|
@@ -78,7 +66,7 @@ describe('[ChatUiStore]', () => {
|
|
|
78
66
|
mockEventEmitter.listeners.mockClear();
|
|
79
67
|
mockEventEmitter.listenerCount.mockClear();
|
|
80
68
|
});
|
|
81
|
-
test('should initialize with default values', ()
|
|
69
|
+
test('should initialize with default values', ()=>{
|
|
82
70
|
expect(store.isAgentTyping).toBe(false);
|
|
83
71
|
expect(store.status).toBe(ChatRunState.Offline);
|
|
84
72
|
expect(store.isFilePickerEnabled).toBe(false);
|
|
@@ -104,44 +92,51 @@ describe('[ChatUiStore]', () => {
|
|
|
104
92
|
expect(store.isStarting).toBe(false);
|
|
105
93
|
expect(store.customizations).toEqual({});
|
|
106
94
|
});
|
|
107
|
-
test('should subscribe and unsubscribe to events', ()
|
|
95
|
+
test('should subscribe and unsubscribe to events', ()=>{
|
|
108
96
|
const mockCallback = jest.fn();
|
|
109
97
|
store.on('testEvent', mockCallback);
|
|
110
98
|
expect(mockEventEmitter.on).toHaveBeenCalledWith('testEvent', mockCallback);
|
|
111
99
|
store.off('testEvent', mockCallback);
|
|
112
100
|
expect(mockEventEmitter.off).toHaveBeenCalledWith('testEvent', mockCallback);
|
|
113
101
|
});
|
|
114
|
-
test('should set customizations context', async ()
|
|
115
|
-
const customizations = {
|
|
102
|
+
test('should set customizations context', async ()=>{
|
|
103
|
+
const customizations = {
|
|
104
|
+
abc: '123'
|
|
105
|
+
};
|
|
116
106
|
store.setCustomizationContext(customizations);
|
|
117
107
|
expect(store.customizations).toEqual(customizations);
|
|
118
108
|
await checkScrollTriggered();
|
|
119
109
|
});
|
|
120
|
-
test('should getLastFailedMessages', ()
|
|
110
|
+
test('should getLastFailedMessages', ()=>{
|
|
121
111
|
store.addMessage(false, 'message1');
|
|
122
112
|
const m2 = store.addMessage(false, 'message2');
|
|
123
113
|
const m3 = store.addMessage(false, 'message3');
|
|
124
114
|
expect(store.getLastFailedMessages()).toEqual([]);
|
|
125
115
|
store.setMessageState(m3, ChatMessageState.Failed);
|
|
126
116
|
let failedMessages = store.getLastFailedMessages();
|
|
127
|
-
expect(failedMessages).toEqual([
|
|
117
|
+
expect(failedMessages).toEqual([
|
|
118
|
+
m3
|
|
119
|
+
]);
|
|
128
120
|
store.setMessageState(m2, ChatMessageState.Failed);
|
|
129
121
|
failedMessages = store.getLastFailedMessages();
|
|
130
|
-
expect(failedMessages).toEqual([
|
|
122
|
+
expect(failedMessages).toEqual([
|
|
123
|
+
m3,
|
|
124
|
+
m2
|
|
125
|
+
]);
|
|
131
126
|
});
|
|
132
|
-
describe('with file messages', ()
|
|
133
|
-
test('should set file', ()
|
|
127
|
+
describe('with file messages', ()=>{
|
|
128
|
+
test('should set file', ()=>{
|
|
134
129
|
const file = mockFile();
|
|
135
130
|
store.setFile(file);
|
|
136
131
|
expect(store.file).toEqual(file);
|
|
137
132
|
store.setFile(undefined);
|
|
138
133
|
expect(store.file).toBeUndefined();
|
|
139
134
|
});
|
|
140
|
-
test('should trigger MobX reactions when file changes', ()
|
|
135
|
+
test('should trigger MobX reactions when file changes', ()=>{
|
|
141
136
|
const file = mockFile();
|
|
142
137
|
const reactions = [];
|
|
143
138
|
// Set up autorun to track file changes
|
|
144
|
-
const dispose = autorun(()
|
|
139
|
+
const dispose = autorun(()=>{
|
|
145
140
|
reactions.push(store.file);
|
|
146
141
|
});
|
|
147
142
|
// Initial run should capture undefined
|
|
@@ -158,7 +153,7 @@ describe('[ChatUiStore]', () => {
|
|
|
158
153
|
// Clean up
|
|
159
154
|
dispose();
|
|
160
155
|
});
|
|
161
|
-
test('should set file picker enabled state', async ()
|
|
156
|
+
test('should set file picker enabled state', async ()=>{
|
|
162
157
|
store.setFile(mockFile());
|
|
163
158
|
store.setFilePickerEnabled(true);
|
|
164
159
|
expect(store.isFilePickerEnabled).toBe(true);
|
|
@@ -171,28 +166,34 @@ describe('[ChatUiStore]', () => {
|
|
|
171
166
|
await checkScrollTriggered();
|
|
172
167
|
});
|
|
173
168
|
});
|
|
174
|
-
describe('with chat errors', ()
|
|
175
|
-
test('should set error', async ()
|
|
176
|
-
var
|
|
169
|
+
describe('with chat errors', ()=>{
|
|
170
|
+
test('should set error', async ()=>{
|
|
171
|
+
var _store_error;
|
|
177
172
|
store.setError('Test error', {
|
|
178
173
|
title: 'Test error title',
|
|
179
|
-
recoverStrategy: {
|
|
180
|
-
|
|
174
|
+
recoverStrategy: {
|
|
175
|
+
recoverButtonTitle: 'Test error button'
|
|
176
|
+
},
|
|
177
|
+
data: {
|
|
178
|
+
some: 'data'
|
|
179
|
+
}
|
|
181
180
|
});
|
|
182
|
-
expect((
|
|
183
|
-
data: {
|
|
181
|
+
expect((_store_error = store.error) === null || _store_error === void 0 ? void 0 : _store_error.toJSON()).toEqual({
|
|
182
|
+
data: {
|
|
183
|
+
some: 'data'
|
|
184
|
+
},
|
|
184
185
|
message: 'Test error',
|
|
185
186
|
name: 'ChatError',
|
|
186
187
|
recoverStrategy: {
|
|
187
|
-
recoverButtonTitle: 'Test error button'
|
|
188
|
+
recoverButtonTitle: 'Test error button'
|
|
188
189
|
},
|
|
189
|
-
title: 'Test error title'
|
|
190
|
+
title: 'Test error title'
|
|
190
191
|
});
|
|
191
192
|
expect(store.status).toBe(ChatRunState.Error);
|
|
192
193
|
expect(store.isError).toBe(true);
|
|
193
194
|
await checkScrollTriggered();
|
|
194
195
|
});
|
|
195
|
-
test('should reset error', async ()
|
|
196
|
+
test('should reset error', async ()=>{
|
|
196
197
|
store.setError('Test error');
|
|
197
198
|
store.resetError(ChatRunState.Started);
|
|
198
199
|
expect(store.error).toBeUndefined();
|
|
@@ -200,17 +201,17 @@ describe('[ChatUiStore]', () => {
|
|
|
200
201
|
await checkScrollTriggered();
|
|
201
202
|
});
|
|
202
203
|
});
|
|
203
|
-
describe('with messages', ()
|
|
204
|
+
describe('with messages', ()=>{
|
|
204
205
|
function expectText(message, expected) {
|
|
205
206
|
expect(message.type).toBe('message');
|
|
206
207
|
expect(message.message).toBe(expected);
|
|
207
208
|
}
|
|
208
|
-
test('should add message without sound', async ()
|
|
209
|
+
test('should add message without sound', async ()=>{
|
|
209
210
|
store.addMessageWelcome('welcome');
|
|
210
211
|
await jest.runOnlyPendingTimersAsync();
|
|
211
212
|
expect(mockAudio.Audio.play).toHaveBeenCalledTimes(0);
|
|
212
213
|
});
|
|
213
|
-
test('should add message', async ()
|
|
214
|
+
test('should add message', async ()=>{
|
|
214
215
|
store.setIncomingSound('non-existing-sound.mp3');
|
|
215
216
|
store.setIncomingSound('non-existing-sound2.mp3');
|
|
216
217
|
// Welcome message
|
|
@@ -228,7 +229,7 @@ describe('[ChatUiStore]', () => {
|
|
|
228
229
|
// File message
|
|
229
230
|
store.addMessageFile({
|
|
230
231
|
file: new File([], 'fileName'),
|
|
231
|
-
displayName: 'displayName'
|
|
232
|
+
displayName: 'displayName'
|
|
232
233
|
});
|
|
233
234
|
await jest.runOnlyPendingTimersAsync();
|
|
234
235
|
expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2); // No sound for outgoing messages
|
|
@@ -242,8 +243,8 @@ describe('[ChatUiStore]', () => {
|
|
|
242
243
|
expect(store.messages[3].participant.isAgent).toBe(false);
|
|
243
244
|
expect(store.messages[3].type).toBe('file');
|
|
244
245
|
});
|
|
245
|
-
test('should addMessageTimeout', async ()
|
|
246
|
-
var
|
|
246
|
+
test('should addMessageTimeout', async ()=>{
|
|
247
|
+
var _store_messages_at;
|
|
247
248
|
// Adding timeout message should not happen when no messages are present
|
|
248
249
|
store.addMessageTimeout();
|
|
249
250
|
expect(store.messages.length).toBe(0);
|
|
@@ -256,86 +257,86 @@ describe('[ChatUiStore]', () => {
|
|
|
256
257
|
store.addMessage(true, 'message1');
|
|
257
258
|
store.addMessageTimeout();
|
|
258
259
|
expect(store.messages.length).toBe(3);
|
|
259
|
-
expect((
|
|
260
|
+
expect((_store_messages_at = store.messages.at(-1)) === null || _store_messages_at === void 0 ? void 0 : _store_messages_at.type).toBe('timeout');
|
|
260
261
|
// Adding new message should dismiss the timeout message
|
|
261
262
|
store.addMessage(true, 'message2');
|
|
262
|
-
expect(store.messages.some(message
|
|
263
|
+
expect(store.messages.some((message)=>message.type === 'timeout')).toBe(false);
|
|
263
264
|
await checkScrollTriggered();
|
|
264
265
|
});
|
|
265
266
|
});
|
|
266
|
-
test('should configure', ()
|
|
267
|
+
test('should configure', ()=>{
|
|
267
268
|
store.configure({
|
|
268
269
|
agentIcon: ChatParticipantIcon.Bot,
|
|
269
|
-
agentName: 'Test Agent'
|
|
270
|
+
agentName: 'Test Agent'
|
|
270
271
|
});
|
|
271
272
|
expect(store.participants[symbolAgent].icon).toBe(ChatParticipantIcon.Bot);
|
|
272
273
|
expect(store.participants[symbolAgent].name).toBe('Test Agent');
|
|
273
274
|
});
|
|
274
|
-
describe('with chat events', ()
|
|
275
|
-
test('should run', async ()
|
|
275
|
+
describe('with chat events', ()=>{
|
|
276
|
+
test('should run', async ()=>{
|
|
276
277
|
// Without subscription: should throw an error
|
|
277
|
-
mockEventEmitter.listeners.mockImplementation(()
|
|
278
|
+
mockEventEmitter.listeners.mockImplementation(()=>[]);
|
|
278
279
|
await expect(store.run()).rejects.toThrow("No listeners for ChatUiEvent.eventRun ('eventRun')");
|
|
279
280
|
const spyConfigure = jest.spyOn(store, 'configure');
|
|
280
281
|
mockEmit();
|
|
281
282
|
await store.run({
|
|
282
283
|
agentIcon: ChatParticipantIcon.Bot,
|
|
283
|
-
agentName: 'Test Agent'
|
|
284
|
+
agentName: 'Test Agent'
|
|
284
285
|
}, 'chat data');
|
|
285
286
|
expect(spyConfigure).toHaveBeenCalled();
|
|
286
287
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventRun, expect.any(Function), expect.any(Function), 'chat data');
|
|
287
288
|
});
|
|
288
|
-
test('should recover', async ()
|
|
289
|
+
test('should recover', async ()=>{
|
|
289
290
|
mockEmit();
|
|
290
291
|
store.setError('Test error');
|
|
291
292
|
await store.recover();
|
|
292
293
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventRecover, expect.any(Function), expect.any(Function), new ChatError('Test error'));
|
|
293
294
|
});
|
|
294
|
-
test('should destroy', async ()
|
|
295
|
+
test('should destroy', async ()=>{
|
|
295
296
|
const spyReset = jest.spyOn(store, 'reset');
|
|
296
297
|
mockEmit();
|
|
297
298
|
await store.destroy();
|
|
298
299
|
expect(spyReset).toHaveBeenCalledWith();
|
|
299
300
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventDestroy, expect.any(Function), expect.any(Function));
|
|
300
301
|
});
|
|
301
|
-
test('should restart', async ()
|
|
302
|
+
test('should restart', async ()=>{
|
|
302
303
|
const spyReset = jest.spyOn(store, 'reset');
|
|
303
304
|
mockEmit();
|
|
304
305
|
await store.restart();
|
|
305
306
|
expect(spyReset).toHaveBeenCalledWith();
|
|
306
307
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventRestart, expect.any(Function), expect.any(Function));
|
|
307
308
|
});
|
|
308
|
-
test('should cancelChat', async ()
|
|
309
|
+
test('should cancelChat', async ()=>{
|
|
309
310
|
mockEmit();
|
|
310
311
|
await store.cancelChat();
|
|
311
312
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventCancel, expect.any(Function), expect.any(Function));
|
|
312
313
|
});
|
|
313
|
-
test('should endChat', async ()
|
|
314
|
+
test('should endChat', async ()=>{
|
|
314
315
|
mockEmit();
|
|
315
316
|
await store.endChat(ChatEndReason.ByAgent);
|
|
316
317
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventEndChat, expect.any(Function), expect.any(Function), ChatEndReason.ByAgent);
|
|
317
318
|
});
|
|
318
|
-
test('should chasitorTyping', async ()
|
|
319
|
+
test('should chasitorTyping', async ()=>{
|
|
319
320
|
mockEmit();
|
|
320
321
|
await store.chasitorTyping(false);
|
|
321
322
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventChasitorTyping, expect.any(Function), expect.any(Function), false);
|
|
322
323
|
await store.chasitorTyping(true);
|
|
323
324
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventChasitorTyping, expect.any(Function), expect.any(Function), true);
|
|
324
325
|
});
|
|
325
|
-
test('should sendMessageText', async ()
|
|
326
|
+
test('should sendMessageText', async ()=>{
|
|
326
327
|
mockEmit();
|
|
327
328
|
await store.sendMessageText('Hello, world!');
|
|
328
329
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventMessageSend, expect.any(Function), expect.any(Function), expect.objectContaining({
|
|
329
330
|
message: 'Hello, world!',
|
|
330
331
|
type: 'message',
|
|
331
|
-
state: ChatMessageState.Delivering
|
|
332
|
+
state: ChatMessageState.Delivering
|
|
332
333
|
}));
|
|
333
334
|
expect(store.messages.length).toBe(1);
|
|
334
335
|
expect(store.messages[0].type).toBe('message');
|
|
335
336
|
expect(store.messages[0].message).toBe('Hello, world!');
|
|
336
337
|
await checkScrollTriggered();
|
|
337
338
|
});
|
|
338
|
-
test('should sendMessageText with file', async ()
|
|
339
|
+
test('should sendMessageText with file', async ()=>{
|
|
339
340
|
mockEmit();
|
|
340
341
|
const file = mockFile();
|
|
341
342
|
store.setFilePickerEnabled(true);
|
|
@@ -344,7 +345,7 @@ describe('[ChatUiStore]', () => {
|
|
|
344
345
|
expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventMessageSendFile, expect.any(Function), expect.any(Function), store.currentFileMessage, file, expect.objectContaining({
|
|
345
346
|
message: 'Hello, world!',
|
|
346
347
|
type: 'message',
|
|
347
|
-
state: ChatMessageState.Delivering
|
|
348
|
+
state: ChatMessageState.Delivering
|
|
348
349
|
}));
|
|
349
350
|
expect(store.messages.length).toBe(2);
|
|
350
351
|
expect(store.messages[0].type).toBe('file');
|
|
@@ -353,12 +354,12 @@ describe('[ChatUiStore]', () => {
|
|
|
353
354
|
expect(store.currentFileMessage).toBeDefined();
|
|
354
355
|
await checkScrollTriggered();
|
|
355
356
|
});
|
|
356
|
-
test('should sendMessageText empty', async ()
|
|
357
|
+
test('should sendMessageText empty', async ()=>{
|
|
357
358
|
mockEmit();
|
|
358
359
|
await store.sendMessageText(' ');
|
|
359
360
|
expect(mockEventEmitter.emit).not.toHaveBeenCalled();
|
|
360
361
|
});
|
|
361
|
-
test('should sendMessageRetry', async ()
|
|
362
|
+
test('should sendMessageRetry', async ()=>{
|
|
362
363
|
mockEmit();
|
|
363
364
|
store.setError('Test error');
|
|
364
365
|
const message = store.addMessage(true, 'message1');
|
|
@@ -372,12 +373,12 @@ describe('[ChatUiStore]', () => {
|
|
|
372
373
|
expect(message.state).toBe(ChatMessageState.Delivering);
|
|
373
374
|
await checkScrollTriggered();
|
|
374
375
|
});
|
|
375
|
-
test('should sendMessageFileRetry', async ()
|
|
376
|
+
test('should sendMessageFileRetry', async ()=>{
|
|
376
377
|
mockEmit();
|
|
377
378
|
store.setError('Test error');
|
|
378
379
|
const fileMessage = store.addMessageFile({
|
|
379
380
|
file: new File([], 'fileName'),
|
|
380
|
-
displayName: 'displayName'
|
|
381
|
+
displayName: 'displayName'
|
|
381
382
|
});
|
|
382
383
|
store.setMessageState(fileMessage, ChatMessageState.Failed);
|
|
383
384
|
const p = store.sendMessageFileRetry(fileMessage);
|
|
@@ -390,14 +391,17 @@ describe('[ChatUiStore]', () => {
|
|
|
390
391
|
await checkScrollTriggered();
|
|
391
392
|
});
|
|
392
393
|
});
|
|
393
|
-
test('should setTimer', ()
|
|
394
|
-
store.setTimer({
|
|
394
|
+
test('should setTimer', ()=>{
|
|
395
|
+
store.setTimer({
|
|
396
|
+
secondsLeft: 10,
|
|
397
|
+
secondsTotal: 20
|
|
398
|
+
});
|
|
395
399
|
expect(store.timer).toEqual({
|
|
396
400
|
secondsLeft: 10,
|
|
397
|
-
secondsTotal: 20
|
|
401
|
+
secondsTotal: 20
|
|
398
402
|
});
|
|
399
403
|
});
|
|
400
|
-
test('should setAgentTyping', async ()
|
|
404
|
+
test('should setAgentTyping', async ()=>{
|
|
401
405
|
store.setAgentTyping(true);
|
|
402
406
|
expect(store.isAgentTyping).toBe(true);
|
|
403
407
|
await checkScrollTriggered();
|
|
@@ -405,12 +409,12 @@ describe('[ChatUiStore]', () => {
|
|
|
405
409
|
expect(store.isAgentTyping).toBe(false);
|
|
406
410
|
await checkScrollTriggered();
|
|
407
411
|
});
|
|
408
|
-
test('should setEndReason', async ()
|
|
412
|
+
test('should setEndReason', async ()=>{
|
|
409
413
|
store.setEndReason(ChatEndReason.ByTimeout);
|
|
410
414
|
expect(store.endReason).toBe(ChatEndReason.ByTimeout);
|
|
411
415
|
await checkScrollTriggered();
|
|
412
416
|
});
|
|
413
|
-
test('should setEndedChatState', async ()
|
|
417
|
+
test('should setEndedChatState', async ()=>{
|
|
414
418
|
store.isFilePickerEnabled = true;
|
|
415
419
|
store.setFile(mockFile());
|
|
416
420
|
store.setEndedChatState(ChatEndReason.ByTimeout);
|
|
@@ -424,15 +428,21 @@ describe('[ChatUiStore]', () => {
|
|
|
424
428
|
});
|
|
425
429
|
function mockFile() {
|
|
426
430
|
const file = {
|
|
427
|
-
file: new File([
|
|
428
|
-
|
|
431
|
+
file: new File([
|
|
432
|
+
'content'
|
|
433
|
+
], 'file.txt', {
|
|
434
|
+
type: 'text/plain'
|
|
435
|
+
}),
|
|
436
|
+
displayName: 'file.txt'
|
|
429
437
|
};
|
|
430
438
|
return file;
|
|
431
439
|
}
|
|
432
440
|
function mockEmit() {
|
|
433
|
-
mockEventEmitter.listeners.mockImplementation(()
|
|
441
|
+
mockEventEmitter.listeners.mockImplementation(()=>[
|
|
442
|
+
'1'
|
|
443
|
+
]);
|
|
434
444
|
mockEventEmitter.listenerCount.mockReturnValue(1);
|
|
435
|
-
mockEventEmitter.emit.mockImplementation(async (eventName, resolve)
|
|
445
|
+
mockEventEmitter.emit.mockImplementation(async (eventName, resolve)=>{
|
|
436
446
|
await Promise.resolve();
|
|
437
447
|
resolve();
|
|
438
448
|
});
|
|
@@ -443,4 +453,5 @@ describe('[ChatUiStore]', () => {
|
|
|
443
453
|
expect(counter < store.scrollCounter).toBe(true);
|
|
444
454
|
}
|
|
445
455
|
});
|
|
456
|
+
|
|
446
457
|
//# sourceMappingURL=chat-ui.store.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-ui.store.test.js","sourceRoot":"","sources":["../../../src/stores/__tests__/chat-ui.store.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/stores/__tests__/chat-ui.store.test.ts"],"sourcesContent":["import { expect } from '@jest/globals';\nimport { Container } from '@servicetitan/react-ioc';\nimport { autorun } from 'mobx';\nimport {\n ChatCustomizations,\n ChatEndReason,\n ChatError,\n ChatMessageModelBase,\n ChatMessageModelText,\n ChatMessageModelWelcome,\n ChatMessageState,\n ChatParticipantIcon,\n ChatRunState,\n FileDescriptor,\n} from '../../models';\nimport { initTestContainer } from '../../utils/test-utils';\nimport { ChatUiEvent, ChatUiStore, symbolAgent, symbolUser } from '../chat-ui.store';\n\nconst mockAudio = {\n Audio: {\n play: jest.fn().mockResolvedValue(undefined),\n },\n};\nconst mockEventEmitter = {\n on: jest.fn(),\n off: jest.fn(),\n emit: jest.fn(),\n listeners: jest.fn(),\n listenerCount: jest.fn(),\n};\njest.mock('events', () => ({\n EventEmitter: class {\n on = mockEventEmitter.on;\n off = mockEventEmitter.off;\n emit = mockEventEmitter.emit;\n listeners = mockEventEmitter.listeners;\n listenerCount = mockEventEmitter.listenerCount;\n },\n}));\n\nconst initContainer = initTestContainer(ChatUiStore, () => {});\n\ndescribe('[ChatUiStore]', () => {\n let container: Container;\n let store: ChatUiStore<ChatCustomizations>;\n let audioBackup: any;\n\n beforeEach(() => {\n container = initContainer();\n store = container.get(ChatUiStore);\n jest.useFakeTimers();\n jest.setSystemTime(Date.parse('2021-01-01T00:00:00.000Z'));\n audioBackup = global.Audio;\n global.Audio = jest.fn().mockImplementation(() => ({\n play: mockAudio.Audio.play,\n }));\n });\n\n afterEach(() => {\n if (audioBackup) {\n global.Audio = audioBackup;\n }\n jest.useRealTimers();\n jest.clearAllMocks();\n mockEventEmitter.on.mockClear();\n mockEventEmitter.off.mockClear();\n mockEventEmitter.emit.mockClear();\n mockEventEmitter.listeners.mockClear();\n mockEventEmitter.listenerCount.mockClear();\n });\n\n test('should initialize with default values', () => {\n expect(store.isAgentTyping).toBe(false);\n expect(store.status).toBe(ChatRunState.Offline);\n expect(store.isFilePickerEnabled).toBe(false);\n expect(store.file).toBeUndefined();\n expect(store.currentFileMessage).toBeUndefined();\n expect(store.error).toBeUndefined();\n expect(store.endReason).toBeUndefined();\n expect(store.messages).toEqual([]);\n expect(store.scrollCounter).toBe(1);\n expect(store.timer).toBeUndefined();\n expect(store.participants[symbolAgent].isAgent).toBe(true);\n expect(store.participants[symbolAgent].name).toBe('Agent');\n expect(store.participants[symbolAgent].icon).toBe(ChatParticipantIcon.Initials);\n expect(store.participants[symbolUser].isAgent).toBe(false);\n expect(store.participants[symbolUser].name).toBe('User');\n expect(store.participants[symbolUser].icon).toBe(ChatParticipantIcon.Initials);\n // Getters\n expect(store.agent).toBe(store.participants[symbolAgent]);\n expect(store.user).toBe(store.participants[symbolUser]);\n expect(store.isStarted).toBe(false);\n expect(store.isError).toBe(false);\n expect(store.isEnded).toBe(false);\n expect(store.isStarting).toBe(false);\n expect(store.customizations).toEqual({});\n });\n\n test('should subscribe and unsubscribe to events', () => {\n const mockCallback = jest.fn();\n store.on('testEvent', mockCallback);\n expect(mockEventEmitter.on).toHaveBeenCalledWith('testEvent', mockCallback);\n\n store.off('testEvent', mockCallback);\n expect(mockEventEmitter.off).toHaveBeenCalledWith('testEvent', mockCallback);\n });\n\n test('should set customizations context', async () => {\n const customizations = { abc: '123' } as ChatCustomizations;\n store.setCustomizationContext(customizations);\n expect(store.customizations).toEqual(customizations);\n await checkScrollTriggered();\n });\n\n test('should getLastFailedMessages', () => {\n store.addMessage(false, 'message1');\n const m2 = store.addMessage(false, 'message2');\n const m3 = store.addMessage(false, 'message3');\n expect(store.getLastFailedMessages()).toEqual([]);\n\n store.setMessageState(m3, ChatMessageState.Failed);\n let failedMessages = store.getLastFailedMessages();\n expect(failedMessages).toEqual([m3]);\n\n store.setMessageState(m2, ChatMessageState.Failed);\n failedMessages = store.getLastFailedMessages();\n expect(failedMessages).toEqual([m3, m2]);\n });\n\n describe('with file messages', () => {\n test('should set file', () => {\n const file = mockFile();\n store.setFile(file);\n expect(store.file).toEqual(file);\n\n store.setFile(undefined);\n expect(store.file).toBeUndefined();\n });\n\n test('should trigger MobX reactions when file changes', () => {\n const file = mockFile();\n const reactions: (FileDescriptor | undefined)[] = [];\n\n // Set up autorun to track file changes\n const dispose = autorun(() => {\n reactions.push(store.file);\n });\n\n // Initial run should capture undefined\n expect(reactions).toHaveLength(1);\n expect(reactions[0]).toBeUndefined();\n\n // Setting file should trigger reaction\n store.setFile(file);\n expect(reactions).toHaveLength(2);\n expect(reactions[1]).toEqual(file);\n\n // Unsetting file should trigger reaction\n store.setFile(undefined);\n expect(reactions).toHaveLength(3);\n expect(reactions[2]).toBeUndefined();\n\n // Clean up\n dispose();\n });\n\n test('should set file picker enabled state', async () => {\n store.setFile(mockFile());\n store.setFilePickerEnabled(true);\n expect(store.isFilePickerEnabled).toBe(true);\n expect(store.file).toBeUndefined();\n await checkScrollTriggered();\n\n store.setFile(mockFile());\n store.setFilePickerEnabled(false);\n expect(store.isFilePickerEnabled).toBe(false);\n expect(store.file).toBeUndefined();\n await checkScrollTriggered();\n });\n });\n\n describe('with chat errors', () => {\n test('should set error', async () => {\n store.setError('Test error', {\n title: 'Test error title',\n recoverStrategy: { recoverButtonTitle: 'Test error button' },\n data: { some: 'data' },\n });\n expect(store.error?.toJSON()).toEqual({\n data: { some: 'data' },\n message: 'Test error',\n name: 'ChatError',\n recoverStrategy: {\n recoverButtonTitle: 'Test error button',\n },\n title: 'Test error title',\n });\n expect(store.status).toBe(ChatRunState.Error);\n expect(store.isError).toBe(true);\n await checkScrollTriggered();\n });\n\n test('should reset error', async () => {\n store.setError('Test error');\n store.resetError(ChatRunState.Started);\n expect(store.error).toBeUndefined();\n expect(store.status).toBe(ChatRunState.Started);\n await checkScrollTriggered();\n });\n });\n\n describe('with messages', () => {\n function expectText(message: ChatMessageModelBase, expected: string) {\n expect(message.type).toBe('message');\n expect((message as ChatMessageModelText).message).toBe(expected);\n }\n\n test('should add message without sound', async () => {\n store.addMessageWelcome('welcome');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(0);\n });\n\n test('should add message', async () => {\n store.setIncomingSound('non-existing-sound.mp3');\n store.setIncomingSound('non-existing-sound2.mp3');\n\n // Welcome message\n store.addMessageWelcome('welcome');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(1);\n\n // Incoming message\n store.addMessage(true, 'message1');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2);\n\n // Outgoing message\n store.addMessage(false, 'message2');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2); // No sound for outgoing messages\n\n // File message\n store.addMessageFile({\n file: new File([], 'fileName'),\n displayName: 'displayName',\n });\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2); // No sound for outgoing messages\n\n expect(store.messages.length).toBe(4);\n expect(store.messages[0].participant.isAgent).toBe(true);\n expect((store.messages[0] as ChatMessageModelWelcome).message).toBe('welcome');\n expect(store.messages[1].participant.isAgent).toBe(true);\n expectText(store.messages[1], 'message1');\n expect(store.messages[2].participant.isAgent).toBe(false);\n expectText(store.messages[2], 'message2');\n expect(store.messages[3].participant.isAgent).toBe(false);\n expect(store.messages[3].type).toBe('file');\n });\n\n test('should addMessageTimeout', async () => {\n // Adding timeout message should not happen when no messages are present\n store.addMessageTimeout();\n expect(store.messages.length).toBe(0);\n\n // Adding timeout message should not happen when no non-welcome messages are present\n store.addMessageWelcome('welcome');\n store.addMessageTimeout();\n expect(store.messages.length).toBe(1);\n expect(store.messages[0].type).toBe('welcome');\n\n // Adding timeout message should happen when at least one message is present\n store.addMessage(true, 'message1');\n store.addMessageTimeout();\n expect(store.messages.length).toBe(3);\n expect(store.messages.at(-1)?.type).toBe('timeout');\n\n // Adding new message should dismiss the timeout message\n store.addMessage(true, 'message2');\n expect(store.messages.some(message => message.type === 'timeout')).toBe(false);\n await checkScrollTriggered();\n });\n });\n\n test('should configure', () => {\n store.configure({\n agentIcon: ChatParticipantIcon.Bot,\n agentName: 'Test Agent',\n });\n expect(store.participants[symbolAgent].icon).toBe(ChatParticipantIcon.Bot);\n expect(store.participants[symbolAgent].name).toBe('Test Agent');\n });\n\n describe('with chat events', () => {\n test('should run', async () => {\n // Without subscription: should throw an error\n mockEventEmitter.listeners.mockImplementation(() => []);\n await expect(store.run()).rejects.toThrow(\n \"No listeners for ChatUiEvent.eventRun ('eventRun')\"\n );\n\n const spyConfigure = jest.spyOn(store, 'configure');\n mockEmit();\n\n await store.run(\n {\n agentIcon: ChatParticipantIcon.Bot,\n agentName: 'Test Agent',\n },\n 'chat data'\n );\n\n expect(spyConfigure).toHaveBeenCalled();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventRun,\n expect.any(Function),\n expect.any(Function),\n 'chat data'\n );\n });\n\n test('should recover', async () => {\n mockEmit();\n store.setError('Test error');\n await store.recover();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventRecover,\n expect.any(Function),\n expect.any(Function),\n new ChatError('Test error')\n );\n });\n\n test('should destroy', async () => {\n const spyReset = jest.spyOn(store, 'reset');\n mockEmit();\n await store.destroy();\n expect(spyReset).toHaveBeenCalledWith();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventDestroy,\n expect.any(Function),\n expect.any(Function)\n );\n });\n\n test('should restart', async () => {\n const spyReset = jest.spyOn(store, 'reset');\n mockEmit();\n await store.restart();\n expect(spyReset).toHaveBeenCalledWith();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventRestart,\n expect.any(Function),\n expect.any(Function)\n );\n });\n\n test('should cancelChat', async () => {\n mockEmit();\n await store.cancelChat();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventCancel,\n expect.any(Function),\n expect.any(Function)\n );\n });\n\n test('should endChat', async () => {\n mockEmit();\n await store.endChat(ChatEndReason.ByAgent);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventEndChat,\n expect.any(Function),\n expect.any(Function),\n ChatEndReason.ByAgent\n );\n });\n\n test('should chasitorTyping', async () => {\n mockEmit();\n await store.chasitorTyping(false);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventChasitorTyping,\n expect.any(Function),\n expect.any(Function),\n false\n );\n\n await store.chasitorTyping(true);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventChasitorTyping,\n expect.any(Function),\n expect.any(Function),\n true\n );\n });\n\n test('should sendMessageText', async () => {\n mockEmit();\n await store.sendMessageText('Hello, world!');\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSend,\n expect.any(Function),\n expect.any(Function),\n expect.objectContaining({\n message: 'Hello, world!',\n type: 'message',\n state: ChatMessageState.Delivering,\n })\n );\n expect(store.messages.length).toBe(1);\n expect(store.messages[0].type).toBe('message');\n expect((store.messages[0] as ChatMessageModelText).message).toBe('Hello, world!');\n await checkScrollTriggered();\n });\n\n test('should sendMessageText with file', async () => {\n mockEmit();\n const file = mockFile();\n store.setFilePickerEnabled(true);\n store.setFile(file);\n await store.sendMessageText('Hello, world!');\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSendFile,\n expect.any(Function),\n expect.any(Function),\n store.currentFileMessage,\n file,\n expect.objectContaining({\n message: 'Hello, world!',\n type: 'message',\n state: ChatMessageState.Delivering,\n })\n );\n expect(store.messages.length).toBe(2);\n expect(store.messages[0].type).toBe('file');\n expect(store.messages[1].type).toBe('message');\n expect((store.messages[1] as ChatMessageModelText).message).toBe('Hello, world!');\n expect(store.currentFileMessage).toBeDefined();\n await checkScrollTriggered();\n });\n\n test('should sendMessageText empty', async () => {\n mockEmit();\n await store.sendMessageText(' ');\n expect(mockEventEmitter.emit).not.toHaveBeenCalled();\n });\n\n test('should sendMessageRetry', async () => {\n mockEmit();\n\n store.setError('Test error');\n const message = store.addMessage(true, 'message1');\n store.setMessageState(message, ChatMessageState.Failed);\n\n const p = store.sendMessageRetry(message);\n\n expect(message.state).toBe(ChatMessageState.Delivering);\n await p;\n expect(store.isError).toBe(false);\n expect(store.status).toBe(ChatRunState.Started);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSendRetry,\n expect.any(Function),\n expect.any(Function),\n message\n );\n expect(message.state).toBe(ChatMessageState.Delivering);\n await checkScrollTriggered();\n });\n\n test('should sendMessageFileRetry', async () => {\n mockEmit();\n\n store.setError('Test error');\n const fileMessage = store.addMessageFile({\n file: new File([], 'fileName'),\n displayName: 'displayName',\n });\n store.setMessageState(fileMessage, ChatMessageState.Failed);\n\n const p = store.sendMessageFileRetry(fileMessage);\n\n expect(fileMessage.state).toBe(ChatMessageState.Delivering);\n await p;\n expect(store.isError).toBe(false);\n expect(store.status).toBe(ChatRunState.Started);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSendFileRetry,\n expect.any(Function),\n expect.any(Function),\n fileMessage\n );\n expect(fileMessage.state).toBe(ChatMessageState.Delivering);\n await checkScrollTriggered();\n });\n });\n\n test('should setTimer', () => {\n store.setTimer({ secondsLeft: 10, secondsTotal: 20 });\n expect(store.timer).toEqual({\n secondsLeft: 10,\n secondsTotal: 20,\n });\n });\n\n test('should setAgentTyping', async () => {\n store.setAgentTyping(true);\n expect(store.isAgentTyping).toBe(true);\n await checkScrollTriggered();\n\n store.setAgentTyping(false);\n expect(store.isAgentTyping).toBe(false);\n await checkScrollTriggered();\n });\n\n test('should setEndReason', async () => {\n store.setEndReason(ChatEndReason.ByTimeout);\n expect(store.endReason).toBe(ChatEndReason.ByTimeout);\n await checkScrollTriggered();\n });\n\n test('should setEndedChatState', async () => {\n store.isFilePickerEnabled = true;\n store.setFile(mockFile());\n store.setEndedChatState(ChatEndReason.ByTimeout);\n expect(store.endReason).toBe(ChatEndReason.ByTimeout);\n expect(store.status).toBe(ChatRunState.Ended);\n expect(store.isAgentTyping).toBe(false);\n expect(store.currentFileMessage).toBeUndefined();\n expect(store.file).toBeUndefined();\n expect(store.isFilePickerEnabled).toBe(false);\n await checkScrollTriggered();\n });\n\n function mockFile() {\n const file: FileDescriptor = {\n file: new File(['content'], 'file.txt', { type: 'text/plain' }),\n displayName: 'file.txt',\n };\n return file;\n }\n\n function mockEmit() {\n mockEventEmitter.listeners.mockImplementation(() => ['1']);\n mockEventEmitter.listenerCount.mockReturnValue(1);\n mockEventEmitter.emit.mockImplementation(async (eventName: string, resolve: () => void) => {\n await Promise.resolve();\n resolve();\n });\n }\n\n async function checkScrollTriggered() {\n const counter = store.scrollCounter;\n await jest.runOnlyPendingTimersAsync();\n expect(counter < store.scrollCounter).toBe(true);\n }\n});\n"],"names":["expect","autorun","ChatEndReason","ChatError","ChatMessageState","ChatParticipantIcon","ChatRunState","initTestContainer","ChatUiEvent","ChatUiStore","symbolAgent","symbolUser","mockAudio","Audio","play","jest","fn","mockResolvedValue","undefined","mockEventEmitter","on","off","emit","listeners","listenerCount","mock","EventEmitter","initContainer","describe","container","store","audioBackup","beforeEach","get","useFakeTimers","setSystemTime","Date","parse","global","mockImplementation","afterEach","useRealTimers","clearAllMocks","mockClear","test","isAgentTyping","toBe","status","Offline","isFilePickerEnabled","file","toBeUndefined","currentFileMessage","error","endReason","messages","toEqual","scrollCounter","timer","participants","isAgent","name","icon","Initials","agent","user","isStarted","isError","isEnded","isStarting","customizations","mockCallback","toHaveBeenCalledWith","abc","setCustomizationContext","checkScrollTriggered","addMessage","m2","m3","getLastFailedMessages","setMessageState","Failed","failedMessages","mockFile","setFile","reactions","dispose","push","toHaveLength","setFilePickerEnabled","setError","title","recoverStrategy","recoverButtonTitle","data","some","toJSON","message","Error","resetError","Started","expectText","expected","type","addMessageWelcome","runOnlyPendingTimersAsync","toHaveBeenCalledTimes","setIncomingSound","addMessageFile","File","displayName","length","participant","addMessageTimeout","at","configure","agentIcon","Bot","agentName","run","rejects","toThrow","spyConfigure","spyOn","mockEmit","toHaveBeenCalled","eventRun","any","Function","recover","eventRecover","spyReset","destroy","eventDestroy","restart","eventRestart","cancelChat","eventCancel","endChat","ByAgent","eventEndChat","chasitorTyping","eventChasitorTyping","sendMessageText","eventMessageSend","objectContaining","state","Delivering","eventMessageSendFile","toBeDefined","not","p","sendMessageRetry","eventMessageSendRetry","fileMessage","sendMessageFileRetry","eventMessageSendFileRetry","setTimer","secondsLeft","secondsTotal","setAgentTyping","setEndReason","ByTimeout","setEndedChatState","Ended","mockReturnValue","eventName","resolve","Promise","counter"],"mappings":"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"}
|