63 lines
2.5 KiB
JavaScript
63 lines
2.5 KiB
JavaScript
const { test } = require('node:test')
|
|
const assert = require('node:assert/strict')
|
|
const fs = require('node:fs')
|
|
const vm = require('node:vm')
|
|
const vue = require('vue')
|
|
const ts = require('../../backend/node_modules/typescript')
|
|
const settle = () => new Promise(setImmediate)
|
|
|
|
function setup(api) {
|
|
const auth = vue.reactive({ user: { id: 'user-1' }, activeTenant: '1', profile: null, activeTenantData: {} })
|
|
const timers = new Map()
|
|
let nextTimer = 0
|
|
const scope = vue.effectScope()
|
|
const context = vm.createContext({
|
|
exports: {}, AbortController,
|
|
require: name => name === '@vueuse/core' ? { createSharedComposable: fn => fn } : require(name),
|
|
ref: vue.ref, computed: vue.computed, watch: vue.watch, onScopeDispose: vue.onScopeDispose,
|
|
useAuthStore: () => auth, useNuxtApp: () => ({ $api: api }),
|
|
setTimeout: fn => { timers.set(++nextTimer, fn); return nextTimer }, clearTimeout: id => timers.delete(id),
|
|
})
|
|
const source = fs.readFileSync(`${__dirname}/../composables/useDocumentInboxCount.ts`, 'utf8')
|
|
vm.runInContext(ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 } }).outputText, context)
|
|
const counter = scope.run(() => context.exports.useDocumentInboxCount())
|
|
return { auth, counter, timers, close: () => scope.stop() }
|
|
}
|
|
|
|
test('menu count refreshes after filing and cancels its timer when navigation is unmounted', async () => {
|
|
let count = 3
|
|
const ui = setup(async () => ({ total: count }))
|
|
await settle()
|
|
assert.equal(ui.counter.count.value, 3)
|
|
assert.equal(ui.timers.size, 1)
|
|
count = 2
|
|
await ui.counter.refresh()
|
|
assert.equal(ui.counter.count.value, 2)
|
|
assert.equal(ui.timers.size, 1)
|
|
ui.close()
|
|
assert.equal(ui.timers.size, 0)
|
|
})
|
|
|
|
test('previous tenant responses cannot replace the current badge; portal and logout clear it', async t => {
|
|
let finish
|
|
let requests = 0
|
|
const ui = setup(() => ++requests === 1 ? new Promise(resolve => { finish = resolve }) : Promise.resolve({ total: 2 }))
|
|
t.after(ui.close)
|
|
ui.auth.activeTenant = '2'
|
|
assert.equal(ui.counter.count.value, 0)
|
|
await settle()
|
|
finish({ total: 999 })
|
|
await settle()
|
|
assert.equal(ui.counter.count.value, 2)
|
|
ui.auth.profile = { customer_for_portal: 15 }
|
|
await settle()
|
|
assert.equal(ui.counter.count.value, 0)
|
|
assert.equal(ui.timers.size, 0)
|
|
ui.auth.profile = null
|
|
await settle()
|
|
assert.equal(ui.counter.count.value, 2)
|
|
ui.auth.user = null
|
|
await settle()
|
|
assert.equal(ui.counter.count.value, 0)
|
|
})
|