teamBackgroundFile.test.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. const assert = require('node:assert/strict')
  2. const fs = require('node:fs')
  3. const path = require('node:path')
  4. const vm = require('node:vm')
  5. const rules = require('../utils/teamBackgroundFile')
  6. assert.equal(rules.validateEnterpriseWebsite(' 无 '), '')
  7. assert.equal(rules.validateEnterpriseWebsite('https://example.com'), '')
  8. assert.match(rules.validateEnterpriseWebsite('ftp://example.com'), /http/)
  9. assert.equal(rules.validateBackgroundFile({ name: 'brief.PDF', size: 1 }), '')
  10. assert.match(rules.validateBackgroundFile({ name: 'brief.zip', size: 1 }), /类型/)
  11. assert.match(rules.validateBackgroundFile({ name: 'brief.pdf', size: 50 * 1024 * 1024 + 1 }), /50MB/)
  12. console.log('team background rules: PASS')
  13. const transportPath = path.join(__dirname, '../http/teamBackgroundFile.js')
  14. function loadTransport({ api = {}, uni = {}, wx = {} } = {}) {
  15. const source = fs.readFileSync(transportPath, 'utf8')
  16. .replace(/import\s+\{\s*BaseApi\s*\}\s+from\s+['"]\.\/baseApi\.js['"]\s*/, '')
  17. .replace(/import\s+api\s+from\s+['"]\.\/index\.js['"]\s*/, '')
  18. .replace(/export\s+function\s+/g, 'function ')
  19. .replace(/export\s+const\s+/g, 'const ')
  20. .concat(`
  21. module.exports = {
  22. uploadTeamBackgroundFile,
  23. listTeamBackgroundFiles,
  24. disableTeamBackgroundFile,
  25. createTeamBackgroundSession,
  26. downloadTeamBackgroundFile
  27. }
  28. `)
  29. const module = { exports: {} }
  30. vm.runInNewContext(source, {
  31. module,
  32. exports: module.exports,
  33. BaseApi: 'https://api.example.test/app',
  34. api,
  35. uni,
  36. wx
  37. }, { filename: transportPath })
  38. return module.exports
  39. }
  40. function assertNoIdentityFields(value) {
  41. if (!value || typeof value !== 'object') return
  42. for (const [key, child] of Object.entries(value)) {
  43. assert.ok(!['source', 'coachId', 'uploaderId'].includes(key), `unexpected identity field: ${key}`)
  44. assertNoIdentityFields(child)
  45. }
  46. }
  47. function createUploadHarness(response, progress = 37) {
  48. let request
  49. const progressValues = []
  50. const uni = {
  51. getStorageSync(key) {
  52. assert.equal(key, 'token')
  53. return 'token-123'
  54. },
  55. uploadFile(options) {
  56. request = options
  57. return {
  58. onProgressUpdate(callback) {
  59. callback({ progress })
  60. setImmediate(() => options.success(response))
  61. }
  62. }
  63. }
  64. }
  65. const transport = loadTransport({ uni })
  66. return {
  67. request: () => request,
  68. progressValues,
  69. promise: transport.uploadTeamBackgroundFile(12, '/tmp/brief.pdf', value => progressValues.push(value))
  70. }
  71. }
  72. async function testUploadTransport() {
  73. const stringHarness = createUploadHarness({
  74. statusCode: 200,
  75. data: JSON.stringify({ code: 0, data: { id: 7 } })
  76. })
  77. assert.equal((await stringHarness.promise).id, 7)
  78. assert.equal(stringHarness.request().url, 'https://api.example.test/app/core/user/team/12/background-files')
  79. assert.equal(stringHarness.request().filePath, '/tmp/brief.pdf')
  80. assert.equal(stringHarness.request().name, 'file')
  81. assert.equal(stringHarness.request().header.token, 'token-123')
  82. assert.deepEqual(stringHarness.progressValues, [37])
  83. assertNoIdentityFields(stringHarness.request())
  84. const objectHarness = createUploadHarness({ statusCode: 200, data: { code: 0, data: { id: 8 } } })
  85. assert.equal((await objectHarness.promise).id, 8)
  86. const statusHarness = createUploadHarness({ statusCode: 500, data: { code: 0 } })
  87. await assert.rejects(statusHarness.promise, /上传失败,请重试/)
  88. const codeHarness = createUploadHarness({ statusCode: 200, data: { code: 9, msg: '上传业务失败' } })
  89. await assert.rejects(codeHarness.promise, /上传业务失败/)
  90. }
  91. async function testApiTransport() {
  92. const calls = []
  93. const api = {
  94. get(...args) {
  95. calls.push(['get', ...args])
  96. return Promise.resolve({ data: { code: 0, data: [{ id: 1 }] } })
  97. },
  98. del(...args) {
  99. calls.push(['del', ...args])
  100. return Promise.resolve({ data: { code: 0, data: true } })
  101. },
  102. post(...args) {
  103. calls.push(['post', ...args])
  104. return Promise.resolve({ data: { code: 0, data: { sessionId: 'session-1' } } })
  105. }
  106. }
  107. const transport = loadTransport({ api })
  108. assert.deepEqual(await transport.listTeamBackgroundFiles(12), [{ id: 1 }])
  109. assert.equal(await transport.disableTeamBackgroundFile(12, 34), true)
  110. assert.deepEqual(await transport.createTeamBackgroundSession(12), { sessionId: 'session-1' })
  111. assert.equal(calls[0][0], 'get')
  112. assert.equal(calls[0][1], '/core/user/team/12/background-files')
  113. assert.equal(calls[1][0], 'del')
  114. assert.equal(calls[1][1], '/core/user/team/12/background-files/34')
  115. assert.equal(calls[2][0], 'post')
  116. assert.equal(calls[2][1], '/core/user/team/12/background-upload-session')
  117. for (const call of calls) {
  118. assert.equal(Object.keys(call[2]).length, 0)
  119. assert.equal(call[3], false)
  120. assertNoIdentityFields(call)
  121. }
  122. const failingTransport = loadTransport({
  123. api: {
  124. get: () => Promise.resolve({ data: { code: 3, msg: '列表业务失败' } })
  125. }
  126. })
  127. await assert.rejects(failingTransport.listTeamBackgroundFiles(12), /列表业务失败/)
  128. assert.equal(transport.uploadTeamBackgroundFile.length, 2)
  129. assert.equal(transport.listTeamBackgroundFiles.length, 1)
  130. assert.equal(transport.disableTeamBackgroundFile.length, 2)
  131. assert.equal(transport.createTeamBackgroundSession.length, 1)
  132. assert.equal(transport.downloadTeamBackgroundFile.length, 2)
  133. }
  134. function createDownloadHarness({ result, downloadError, openError } = {}) {
  135. let request
  136. let openRequest
  137. const uni = {
  138. getStorageSync(key) {
  139. assert.equal(key, 'token')
  140. return 'token-456'
  141. },
  142. downloadFile(options) {
  143. request = options
  144. setImmediate(() => {
  145. if (downloadError) options.fail(downloadError)
  146. else options.success(result)
  147. })
  148. }
  149. }
  150. const wx = {
  151. openDocument(options) {
  152. openRequest = options
  153. setImmediate(() => {
  154. if (openError) options.fail(openError)
  155. else options.success('opened')
  156. })
  157. }
  158. }
  159. const transport = loadTransport({ uni, wx })
  160. return {
  161. request: () => request,
  162. openRequest: () => openRequest,
  163. promise: transport.downloadTeamBackgroundFile(12, 34)
  164. }
  165. }
  166. async function testDownloadTransport() {
  167. const successHarness = createDownloadHarness({ result: { statusCode: 200, tempFilePath: '/tmp/download.pdf' } })
  168. assert.equal(await successHarness.promise, 'opened')
  169. assert.equal(successHarness.request().url, 'https://api.example.test/app/core/user/team/12/background-files/34/download')
  170. assert.equal(successHarness.request().header.token, 'token-456')
  171. assert.equal(successHarness.openRequest().filePath, '/tmp/download.pdf')
  172. assert.equal(successHarness.openRequest().showMenu, true)
  173. assertNoIdentityFields(successHarness.request())
  174. const statusHarness = createDownloadHarness({ result: { statusCode: 500 } })
  175. await assert.rejects(statusHarness.promise, /下载失败,请重试/)
  176. assert.equal(statusHarness.openRequest(), undefined)
  177. const downloadError = new Error('download network error')
  178. const downloadFailureHarness = createDownloadHarness({ downloadError })
  179. await assert.rejects(downloadFailureHarness.promise, /download network error/)
  180. const openError = new Error('open document error')
  181. const openFailureHarness = createDownloadHarness({
  182. result: { statusCode: 200, tempFilePath: '/tmp/download.pdf' },
  183. openError
  184. })
  185. await assert.rejects(openFailureHarness.promise, /open document error/)
  186. }
  187. async function main() {
  188. await testUploadTransport()
  189. await testApiTransport()
  190. await testDownloadTransport()
  191. console.log('team background transport: PASS')
  192. }
  193. main().catch(error => {
  194. console.error(error)
  195. process.exitCode = 1
  196. })