'use strict'; const { test } = require('node:test'), assert = require('node:assert/strict'); const fs = require('node:fs'), path = require('node:path'), vm = require('node:vm'); test('logout succeeds for an expired session, while a failed server revocation remains visible', async () => { const storage = new Map(), app = { globalData: {} }; let logoutFailure; const module = { exports: {} }; vm.runInNewContext(fs.readFileSync(path.join(__dirname, '../utils/api.js'), 'utf8'), { module, Promise, Date, setTimeout, getApp: () => app, my: { setStorageSync: ({ key, data }) => storage.set(key, data), getStorageSync: ({ key }) => ({ data: storage.get(key) }), removeStorageSync: ({ key }) => storage.delete(key) }, require(name) { if (name === '../config') return { transport: 'direct' }; if (name === './transport') return { request: async route => { if (route.endsWith('/challenge')) return { ok: true, challenge: 'challenge' }; if (route.endsWith('/session')) return { ok: true, token: 'token', user: { id: 'alice' } }; if (route.endsWith('/logout')) { if (logoutFailure === 'network') throw Error('network unavailable'); return { ok: false, http_status: 401, message: 'session expired' }; } throw Error('unexpected route: ' + route); } }; throw Error('unexpected dependency: ' + name); } }); const api = module.exports; await api.login(true); logoutFailure = 'network'; await assert.rejects(api.logout(), /network unavailable/); assert.equal(api.user().id, 'alice'); app.globalData.photos = ['private-photo']; app.globalData.payload = { private: true }; logoutFailure = 'expired'; await api.logout(); assert.equal(api.user(), null); assert.equal(storage.size, 0); assert.equal(app.globalData.photos, null); assert.equal(app.globalData.payload, null); });