Skip to content

src/__tests__/disconnect.test.ts

35 lines · 1.8 KB · TypeScript
Raw
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<string, string> = {
	'./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, [])
})