| import { describe, it, expect, vi, beforeEach } from 'vitest'; |
| import { requestSnapshotStore } from '../request-snapshot'; |
| import type { Message } from '../core/types'; |
|
|
| describe('requestSnapshotStore', () => { |
| beforeEach(() => { |
| requestSnapshotStore.setEnabled(false); |
| requestSnapshotStore.clear(); |
| }); |
|
|
| it('does not capture when disabled', () => { |
| requestSnapshotStore.capture({ |
| messages: [{ role: 'user', content: 'hi' }], |
| provider: 'openrouter', |
| model: 'qwen/qwen3.6-35b-a3b', |
| }); |
| expect(requestSnapshotStore.getSnapshot()).toBeNull(); |
| }); |
|
|
| it('captures the latest request when enabled', () => { |
| requestSnapshotStore.setEnabled(true); |
| requestSnapshotStore.capture({ messages: [{ role: 'user', content: 'first' }], provider: 'p', model: 'm' }); |
| requestSnapshotStore.capture({ messages: [{ role: 'user', content: 'second' }], provider: 'p', model: 'm' }); |
|
|
| const snap = requestSnapshotStore.getSnapshot(); |
| expect(snap).not.toBeNull(); |
| expect(snap!.messages).toEqual([{ role: 'user', content: 'second' }]); |
| expect(snap!.timestamp).toBeGreaterThan(0); |
| }); |
|
|
| it('notifies subscribers on capture and returns a stable snapshot reference', () => { |
| requestSnapshotStore.setEnabled(true); |
| const listener = vi.fn(); |
| const unsubscribe = requestSnapshotStore.subscribe(listener); |
|
|
| requestSnapshotStore.capture({ messages: [], provider: 'p', model: 'm' }); |
| expect(listener).toHaveBeenCalledTimes(1); |
|
|
| |
| expect(requestSnapshotStore.getSnapshot()).toBe(requestSnapshotStore.getSnapshot()); |
|
|
| unsubscribe(); |
| requestSnapshotStore.capture({ messages: [], provider: 'p', model: 'm' }); |
| expect(listener).toHaveBeenCalledTimes(1); |
| }); |
|
|
| it('notifies subscribers on clear and toggling enabled state', () => { |
| requestSnapshotStore.setEnabled(true); |
| requestSnapshotStore.capture({ messages: [], provider: 'p', model: 'm' }); |
|
|
| const listener = vi.fn(); |
| requestSnapshotStore.subscribe(listener); |
| requestSnapshotStore.clear(); |
| expect(requestSnapshotStore.getSnapshot()).toBeNull(); |
| expect(listener).toHaveBeenCalledTimes(1); |
|
|
| requestSnapshotStore.setEnabled(false); |
| expect(requestSnapshotStore.isEnabled()).toBe(false); |
| expect(listener).toHaveBeenCalledTimes(2); |
| }); |
|
|
| it('deep-copies captured messages so later mutation cannot corrupt the snapshot', () => { |
| requestSnapshotStore.setEnabled(true); |
| const messages: Message[] = [{ |
| role: 'assistant', |
| content: 'original', |
| tool_calls: [{ id: 'a', type: 'function', function: { name: 'bash', arguments: '{}' } }], |
| }]; |
| requestSnapshotStore.capture({ messages, provider: 'p', model: 'm' }); |
|
|
| messages[0].content = 'mutated'; |
| messages[0].tool_calls![0].id = 'mutated'; |
|
|
| const snap = requestSnapshotStore.getSnapshot()!; |
| expect(snap.messages[0].content).toBe('original'); |
| expect(snap.messages[0].tool_calls![0].id).toBe('a'); |
| }); |
| }); |
|
|