feat(vela): support end-to-end mocked turn cancelation
This commit is contained in:
@@ -154,4 +154,48 @@ describe('voice session shell', () => {
|
||||
expect(socket.sent).toHaveLength(1);
|
||||
expect(JSON.parse(socket.sent[0]).type).toBe('mocked.turn.trigger');
|
||||
});
|
||||
|
||||
it('shows cancel control during an active mocked turn and preserves rendered text after cancel', async () => {
|
||||
render(VoiceSessionShell);
|
||||
|
||||
await fireEvent.click(getByTestId('connect-button'));
|
||||
const socket = MockWebSocket.latest();
|
||||
socket.open();
|
||||
socket.message(createMessageEnvelope('session.ready', { sessionId: 'session-cancel' }));
|
||||
socket.message(createMessageEnvelope('session.state', { value: 'idle' }));
|
||||
|
||||
await waitFor(() => {
|
||||
expect(getByTestId('cancel-turn-button').hasAttribute('disabled')).toBe(true);
|
||||
});
|
||||
|
||||
await fireEvent.click(getByTestId('mocked-turn-button'));
|
||||
|
||||
expect(JSON.parse(socket.sent[0]).type).toBe('mocked.turn.trigger');
|
||||
|
||||
socket.message(createMessageEnvelope('session.state', { value: 'listening' }));
|
||||
socket.message(createMessageEnvelope('transcript.final', { text: 'Keep this transcript.' }));
|
||||
socket.message(createMessageEnvelope('session.state', { value: 'thinking' }));
|
||||
socket.message(createMessageEnvelope('session.state', { value: 'speaking' }));
|
||||
socket.message(createMessageEnvelope('response.text.delta', { text: 'Partial response' }));
|
||||
|
||||
await waitFor(() => {
|
||||
expect(getByTestId('cancel-turn-button').hasAttribute('disabled')).toBe(false);
|
||||
expect(getByTestId('assistant-response').textContent).toBe('Partial response');
|
||||
});
|
||||
|
||||
await fireEvent.click(getByTestId('cancel-turn-button'));
|
||||
|
||||
expect(JSON.parse(socket.sent[1]).type).toBe('response.cancel');
|
||||
|
||||
socket.message(createMessageEnvelope('session.state', { value: 'idle' }));
|
||||
|
||||
await waitFor(() => {
|
||||
expect(getByTestId('mocked-turn-status').textContent).toBe('idle');
|
||||
expect(getByTestId('gateway-session-state').textContent).toBe('idle');
|
||||
expect(getByTestId('cancel-turn-button').hasAttribute('disabled')).toBe(true);
|
||||
expect(getByTestId('mocked-turn-button').hasAttribute('disabled')).toBe(false);
|
||||
expect(getByTestId('user-transcript').textContent).toBe('Keep this transcript.');
|
||||
expect(getByTestId('assistant-response').textContent).toBe('Partial response');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user