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) })