import {it,expect} from 'vitest' import {ConfirmationService} from '../src/main/confirmations' import type {ConfirmationRequest} from '../src/shared/types' const options={title:'删除记录?',description:'删除本批次',variant:'danger' as const,confirmLabel:'删除记录'} it('操作等待匹配确认,其他请求的回复不能批准当前操作',async()=>{ let request:ConfirmationRequest|undefined const service=new ConfirmationService(value=>{request=value}) const answer=service.ask(options) expect(service.hasPending).toBe(true);expect(request).toMatchObject(options) expect(()=>service.answer('wrong-request',true)).toThrow('已失效') expect(service.hasPending).toBe(true) service.answer(request!.id,true) expect(await answer).toBe(true);expect(service.hasPending).toBe(false) expect(()=>service.answer(request!.id,true)).toThrow('已失效') }) it('取消与界面失联均不批准操作',async()=>{ let request:ConfirmationRequest|undefined const service=new ConfirmationService(value=>{request=value}) const cancelled=service.ask(options);service.answer(request!.id,false);expect(await cancelled).toBe(false) const interrupted=service.ask(options);service.cancel();expect(await interrupted).toBe(false) service.cancel();expect(service.hasPending).toBe(false) }) it('重复请求不替换等待中的确认窗口',async()=>{ let request:ConfirmationRequest|undefined const service=new ConfirmationService(value=>{request=value}) const first=service.ask(options),id=request!.id await expect(service.ask({...options,title:'另一个请求'})).rejects.toThrow('当前确认') expect(request!.id).toBe(id) service.answer(id,true);expect(await first).toBe(true) }) it('发送失败后可重新请求确认',async()=>{ let failed=true,request:ConfirmationRequest|undefined const service=new ConfirmationService(value=>{if(failed)throw Error('window unavailable');request=value}) await expect(service.ask(options)).rejects.toThrow('window unavailable');expect(service.hasPending).toBe(false) failed=false const answer=service.ask(options);service.answer(request!.id,false);expect(await answer).toBe(false) })