diff --git a/packages/experimental/client-ui-voice-input/tests/audio.client.spec.ts b/packages/experimental/client-ui-voice-input/tests/audio.client.spec.ts index 9baec61c13..e9187dbf0a 100644 --- a/packages/experimental/client-ui-voice-input/tests/audio.client.spec.ts +++ b/packages/experimental/client-ui-voice-input/tests/audio.client.spec.ts @@ -20,6 +20,7 @@ it('reports unavailable recording and denied permission', async () => { vi.stubGlobal('navigator', {}) const recording = new Recording(() => {}) await expect(recording.start()).rejects.toMatchObject({ kind: 'unavailable' }) + await expect(recording.preview()).rejects.toMatchObject({ kind: 'unavailable' }) vi.stubGlobal('MediaRecorder', function RecorderStub() {}) vi.stubGlobal('navigator', { mediaDevices: { getUserMedia: async () => { throw new DOMException('denied', 'NotAllowedError') } } }) await expect(recording.start()).rejects.toMatchObject({ kind: 'permission' }) diff --git a/packages/experimental/client-ui-voice-input/tests/mount.client.spec.ts b/packages/experimental/client-ui-voice-input/tests/mount.client.spec.ts index b119659af1..3287f92a1f 100644 --- a/packages/experimental/client-ui-voice-input/tests/mount.client.spec.ts +++ b/packages/experimental/client-ui-voice-input/tests/mount.client.spec.ts @@ -26,6 +26,7 @@ vi.mock('../src/client/readiness.ts', () => ({ observeReadiness: () => ({ function assertVoiceActions(value: Record): asserts value is Record & VoiceInputInjected { assert(typeof value.openSettings === 'function') assert(typeof value.createRecording === 'function') + assert(typeof value.selectMicrophone === 'function') assert(typeof value.configure === 'function') assert(typeof value.prepare === 'function') assert(typeof value.cancelPreparation === 'function') @@ -128,9 +129,12 @@ it('joins the same audio closure when cancellation overlaps Client plugin withdr const entry = b.ctx.slots.entries('conversation.input.activity').find(item => item.component === VoiceInput)! const actions = entry.inject!() assertVoiceActions(actions) + actions.selectMicrophone({ id: 'usb', label: 'USB microphone' }) + expect(actions.hooks.microphoneDevice.getSnapshot()).toEqual({ id: 'usb', label: 'USB microphone' }) const recording = actions.createRecording() assert(recording instanceof Recording) await recording.start() + expect(audio.getUserMedia.mock.calls.at(-1)?.[0].audio).toMatchObject({ deviceId: { exact: 'usb' } }) cancelled = recording.dispose() const originalDispose = recording.dispose.bind(recording), joined = Promise.withResolvers<{ pending: Promise }>() vi.spyOn(recording, 'dispose').mockImplementationOnce(() => {