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