'use strict'; const assert = require('assert'); const fs = require('fs'); const path = require('path'); const vm = require('vm'); const db = require('../src/core/database'); const accountsRouter = require('../src/routes/accounts'); function routeHandler(routePath) { const layer = accountsRouter.stack.find(item => ( item.route && item.route.path === routePath && item.route.methods.get )); assert(layer, `未找到 GET ${routePath}`); return layer.route.stack[0].handle; } function invoke(handler, params = {}, remoteAddress = '127.0.0.1') { const response = { statusCode: 200, headers: {}, body: null, status(code) { this.statusCode = code; return this; }, set(name, value) { this.headers[String(name).toLowerCase()] = value; return this; }, json(body) { this.body = body; return this; }, }; handler({ params, socket: { remoteAddress } }, response); return response; } (async () => { const originalGetAccount = db.getAccount; const originalGetAllAccounts = db.getAllAccounts; try { const account = { email: 'ag-credential@example.com', ag_status: '凭证已获取', ag_refresh_token: 'refresh-token-for-test', }; db.getAccount = () => account; db.getAllAccounts = () => [account]; const list = invoke(routeHandler('/')); assert.strictEqual(list.body.data[0].has_ag_credential, true); const local = invoke(routeHandler('/:email/ag-credential'), { email: encodeURIComponent(account.email), }); assert.strictEqual(local.statusCode, 200); assert.strictEqual(local.headers['cache-control'], 'no-store'); assert.strictEqual(local.body.data.type, 'authorized_user'); assert.strictEqual(local.body.data.refresh_token, account.ag_refresh_token); assert(local.body.data.client_id); assert(local.body.data.client_secret); const remote = invoke(routeHandler('/:email/ag-credential'), { email: encodeURIComponent(account.email), }, '192.0.2.25'); assert.strictEqual(remote.statusCode, 403); assert(!JSON.stringify(remote.body).includes(account.ag_refresh_token)); const appSource = fs.readFileSync(path.join(__dirname, '..', 'public', 'app.js'), 'utf8'); const html = fs.readFileSync(path.join(__dirname, '..', 'public', 'index.html'), 'utf8'); assert.match(html, /