import assert from 'node:assert/strict'; import { after, test } from 'node:test'; import { fileURLToPath } from 'node:url'; import { createServer } from 'vite'; const vite = await createServer({ root: fileURLToPath(new URL('..', import.meta.url)), configFile: false, optimizeDeps: { noDiscovery: true }, server: { middlewareMode: true, hmr: false }, appType: 'custom' }); after(async () => { await vite.close(); delete globalThis.plus; delete globalThis.uni; }); test('App recording falls back before RecorderManager starts when microphone permission is denied', async () => { let recorderRequested = false; globalThis.plus = { android: { requestPermissions: (_permissions, success) => { success({ deniedAlways: ['android.permission.RECORD_AUDIO'] }); } } }; globalThis.uni = { getRecorderManager: () => { recorderRequested = true; throw new Error('RecorderManager should not start when permission is denied'); } }; const { startSpeechCapture } = await vite.ssrLoadModule('/src/services/speech-capture.ts'); let fallbackError; const session = await startSpeechCapture({ onCapture: () => assert.fail('denied permission must not return a recording'), onError: (error) => { fallbackError = error; } }); assert.equal(session, null); assert.equal(recorderRequested, false); assert.ok(fallbackError instanceof Error); });