Files
shanxia2.0/miniprogram/scripts/test-request-session-guard.mjs

84 lines
3.4 KiB
JavaScript

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