const assert = require('node:assert/strict') const fs = require('node:fs') const path = require('node:path') const vm = require('node:vm') const rules = require('../utils/teamBackgroundFile') assert.equal(rules.validateEnterpriseWebsite(' 无 '), '') assert.equal(rules.validateEnterpriseWebsite('https://example.com'), '') assert.match(rules.validateEnterpriseWebsite('ftp://example.com'), /http/) assert.equal(rules.validateBackgroundFile({ name: 'brief.PDF', size: 1 }), '') assert.match(rules.validateBackgroundFile({ name: 'brief.zip', size: 1 }), /类型/) assert.match(rules.validateBackgroundFile({ name: 'brief.pdf', size: 50 * 1024 * 1024 + 1 }), /50MB/) console.log('team background rules: PASS') const transportPath = path.join(__dirname, '../http/teamBackgroundFile.js') function loadTransport({ api = {}, uni = {}, wx = {} } = {}) { const source = fs.readFileSync(transportPath, 'utf8') .replace(/import\s+\{\s*BaseApi\s*\}\s+from\s+['"]\.\/baseApi\.js['"]\s*/, '') .replace(/import\s+api\s+from\s+['"]\.\/index\.js['"]\s*/, '') .replace(/export\s+function\s+/g, 'function ') .replace(/export\s+const\s+/g, 'const ') .concat(` module.exports = { uploadTeamBackgroundFile, listTeamBackgroundFiles, disableTeamBackgroundFile, createTeamBackgroundSession, downloadTeamBackgroundFile } `) const module = { exports: {} } vm.runInNewContext(source, { module, exports: module.exports, BaseApi: 'https://api.example.test/app', api, uni, wx }, { filename: transportPath }) return module.exports } function assertNoIdentityFields(value) { if (!value || typeof value !== 'object') return for (const [key, child] of Object.entries(value)) { assert.ok(!['source', 'coachId', 'uploaderId'].includes(key), `unexpected identity field: ${key}`) assertNoIdentityFields(child) } } function createUploadHarness(response, progress = 37) { let request const progressValues = [] const uni = { getStorageSync(key) { assert.equal(key, 'token') return 'token-123' }, uploadFile(options) { request = options return { onProgressUpdate(callback) { callback({ progress }) setImmediate(() => options.success(response)) } } } } const transport = loadTransport({ uni }) return { request: () => request, progressValues, promise: transport.uploadTeamBackgroundFile(12, '/tmp/brief.pdf', value => progressValues.push(value)) } } async function testUploadTransport() { const stringHarness = createUploadHarness({ statusCode: 200, data: JSON.stringify({ code: 0, data: { id: 7 } }) }) assert.equal((await stringHarness.promise).id, 7) assert.equal(stringHarness.request().url, 'https://api.example.test/app/core/user/team/12/background-files') assert.equal(stringHarness.request().filePath, '/tmp/brief.pdf') assert.equal(stringHarness.request().name, 'file') assert.equal(stringHarness.request().header.token, 'token-123') assert.deepEqual(stringHarness.progressValues, [37]) assertNoIdentityFields(stringHarness.request()) const objectHarness = createUploadHarness({ statusCode: 200, data: { code: 0, data: { id: 8 } } }) assert.equal((await objectHarness.promise).id, 8) const statusHarness = createUploadHarness({ statusCode: 500, data: { code: 0 } }) await assert.rejects(statusHarness.promise, /上传失败,请重试/) const codeHarness = createUploadHarness({ statusCode: 200, data: { code: 9, msg: '上传业务失败' } }) await assert.rejects(codeHarness.promise, /上传业务失败/) } async function testApiTransport() { const calls = [] const api = { get(...args) { calls.push(['get', ...args]) return Promise.resolve({ data: { code: 0, data: [{ id: 1 }] } }) }, del(...args) { calls.push(['del', ...args]) return Promise.resolve({ data: { code: 0, data: true } }) }, post(...args) { calls.push(['post', ...args]) return Promise.resolve({ data: { code: 0, data: { sessionId: 'session-1' } } }) } } const transport = loadTransport({ api }) assert.deepEqual(await transport.listTeamBackgroundFiles(12), [{ id: 1 }]) assert.equal(await transport.disableTeamBackgroundFile(12, 34), true) assert.deepEqual(await transport.createTeamBackgroundSession(12), { sessionId: 'session-1' }) assert.equal(calls[0][0], 'get') assert.equal(calls[0][1], '/core/user/team/12/background-files') assert.equal(calls[1][0], 'del') assert.equal(calls[1][1], '/core/user/team/12/background-files/34') assert.equal(calls[2][0], 'post') assert.equal(calls[2][1], '/core/user/team/12/background-upload-session') for (const call of calls) { assert.equal(Object.keys(call[2]).length, 0) assert.equal(call[3], false) assertNoIdentityFields(call) } const failingTransport = loadTransport({ api: { get: () => Promise.resolve({ data: { code: 3, msg: '列表业务失败' } }) } }) await assert.rejects(failingTransport.listTeamBackgroundFiles(12), /列表业务失败/) assert.equal(transport.uploadTeamBackgroundFile.length, 2) assert.equal(transport.listTeamBackgroundFiles.length, 1) assert.equal(transport.disableTeamBackgroundFile.length, 2) assert.equal(transport.createTeamBackgroundSession.length, 1) assert.equal(transport.downloadTeamBackgroundFile.length, 2) } function createDownloadHarness({ result, downloadError, openError } = {}) { let request let openRequest const uni = { getStorageSync(key) { assert.equal(key, 'token') return 'token-456' }, downloadFile(options) { request = options setImmediate(() => { if (downloadError) options.fail(downloadError) else options.success(result) }) } } const wx = { openDocument(options) { openRequest = options setImmediate(() => { if (openError) options.fail(openError) else options.success('opened') }) } } const transport = loadTransport({ uni, wx }) return { request: () => request, openRequest: () => openRequest, promise: transport.downloadTeamBackgroundFile(12, 34) } } async function testDownloadTransport() { const successHarness = createDownloadHarness({ result: { statusCode: 200, tempFilePath: '/tmp/download.pdf' } }) assert.equal(await successHarness.promise, 'opened') assert.equal(successHarness.request().url, 'https://api.example.test/app/core/user/team/12/background-files/34/download') assert.equal(successHarness.request().header.token, 'token-456') assert.equal(successHarness.openRequest().filePath, '/tmp/download.pdf') assert.equal(successHarness.openRequest().showMenu, true) assertNoIdentityFields(successHarness.request()) const statusHarness = createDownloadHarness({ result: { statusCode: 500 } }) await assert.rejects(statusHarness.promise, /下载失败,请重试/) assert.equal(statusHarness.openRequest(), undefined) const downloadError = new Error('download network error') const downloadFailureHarness = createDownloadHarness({ downloadError }) await assert.rejects(downloadFailureHarness.promise, /download network error/) const openError = new Error('open document error') const openFailureHarness = createDownloadHarness({ result: { statusCode: 200, tempFilePath: '/tmp/download.pdf' }, openError }) await assert.rejects(openFailureHarness.promise, /open document error/) } async function main() { await testUploadTransport() await testApiTransport() await testDownloadTransport() console.log('team background transport: PASS') } main().catch(error => { console.error(error) process.exitCode = 1 })