|
| 1 | +import test from 'node:test'; |
| 2 | +import assert from 'node:assert/strict'; |
| 3 | +import {createDiscordRpcTransport} from '../src/discord-rpc.js'; |
| 4 | +for(const mode of ['sync','async','throwing','rejecting','pending']){ |
| 5 | + test(`failed RPC login destroys discarded client (${mode}) and preserves error`,async()=>{ |
| 6 | + let destroyed=0,created=0,timer; |
| 7 | + const error=new Error('fixture login failed'); |
| 8 | + const factory=()=>({login:async()=>{throw error;},setActivity:async()=>{},clearActivity:async()=>{},destroy:()=>{destroyed++;if(mode==='async')return Promise.resolve();if(mode==='throwing')throw new Error('cleanup');if(mode==='rejecting')return Promise.reject(new Error('cleanup'));if(mode==='pending')return new Promise(()=>{});}}); |
| 9 | + const transport=createDiscordRpcTransport({clientId:'123456789012345678',createClient:async()=>{created++;return factory();}}); |
| 10 | + try{ |
| 11 | + for(let i=1;i<=2;i++){ |
| 12 | + await assert.rejects(Promise.race([transport.connect(),new Promise((_,reject)=>{timer=setTimeout(()=>reject(new Error('cleanup blocked')),100);})]),e=>e===error); |
| 13 | + clearTimeout(timer);assert.equal(destroyed,i);assert.equal(created,i);assert.equal(transport.connected,false); |
| 14 | + } |
| 15 | + await transport.close();assert.equal(destroyed,2); |
| 16 | + }finally{clearTimeout(timer);} |
| 17 | + }); |
| 18 | +} |
| 19 | +test('failed RPC login without destroy preserves error',async()=>{ |
| 20 | + const error=new Error('fixture');const transport=createDiscordRpcTransport({clientId:'123456789012345678',createClient:async()=>({login:async()=>{throw error;},setActivity:async()=>{},clearActivity:async()=>{}})}); |
| 21 | + await assert.rejects(transport.connect(),e=>e===error); |
| 22 | +}); |
0 commit comments