84 lines
3.4 KiB
JavaScript
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, [])
|
|
})
|