import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import test from 'node:test' const code = readFileSync(new URL('../utils/request.js', import.meta.url), 'utf8') .replace(/^import[^\n]+\n/gm, '') .replace(/export /g, '') .replace("await import('@/stores/user')", 'await loadUserStore()') function context() { const storage = new Map([['token', 'old-token'], ['refresh', 'old-refresh'], ['user', { id: 'old-user' }]]) const calls = { requests: [], clears: 0, routes: [], toasts: [] } const store = { clearLoginInfo: () => { calls.clears++ storage.clear() } } let resolveImport const imported = new Promise((resolve) => { resolveImport = resolve }) const uni = { getStorageSync: (key) => storage.get(key), removeStorageSync: (key) => storage.delete(key), request: (options) => calls.requests.push(options), showToast: (options) => calls.toasts.push(options), reLaunch: ({ url }) => calls.routes.push(url) } const request = new Function('TOKEN_KEY', 'REFRESH_TOKEN_KEY', 'USER_INFO_KEY', 'resolveApiBase', 'uni', 'getCurrentPages', 'loadUserStore', `${code}; return request`)( 'token', 'refresh', 'user', () => 'https://portal.invalid/api', uni, () => [{ route: 'pages/login/login' }], () => imported) return { storage, calls, request, finishImport: () => resolveImport({ useUserStore: () => store }) } } const tick = () => new Promise((resolve) => setImmediate(resolve)) test('old HTTP 401 cannot erase a new login session', async () => { const p = context() const result = p.request({ url: '/web/wechat-notices/binding' }).catch((error) => error) p.storage.set('token', 'new-token') p.storage.set('user', { id: 'new-user' }) await p.calls.requests[0].success({ statusCode: 401, data: { detail: 'expired' } }) p.finishImport() await result await tick() assert.equal(p.storage.get('token'), 'new-token') assert.deepEqual(p.storage.get('user'), { id: 'new-user' }) assert.equal(p.calls.clears, 0) assert.deepEqual(p.calls.routes, []) }) test('old business 401 cannot erase a new login session', async () => { const p = context() const result = p.request({ url: '/web/wechat-notices/binding' }).catch((error) => error) p.storage.set('token', 'new-token') await p.calls.requests[0].success({ statusCode: 200, data: { code: 401 } }) p.finishImport() await result await tick() assert.equal(p.storage.get('token'), 'new-token') assert.equal(p.calls.clears, 0) }) test('same session 401 still clears expired credentials', async () => { const p = context() const result = p.request({ url: '/web/wechat-notices/binding' }).catch((error) => error) await p.calls.requests[0].success({ statusCode: 401, data: {} }) p.finishImport() const error = await result await tick() assert.equal(error.name, 'UnauthorizedError') assert.equal(p.storage.get('token'), undefined) assert.equal(p.calls.clears, 1) }) test('login completed during deferred store import is not cleared', async () => { const p = context() const result = p.request({ url: '/web/wechat-notices/binding' }).catch((error) => error) await p.calls.requests[0].success({ statusCode: 401, data: {} }) p.storage.set('token', 'new-token') p.storage.set('user', { id: 'new-user' }) p.finishImport() await result await tick() assert.equal(p.storage.get('token'), 'new-token') assert.equal(p.calls.clears, 0) assert.deepEqual(p.calls.routes, []) })