| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 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, [])
- })
|