const assert = require('assert'); const fs = require('fs'); const os = require('os'); const path = require('path'); const express = require('express'); const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'batch-account-delete-')); const Config = require('../src/core/config'); Config.DATA_DIR = tempDir; Config.DB_PATH = path.join(tempDir, 'accounts.db'); const database = require('../src/core/database'); const bitApi = require('../src/core/bit_api'); const originalGetApi = bitApi.getApi; const originalDeleteBrowsersBatch = bitApi.deleteBrowsersBatch; (async () => { let server = null; try { database.initDB(); database.upsertAccount({ email: 'first@example.com', browser_id: 'browser-1' }); database.upsertAccount({ email: 'second@example.com', browser_id: 'browser-2' }); database.upsertAccount({ email: 'without-browser@example.com' }); let deletedBrowserIds = []; bitApi.getApi = () => ({ request: async () => ({ success: true, data: { remark: '' } }), }); bitApi.deleteBrowsersBatch = async browserIds => { deletedBrowserIds = [...browserIds]; return { successCount: browserIds.length, failCount: 0, results: [] }; }; delete require.cache[require.resolve('../src/routes/accounts')]; const accountsRouter = require('../src/routes/accounts'); const app = express(); app.use(express.json()); app.use('/api/accounts', accountsRouter); await new Promise(resolve => { server = app.listen(0, '127.0.0.1', resolve); }); const address = server.address(); const response = await fetch(`http://127.0.0.1:${address.port}/api/accounts`, { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ emails: ['first@example.com', 'second@example.com', 'without-browser@example.com'], }), }); const result = await response.json(); assert.strictEqual(response.ok, true); assert.strictEqual(result.count, 3, '应批量删除所选账号及其浏览器编号'); assert.strictEqual(result.browsersFound, 2); assert.strictEqual(result.browsersDeleted, 2, '应返回实际删除的比特浏览器窗口数'); assert.strictEqual(result.browserDeleteFailed, 0); assert.deepStrictEqual(deletedBrowserIds.sort(), ['browser-1', 'browser-2']); assert.strictEqual(database.getAccount('first@example.com'), null); assert.strictEqual(database.getAccount('second@example.com'), null); assert.strictEqual(database.getAccount('without-browser@example.com'), null); console.log('batch_account_delete.test.js: PASS'); } finally { if (server) await new Promise(resolve => server.close(resolve)); bitApi.getApi = originalGetApi; bitApi.deleteBrowsersBatch = originalDeleteBrowsersBatch; try { database.getDb().close(); } catch (_) {} fs.rmSync(tempDir, { recursive: true, force: true }); } })().catch(error => { console.error(error); process.exitCode = 1; });