import assert from 'node:assert/strict' import { registerHooks } from 'node:module' import { test } from 'node:test' // Disconnect with storage, secrets, and Amazon faked; the order of steps is the contract. const fake: any = globalThis fake.steps = [] as string[] fake.device = { locale: 'ca' } const mocks: Record = { './device.ts': `export const loadDevice=async()=>globalThis.device; export const clearDevice=async()=>{globalThis.steps.push('clear-device')}; export const clearArchiveSigning=async()=>{globalThis.steps.push('clear-signing')}`, './secrets.ts': `export const deleteSecret=async(name)=>{globalThis.steps.push('delete:'+name);return true}`, './tokens.ts': `export const deregisterDevice=async()=>{globalThis.steps.push('deregister');return true}`, } registerHooks({ resolve(specifier, context, next) { return mocks[specifier] && context.parentURL?.endsWith('/disconnect.ts') ? { url: `mock:${specifier}`, shortCircuit: true } : next(specifier, context) }, load(url, context, next) { return url.startsWith('mock:') ? { format: 'module', shortCircuit: true, source: mocks[url.slice(5)] } : next(url, context) }, }) const { disconnect } = await import('../disconnect.ts') test('the device leaves Amazon before its tokens are deleted, then everything is forgotten', async () => { assert.deepEqual(await disconnect(), { wasConnected: true, deviceRemoved: true, secretsDeleted: true }) assert.equal(fake.steps[0], 'deregister') assert.deepEqual(new Set(fake.steps.slice(1)), new Set(['delete:audible-access-token', 'delete:audible-refresh-token', 'clear-device', 'clear-signing'])) }) test('nothing connected means nothing to do', async () => { fake.device = null fake.steps = [] assert.deepEqual(await disconnect(), { wasConnected: false, deviceRemoved: false, secretsDeleted: false }) assert.deepEqual(fake.steps, []) })