ug-js-sdk 3.0.51 → 3.0.57
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/README.md +3 -3
- package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.d.ts +7 -0
- package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js +16 -0
- package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js.map +1 -0
- package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.d.ts +10 -0
- package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js +16 -0
- package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js.map +1 -0
- package/dist/ug-core/__tests__/__mocks__/uuid.d.ts +2 -0
- package/dist/ug-core/__tests__/__mocks__/uuid.js +11 -0
- package/dist/ug-core/__tests__/__mocks__/uuid.js.map +1 -0
- package/dist/ug-core/__tests__/__mocks__/vad-web.d.ts +11 -0
- package/dist/ug-core/__tests__/__mocks__/vad-web.js +19 -0
- package/dist/ug-core/__tests__/__mocks__/vad-web.js.map +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.d.ts +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js +67 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js.map +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.d.ts +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js +185 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js.map +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.d.ts +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js +168 -0
- package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js.map +1 -0
- package/dist/ug-core/__tests__/core/EventEmitter.test.d.ts +1 -0
- package/dist/ug-core/__tests__/core/EventEmitter.test.js +211 -0
- package/dist/ug-core/__tests__/core/EventEmitter.test.js.map +1 -0
- package/dist/ug-core/__tests__/core/Logger.test.d.ts +1 -0
- package/dist/ug-core/__tests__/core/Logger.test.js +162 -0
- package/dist/ug-core/__tests__/core/Logger.test.js.map +1 -0
- package/dist/ug-core/__tests__/core/localStorage.test.d.ts +1 -0
- package/dist/ug-core/__tests__/core/localStorage.test.js +172 -0
- package/dist/ug-core/__tests__/core/localStorage.test.js.map +1 -0
- package/dist/ug-core/__tests__/e2e/replicate-test.e2e.d.ts +15 -0
- package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js +224 -0
- package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js.map +1 -0
- package/dist/ug-core/__tests__/network/WebSocketConnection.test.d.ts +1 -0
- package/dist/ug-core/__tests__/network/WebSocketConnection.test.js +193 -0
- package/dist/ug-core/__tests__/network/WebSocketConnection.test.js.map +1 -0
- package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.d.ts +1 -0
- package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js +228 -0
- package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js.map +1 -0
- package/dist/ug-core/__tests__/setup.d.ts +4 -0
- package/dist/ug-core/__tests__/setup.js +8 -0
- package/dist/ug-core/__tests__/setup.js.map +1 -0
- package/dist/ug-core/conversation-manager/ConversationManager.js +18 -0
- package/dist/ug-core/conversation-manager/ConversationManager.js.map +1 -1
- package/dist/ug-core/conversation-manager/ErrorRetryHandler.d.ts +1 -0
- package/dist/ug-core/conversation-manager/ErrorRetryHandler.js +3 -0
- package/dist/ug-core/conversation-manager/ErrorRetryHandler.js.map +1 -1
- package/dist/ug-core/conversation-manager/types.d.ts +51 -6
- package/dist/ug-core/network/ConversationNetwork.js +12 -6
- package/dist/ug-core/network/ConversationNetwork.js.map +1 -1
- package/dist/ug-core/playback-manager/PlaybackManager.d.ts +104 -0
- package/dist/ug-core/playback-manager/PlaybackManager.js +121 -4
- package/dist/ug-core/playback-manager/PlaybackManager.js.map +1 -1
- package/dist/ug-core/playback-manager/audio-player/AudioPlayer.d.ts +156 -0
- package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js +156 -0
- package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js.map +1 -1
- package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js +3 -1
- package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js.map +1 -1
- package/dist/ug-core/types/index.d.ts +34 -3
- package/dist/ug-core/user-input-manager/AudioRecorder.d.ts +49 -0
- package/dist/ug-core/user-input-manager/AudioRecorder.js +39 -1
- package/dist/ug-core/user-input-manager/AudioRecorder.js.map +1 -1
- package/dist/ug-core/user-input-manager/UserInputManager.d.ts +82 -6
- package/dist/ug-core/user-input-manager/UserInputManager.js +82 -6
- package/dist/ug-core/user-input-manager/UserInputManager.js.map +1 -1
- package/dist/ug-core/user-input-manager/VADManager.d.ts +62 -0
- package/dist/ug-core/user-input-manager/VADManager.js +99 -8
- package/dist/ug-core/user-input-manager/VADManager.js.map +1 -1
- package/dist/ug-js-sdk.mjs +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { EventEmitter } from '../../core/EventEmitter';
|
|
2
|
+
// Mock logger factory
|
|
3
|
+
function createMockLogger() {
|
|
4
|
+
return {
|
|
5
|
+
trace: jest.fn(),
|
|
6
|
+
debug: jest.fn(),
|
|
7
|
+
info: jest.fn(),
|
|
8
|
+
warn: jest.fn(),
|
|
9
|
+
error: jest.fn(),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
describe('EventEmitter', () => {
|
|
13
|
+
let emitter;
|
|
14
|
+
let mockLogger;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
mockLogger = createMockLogger();
|
|
17
|
+
emitter = new EventEmitter(mockLogger);
|
|
18
|
+
});
|
|
19
|
+
describe('on() and emit()', () => {
|
|
20
|
+
it('should register and call a listener when event is emitted', async () => {
|
|
21
|
+
const callback = jest.fn();
|
|
22
|
+
emitter.on('message', callback);
|
|
23
|
+
await emitter.emit('message', { text: 'hello' });
|
|
24
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
25
|
+
expect(callback).toHaveBeenCalledWith({ text: 'hello' });
|
|
26
|
+
});
|
|
27
|
+
it('should call multiple listeners for the same event', async () => {
|
|
28
|
+
const callback1 = jest.fn();
|
|
29
|
+
const callback2 = jest.fn();
|
|
30
|
+
emitter.on('message', callback1);
|
|
31
|
+
emitter.on('message', callback2);
|
|
32
|
+
await emitter.emit('message', { text: 'test' });
|
|
33
|
+
expect(callback1).toHaveBeenCalledTimes(1);
|
|
34
|
+
expect(callback2).toHaveBeenCalledTimes(1);
|
|
35
|
+
expect(callback1).toHaveBeenCalledWith({ text: 'test' });
|
|
36
|
+
expect(callback2).toHaveBeenCalledWith({ text: 'test' });
|
|
37
|
+
});
|
|
38
|
+
it('should handle events with no data', async () => {
|
|
39
|
+
const callback = jest.fn();
|
|
40
|
+
emitter.on('empty', callback);
|
|
41
|
+
await emitter.emit('empty');
|
|
42
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
43
|
+
expect(callback).toHaveBeenCalledWith(undefined);
|
|
44
|
+
});
|
|
45
|
+
it('should handle numeric data', async () => {
|
|
46
|
+
const callback = jest.fn();
|
|
47
|
+
emitter.on('count', callback);
|
|
48
|
+
await emitter.emit('count', 42);
|
|
49
|
+
expect(callback).toHaveBeenCalledWith(42);
|
|
50
|
+
});
|
|
51
|
+
it('should not throw when emitting with no listeners', async () => {
|
|
52
|
+
await expect(emitter.emit('message', { text: 'orphan' })).resolves.toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('off()', () => {
|
|
56
|
+
it('should remove a specific listener', async () => {
|
|
57
|
+
const callback = jest.fn();
|
|
58
|
+
emitter.on('message', callback);
|
|
59
|
+
emitter.off('message', callback);
|
|
60
|
+
await emitter.emit('message', { text: 'test' });
|
|
61
|
+
expect(callback).not.toHaveBeenCalled();
|
|
62
|
+
});
|
|
63
|
+
it('should only remove the specified listener, keeping others', async () => {
|
|
64
|
+
const callback1 = jest.fn();
|
|
65
|
+
const callback2 = jest.fn();
|
|
66
|
+
emitter.on('message', callback1);
|
|
67
|
+
emitter.on('message', callback2);
|
|
68
|
+
emitter.off('message', callback1);
|
|
69
|
+
await emitter.emit('message', { text: 'test' });
|
|
70
|
+
expect(callback1).not.toHaveBeenCalled();
|
|
71
|
+
expect(callback2).toHaveBeenCalledTimes(1);
|
|
72
|
+
});
|
|
73
|
+
it('should not throw when removing a non-existent listener', () => {
|
|
74
|
+
const callback = jest.fn();
|
|
75
|
+
expect(() => emitter.off('message', callback)).not.toThrow();
|
|
76
|
+
});
|
|
77
|
+
it('should not throw when removing from an event with no listeners', () => {
|
|
78
|
+
const callback = jest.fn();
|
|
79
|
+
// Never registered any listener for 'count'
|
|
80
|
+
expect(() => emitter.off('count', callback)).not.toThrow();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('removeAllListeners()', () => {
|
|
84
|
+
it('should remove all listeners for a specific event', async () => {
|
|
85
|
+
const msgCallback1 = jest.fn();
|
|
86
|
+
const msgCallback2 = jest.fn();
|
|
87
|
+
const countCallback = jest.fn();
|
|
88
|
+
emitter.on('message', msgCallback1);
|
|
89
|
+
emitter.on('message', msgCallback2);
|
|
90
|
+
emitter.on('count', countCallback);
|
|
91
|
+
emitter.removeAllListeners('message');
|
|
92
|
+
await emitter.emit('message', { text: 'test' });
|
|
93
|
+
await emitter.emit('count', 5);
|
|
94
|
+
expect(msgCallback1).not.toHaveBeenCalled();
|
|
95
|
+
expect(msgCallback2).not.toHaveBeenCalled();
|
|
96
|
+
expect(countCallback).toHaveBeenCalledWith(5);
|
|
97
|
+
});
|
|
98
|
+
it('should remove all listeners for all events when no event specified', async () => {
|
|
99
|
+
const msgCallback = jest.fn();
|
|
100
|
+
const countCallback = jest.fn();
|
|
101
|
+
emitter.on('message', msgCallback);
|
|
102
|
+
emitter.on('count', countCallback);
|
|
103
|
+
emitter.removeAllListeners();
|
|
104
|
+
await emitter.emit('message', { text: 'test' });
|
|
105
|
+
await emitter.emit('count', 5);
|
|
106
|
+
expect(msgCallback).not.toHaveBeenCalled();
|
|
107
|
+
expect(countCallback).not.toHaveBeenCalled();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('async handlers', () => {
|
|
111
|
+
it('should wait for async handlers to complete', async () => {
|
|
112
|
+
const executionOrder = [];
|
|
113
|
+
emitter.on('message', async () => {
|
|
114
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
115
|
+
executionOrder.push(1);
|
|
116
|
+
});
|
|
117
|
+
emitter.on('message', () => {
|
|
118
|
+
executionOrder.push(2);
|
|
119
|
+
});
|
|
120
|
+
await emitter.emit('message', { text: 'test' });
|
|
121
|
+
// Both handlers should have completed
|
|
122
|
+
expect(executionOrder).toContain(1);
|
|
123
|
+
expect(executionOrder).toContain(2);
|
|
124
|
+
});
|
|
125
|
+
it('should run multiple async handlers in parallel', async () => {
|
|
126
|
+
const startTimes = [];
|
|
127
|
+
emitter.on('message', async () => {
|
|
128
|
+
startTimes.push(Date.now());
|
|
129
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
130
|
+
});
|
|
131
|
+
emitter.on('message', async () => {
|
|
132
|
+
startTimes.push(Date.now());
|
|
133
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
134
|
+
});
|
|
135
|
+
await emitter.emit('message', { text: 'test' });
|
|
136
|
+
// Both should start at nearly the same time (within 10ms)
|
|
137
|
+
expect(Math.abs(startTimes[0] - startTimes[1])).toBeLessThan(10);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('logging', () => {
|
|
141
|
+
it('should log when emitting events', async () => {
|
|
142
|
+
await emitter.emit('message', { text: 'hello' });
|
|
143
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Emitting event: message', {
|
|
144
|
+
data: { text: 'hello' },
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
it('should log without data object when data is undefined', async () => {
|
|
148
|
+
await emitter.emit('empty');
|
|
149
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Emitting event: empty', undefined);
|
|
150
|
+
});
|
|
151
|
+
it('should sanitize ArrayBuffer in logs', async () => {
|
|
152
|
+
const buffer = new ArrayBuffer(1024);
|
|
153
|
+
await emitter.emit('binary', buffer);
|
|
154
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Emitting event: binary', {
|
|
155
|
+
data: '<ArrayBuffer 1024 bytes>',
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
it('should sanitize typed arrays in logs', async () => {
|
|
159
|
+
const uint8Array = new Uint8Array(512);
|
|
160
|
+
// Cast through unknown to test with different data type
|
|
161
|
+
const typedEmitter = emitter;
|
|
162
|
+
await typedEmitter.emit('binary', uint8Array);
|
|
163
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Emitting event: binary', {
|
|
164
|
+
data: '<Uint8Array 512 bytes>',
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
it('should truncate long audio strings in logs', async () => {
|
|
168
|
+
const longAudioString = 'A'.repeat(1000);
|
|
169
|
+
await emitter.emit('audio', { audio: longAudioString, format: 'mp3' });
|
|
170
|
+
const logCall = mockLogger.debug.mock.calls[0];
|
|
171
|
+
expect(logCall[0]).toBe('Emitting event: audio');
|
|
172
|
+
expect(logCall[1].data.audio).toContain('... [1000 chars total]');
|
|
173
|
+
expect(logCall[1].data.format).toBe('mp3');
|
|
174
|
+
});
|
|
175
|
+
it('should not truncate short audio strings', async () => {
|
|
176
|
+
await emitter.emit('audio', { audio: 'short', format: 'mp3' });
|
|
177
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Emitting event: audio', {
|
|
178
|
+
data: { audio: 'short', format: 'mp3' },
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('edge cases', () => {
|
|
183
|
+
it('should handle registering the same callback multiple times', async () => {
|
|
184
|
+
const callback = jest.fn();
|
|
185
|
+
emitter.on('message', callback);
|
|
186
|
+
emitter.on('message', callback);
|
|
187
|
+
await emitter.emit('message', { text: 'test' });
|
|
188
|
+
// Should be called twice since registered twice
|
|
189
|
+
expect(callback).toHaveBeenCalledTimes(2);
|
|
190
|
+
});
|
|
191
|
+
it('should handle rapid emit calls', async () => {
|
|
192
|
+
const callback = jest.fn();
|
|
193
|
+
emitter.on('count', callback);
|
|
194
|
+
await Promise.all([
|
|
195
|
+
emitter.emit('count', 1),
|
|
196
|
+
emitter.emit('count', 2),
|
|
197
|
+
emitter.emit('count', 3),
|
|
198
|
+
]);
|
|
199
|
+
expect(callback).toHaveBeenCalledTimes(3);
|
|
200
|
+
});
|
|
201
|
+
it('should handle null data', async () => {
|
|
202
|
+
// Cast through unknown to test with null data type
|
|
203
|
+
const nullEmitter = emitter;
|
|
204
|
+
const callback = jest.fn();
|
|
205
|
+
nullEmitter.on('test', callback);
|
|
206
|
+
await nullEmitter.emit('test', null);
|
|
207
|
+
expect(callback).toHaveBeenCalledWith(null);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
//# sourceMappingURL=EventEmitter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventEmitter.test.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/core/EventEmitter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { DefaultLogger, StyleRed, StyleGreen, StyleBlue, StyleOrange, StylePurple, StyleTeal, StylePink, StyleBrown, StyleGrey, StyleBlack, } from '@/ug-core/core/Logger';
|
|
2
|
+
describe('Logger', () => {
|
|
3
|
+
let consoleSpy;
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
consoleSpy = {
|
|
6
|
+
info: jest.spyOn(console, 'info').mockImplementation(),
|
|
7
|
+
debug: jest.spyOn(console, 'debug').mockImplementation(),
|
|
8
|
+
warn: jest.spyOn(console, 'warn').mockImplementation(),
|
|
9
|
+
error: jest.spyOn(console, 'error').mockImplementation(),
|
|
10
|
+
trace: jest.spyOn(console, 'trace').mockImplementation(),
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
jest.restoreAllMocks();
|
|
15
|
+
});
|
|
16
|
+
describe('style constants', () => {
|
|
17
|
+
it('should export color style constants', () => {
|
|
18
|
+
expect(StyleRed).toContain('#f44336');
|
|
19
|
+
expect(StyleGreen).toContain('#4caf50');
|
|
20
|
+
expect(StyleBlue).toContain('#2196f3');
|
|
21
|
+
expect(StyleOrange).toContain('#ff9800');
|
|
22
|
+
expect(StylePurple).toContain('#ab47bc');
|
|
23
|
+
expect(StyleTeal).toContain('#009688');
|
|
24
|
+
expect(StylePink).toContain('#e91e63');
|
|
25
|
+
expect(StyleBrown).toContain('#795548');
|
|
26
|
+
expect(StyleGrey).toContain('#607d8b');
|
|
27
|
+
expect(StyleBlack).toContain('#222');
|
|
28
|
+
});
|
|
29
|
+
it('should include font-weight: bold in all styles', () => {
|
|
30
|
+
const styles = [
|
|
31
|
+
StyleRed,
|
|
32
|
+
StyleGreen,
|
|
33
|
+
StyleBlue,
|
|
34
|
+
StyleOrange,
|
|
35
|
+
StylePurple,
|
|
36
|
+
StyleTeal,
|
|
37
|
+
StylePink,
|
|
38
|
+
StyleBrown,
|
|
39
|
+
StyleGrey,
|
|
40
|
+
StyleBlack,
|
|
41
|
+
];
|
|
42
|
+
styles.forEach((style) => {
|
|
43
|
+
expect(style).toContain('font-weight: bold');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('constructor', () => {
|
|
48
|
+
it('should create logger with default options', () => {
|
|
49
|
+
const logger = new DefaultLogger();
|
|
50
|
+
logger.info('test message');
|
|
51
|
+
expect(consoleSpy.info).toHaveBeenCalled();
|
|
52
|
+
});
|
|
53
|
+
it('should create logger with category', () => {
|
|
54
|
+
const logger = new DefaultLogger({ category: 'TestCategory' });
|
|
55
|
+
logger.info('test message');
|
|
56
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
57
|
+
expect(callArgs[0]).toContain('[TestCategory]');
|
|
58
|
+
});
|
|
59
|
+
it('should create logger with custom style', () => {
|
|
60
|
+
const customStyle = 'color: red;';
|
|
61
|
+
const logger = new DefaultLogger({ category: 'Test', style: customStyle });
|
|
62
|
+
logger.info('test message');
|
|
63
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
64
|
+
expect(callArgs).toContain(customStyle);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('log methods', () => {
|
|
68
|
+
let logger;
|
|
69
|
+
beforeEach(() => {
|
|
70
|
+
logger = new DefaultLogger({ category: 'Test' });
|
|
71
|
+
});
|
|
72
|
+
it('should log info messages', () => {
|
|
73
|
+
logger.info('info message');
|
|
74
|
+
expect(consoleSpy.info).toHaveBeenCalled();
|
|
75
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
76
|
+
expect(callArgs[0]).toContain('info message');
|
|
77
|
+
});
|
|
78
|
+
it('should log debug messages', () => {
|
|
79
|
+
logger.debug('debug message');
|
|
80
|
+
expect(consoleSpy.debug).toHaveBeenCalled();
|
|
81
|
+
const callArgs = consoleSpy.debug.mock.calls[0];
|
|
82
|
+
expect(callArgs[0]).toContain('debug message');
|
|
83
|
+
});
|
|
84
|
+
it('should log warn messages', () => {
|
|
85
|
+
logger.warn('warn message');
|
|
86
|
+
expect(consoleSpy.warn).toHaveBeenCalled();
|
|
87
|
+
const callArgs = consoleSpy.warn.mock.calls[0];
|
|
88
|
+
expect(callArgs[0]).toContain('warn message');
|
|
89
|
+
});
|
|
90
|
+
it('should log error messages', () => {
|
|
91
|
+
logger.error('error message');
|
|
92
|
+
expect(consoleSpy.error).toHaveBeenCalled();
|
|
93
|
+
const callArgs = consoleSpy.error.mock.calls[0];
|
|
94
|
+
expect(callArgs[0]).toContain('error message');
|
|
95
|
+
});
|
|
96
|
+
it('should log trace messages', () => {
|
|
97
|
+
logger.trace('trace message');
|
|
98
|
+
expect(consoleSpy.trace).toHaveBeenCalled();
|
|
99
|
+
const callArgs = consoleSpy.trace.mock.calls[0];
|
|
100
|
+
expect(callArgs[0]).toContain('trace message');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('message formatting', () => {
|
|
104
|
+
let logger;
|
|
105
|
+
beforeEach(() => {
|
|
106
|
+
logger = new DefaultLogger({ category: 'TestCategory' });
|
|
107
|
+
});
|
|
108
|
+
it('should include timestamp in messages', () => {
|
|
109
|
+
logger.info('test');
|
|
110
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
111
|
+
// Timestamp format: YYYY-MM-DD HH:MM:SS.mmm
|
|
112
|
+
expect(callArgs[0]).toMatch(/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}/);
|
|
113
|
+
});
|
|
114
|
+
it('should serialize object arguments as pretty JSON', () => {
|
|
115
|
+
const obj = { key: 'value', nested: { a: 1 } };
|
|
116
|
+
logger.info('message', obj);
|
|
117
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
118
|
+
// The last argument should be the serialized object
|
|
119
|
+
const serializedArg = callArgs[callArgs.length - 1];
|
|
120
|
+
expect(serializedArg).toContain('"key": "value"');
|
|
121
|
+
expect(serializedArg).toContain('"nested"');
|
|
122
|
+
});
|
|
123
|
+
it('should handle unserializable objects', () => {
|
|
124
|
+
const circular = {};
|
|
125
|
+
circular.self = circular;
|
|
126
|
+
logger.info('message', circular);
|
|
127
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
128
|
+
const lastArg = callArgs[callArgs.length - 1];
|
|
129
|
+
expect(lastArg).toBe('[Unserializable Object]');
|
|
130
|
+
});
|
|
131
|
+
it('should filter out undefined arguments', () => {
|
|
132
|
+
logger.info('message', undefined, 'valid', undefined);
|
|
133
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
134
|
+
// Should only have message formatting args + 'valid'
|
|
135
|
+
expect(callArgs).not.toContain(undefined);
|
|
136
|
+
});
|
|
137
|
+
it('should not duplicate category if already in message', () => {
|
|
138
|
+
logger.info('[TestCategory] already has category');
|
|
139
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
140
|
+
const message = callArgs[0];
|
|
141
|
+
// Should not have double category
|
|
142
|
+
const matches = message.match(/\[TestCategory\]/g);
|
|
143
|
+
expect(matches?.length).toBe(1);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('logger without category', () => {
|
|
147
|
+
it('should log without category styling', () => {
|
|
148
|
+
const logger = new DefaultLogger();
|
|
149
|
+
logger.info('simple message');
|
|
150
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
151
|
+
expect(callArgs[0]).toContain('simple message');
|
|
152
|
+
expect(callArgs[0]).toMatch(/\d{4}-\d{2}-\d{2}/);
|
|
153
|
+
});
|
|
154
|
+
it('should include additional arguments', () => {
|
|
155
|
+
const logger = new DefaultLogger();
|
|
156
|
+
logger.info('message', { data: 'value' });
|
|
157
|
+
const callArgs = consoleSpy.info.mock.calls[0];
|
|
158
|
+
expect(callArgs.length).toBeGreaterThan(1);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=Logger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.test.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/core/Logger.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { LocalStorage } from '@/ug-core/core/localStorage';
|
|
2
|
+
describe('LocalStorage', () => {
|
|
3
|
+
let mockStorage;
|
|
4
|
+
let originalLocalStorage;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
mockStorage = {};
|
|
7
|
+
originalLocalStorage = global.localStorage;
|
|
8
|
+
// Mock localStorage
|
|
9
|
+
Object.defineProperty(global, 'localStorage', {
|
|
10
|
+
value: {
|
|
11
|
+
getItem: jest.fn((key) => mockStorage[key] ?? null),
|
|
12
|
+
setItem: jest.fn((key, value) => {
|
|
13
|
+
mockStorage[key] = value;
|
|
14
|
+
}),
|
|
15
|
+
removeItem: jest.fn((key) => {
|
|
16
|
+
delete mockStorage[key];
|
|
17
|
+
}),
|
|
18
|
+
clear: jest.fn(() => {
|
|
19
|
+
mockStorage = {};
|
|
20
|
+
}),
|
|
21
|
+
length: 0,
|
|
22
|
+
key: jest.fn(),
|
|
23
|
+
},
|
|
24
|
+
writable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
Object.defineProperty(global, 'localStorage', {
|
|
30
|
+
value: originalLocalStorage,
|
|
31
|
+
writable: true,
|
|
32
|
+
configurable: true,
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('setItem()', () => {
|
|
36
|
+
it('should store a simple string value', () => {
|
|
37
|
+
LocalStorage.setItem('key', 'value');
|
|
38
|
+
expect(localStorage.setItem).toHaveBeenCalledWith('key', 'value');
|
|
39
|
+
expect(mockStorage['key']).toBe('value');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('setWithExpiry()', () => {
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
jest.useFakeTimers();
|
|
45
|
+
jest.setSystemTime(new Date('2024-01-01T00:00:00.000Z'));
|
|
46
|
+
});
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
jest.useRealTimers();
|
|
49
|
+
});
|
|
50
|
+
it('should store value with expiry metadata', () => {
|
|
51
|
+
LocalStorage.setWithExpiry('key', { data: 'test' }, 60000); // 1 minute
|
|
52
|
+
const stored = JSON.parse(mockStorage['key']);
|
|
53
|
+
expect(stored.value).toEqual({ data: 'test' });
|
|
54
|
+
expect(stored.expiry).toBe(Date.now() + 60000);
|
|
55
|
+
});
|
|
56
|
+
it('should use default TTL of 55 minutes when not specified', () => {
|
|
57
|
+
LocalStorage.setWithExpiry('key', 'value');
|
|
58
|
+
const stored = JSON.parse(mockStorage['key']);
|
|
59
|
+
const expectedExpiry = Date.now() + 55 * 60 * 1000;
|
|
60
|
+
expect(stored.expiry).toBe(expectedExpiry);
|
|
61
|
+
});
|
|
62
|
+
it('should handle string values', () => {
|
|
63
|
+
LocalStorage.setWithExpiry('key', 'string value', 60000);
|
|
64
|
+
const stored = JSON.parse(mockStorage['key']);
|
|
65
|
+
expect(stored.value).toBe('string value');
|
|
66
|
+
});
|
|
67
|
+
it('should handle number values', () => {
|
|
68
|
+
LocalStorage.setWithExpiry('key', 42, 60000);
|
|
69
|
+
const stored = JSON.parse(mockStorage['key']);
|
|
70
|
+
expect(stored.value).toBe(42);
|
|
71
|
+
});
|
|
72
|
+
it('should handle null values', () => {
|
|
73
|
+
LocalStorage.setWithExpiry('key', null, 60000);
|
|
74
|
+
const stored = JSON.parse(mockStorage['key']);
|
|
75
|
+
expect(stored.value).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
it('should swallow localStorage quota errors silently', () => {
|
|
78
|
+
;
|
|
79
|
+
localStorage.setItem.mockImplementation(() => {
|
|
80
|
+
throw new Error('QuotaExceededError');
|
|
81
|
+
});
|
|
82
|
+
expect(() => LocalStorage.setWithExpiry('key', 'value')).not.toThrow();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('getWithExpiry()', () => {
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
jest.useFakeTimers();
|
|
88
|
+
jest.setSystemTime(new Date('2024-01-01T00:00:00.000Z'));
|
|
89
|
+
});
|
|
90
|
+
afterEach(() => {
|
|
91
|
+
jest.useRealTimers();
|
|
92
|
+
});
|
|
93
|
+
it('should return null for non-existent key', () => {
|
|
94
|
+
const result = LocalStorage.getWithExpiry('nonexistent');
|
|
95
|
+
expect(result).toBeNull();
|
|
96
|
+
});
|
|
97
|
+
it('should return value when not expired', () => {
|
|
98
|
+
const futureExpiry = Date.now() + 60000;
|
|
99
|
+
mockStorage['key'] = JSON.stringify({ value: 'test', expiry: futureExpiry });
|
|
100
|
+
const result = LocalStorage.getWithExpiry('key');
|
|
101
|
+
expect(result).toBe('test');
|
|
102
|
+
});
|
|
103
|
+
it('should return null and remove item when expired', () => {
|
|
104
|
+
const pastExpiry = Date.now() - 1000;
|
|
105
|
+
mockStorage['key'] = JSON.stringify({ value: 'test', expiry: pastExpiry });
|
|
106
|
+
const result = LocalStorage.getWithExpiry('key');
|
|
107
|
+
expect(result).toBeNull();
|
|
108
|
+
expect(localStorage.removeItem).toHaveBeenCalledWith('key');
|
|
109
|
+
});
|
|
110
|
+
it('should handle complex object values', () => {
|
|
111
|
+
const complexValue = { nested: { data: [1, 2, 3] }, flag: true };
|
|
112
|
+
const futureExpiry = Date.now() + 60000;
|
|
113
|
+
mockStorage['key'] = JSON.stringify({ value: complexValue, expiry: futureExpiry });
|
|
114
|
+
const result = LocalStorage.getWithExpiry('key');
|
|
115
|
+
expect(result).toEqual(complexValue);
|
|
116
|
+
});
|
|
117
|
+
it('should throw and remove item on malformed JSON', () => {
|
|
118
|
+
mockStorage['key'] = 'not valid json';
|
|
119
|
+
expect(() => LocalStorage.getWithExpiry('key')).toThrow();
|
|
120
|
+
expect(localStorage.removeItem).toHaveBeenCalledWith('key');
|
|
121
|
+
});
|
|
122
|
+
it('should handle missing expiry field as expired', () => {
|
|
123
|
+
mockStorage['key'] = JSON.stringify({ value: 'test' });
|
|
124
|
+
const result = LocalStorage.getWithExpiry('key');
|
|
125
|
+
// expiry will be 0, which is in the past
|
|
126
|
+
expect(result).toBeNull();
|
|
127
|
+
});
|
|
128
|
+
it('should handle non-number expiry as expired', () => {
|
|
129
|
+
mockStorage['key'] = JSON.stringify({ value: 'test', expiry: 'not a number' });
|
|
130
|
+
const result = LocalStorage.getWithExpiry('key');
|
|
131
|
+
expect(result).toBeNull();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('removeItem()', () => {
|
|
135
|
+
it('should remove item from storage', () => {
|
|
136
|
+
mockStorage['key'] = 'value';
|
|
137
|
+
LocalStorage.removeItem('key');
|
|
138
|
+
expect(localStorage.removeItem).toHaveBeenCalledWith('key');
|
|
139
|
+
});
|
|
140
|
+
it('should not throw for non-existent key', () => {
|
|
141
|
+
expect(() => LocalStorage.removeItem('nonexistent')).not.toThrow();
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('integration scenarios', () => {
|
|
145
|
+
beforeEach(() => {
|
|
146
|
+
jest.useFakeTimers();
|
|
147
|
+
jest.setSystemTime(new Date('2024-01-01T00:00:00.000Z'));
|
|
148
|
+
});
|
|
149
|
+
afterEach(() => {
|
|
150
|
+
jest.useRealTimers();
|
|
151
|
+
});
|
|
152
|
+
it('should allow setting and getting with expiry', () => {
|
|
153
|
+
LocalStorage.setWithExpiry('session', { userId: '123' }, 3600000);
|
|
154
|
+
const result = LocalStorage.getWithExpiry('session');
|
|
155
|
+
expect(result).toEqual({ userId: '123' });
|
|
156
|
+
});
|
|
157
|
+
it('should expire items after TTL passes', () => {
|
|
158
|
+
LocalStorage.setWithExpiry('session', { userId: '123' }, 3600000);
|
|
159
|
+
// Advance time past expiry
|
|
160
|
+
jest.advanceTimersByTime(3600001);
|
|
161
|
+
const result = LocalStorage.getWithExpiry('session');
|
|
162
|
+
expect(result).toBeNull();
|
|
163
|
+
});
|
|
164
|
+
it('should allow overwriting existing keys', () => {
|
|
165
|
+
LocalStorage.setWithExpiry('key', 'first', 60000);
|
|
166
|
+
LocalStorage.setWithExpiry('key', 'second', 60000);
|
|
167
|
+
const result = LocalStorage.getWithExpiry('key');
|
|
168
|
+
expect(result).toBe('second');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
//# sourceMappingURL=localStorage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localStorage.test.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/core/localStorage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E Test for Replicate Image Generation
|
|
3
|
+
*
|
|
4
|
+
* Tests all 3 generation methods:
|
|
5
|
+
* 1. Text-to-image (prompt only)
|
|
6
|
+
* 2. Kontext-Pro (reference image + prompt)
|
|
7
|
+
* 3. Redux (reference image + prompt + model: 'redux')
|
|
8
|
+
*
|
|
9
|
+
* Run with:
|
|
10
|
+
* UG_API_URL="https://pug.dev.uglabs.app" \
|
|
11
|
+
* UG_API_KEY="your-key" \
|
|
12
|
+
* UG_FEDERATED_ID="your-id" \
|
|
13
|
+
* npx tsx src/ug-core/__tests__/e2e/replicate-test.e2e.ts
|
|
14
|
+
*/
|
|
15
|
+
export {};
|