teamBackgroundFile.spec.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { ACCEPT, formatFileSize, validateBackgroundFile } from '@/utils/teamBackgroundFile'
  2. import request from '@/utils/request2'
  3. import {
  4. completePublicUpload,
  5. createTeamBackgroundSession,
  6. disableTeamBackgroundFile,
  7. downloadTeamBackgroundFile,
  8. getPublicUploadSession,
  9. listTeamBackgroundFiles,
  10. uploadPublicTeamBackgroundFile,
  11. uploadTeamBackgroundFile,
  12. verifyPublicUploadCode
  13. } from '@/api/teamBackgroundFile'
  14. jest.mock('@/utils/request2', () => jest.fn())
  15. class TestFormData {
  16. constructor() {
  17. this.entries = []
  18. }
  19. append(name, value) {
  20. this.entries.push([name, value])
  21. }
  22. }
  23. global.FormData = TestFormData
  24. beforeEach(() => {
  25. request.mockReset()
  26. })
  27. test('accepts all approved extensions case-insensitively', () => {
  28. for (const ext of ['pdf','doc','docx','xls','xlsx','ppt','pptx','txt','md','csv']) {
  29. expect(validateBackgroundFile({ name: `file.${ext.toUpperCase()}`, size: 1 })).toBe('')
  30. }
  31. })
  32. test('rejects archives, 50MB overflow and names over 255 chars', () => {
  33. expect(validateBackgroundFile({ name: 'file.zip', size: 1 })).toContain('文件类型')
  34. expect(validateBackgroundFile({ name: 'file.pdf', size: 50 * 1024 * 1024 + 1 })).toContain('50MB')
  35. expect(validateBackgroundFile({ name: `${'a'.repeat(252)}.pdf`, size: 1 })).toContain('255')
  36. })
  37. test('accepts a filename containing exactly 255 characters', () => {
  38. const name = `${'a'.repeat(251)}.pdf`
  39. expect(name).toHaveLength(255)
  40. expect(validateBackgroundFile({ name, size: 1 })).toBe('')
  41. })
  42. test('accepts a file containing exactly 50MiB', () => {
  43. expect(validateBackgroundFile({ name: 'file.pdf', size: 50 * 1024 * 1024 })).toBe('')
  44. })
  45. test('rejects missing, unnamed and zero-size files', () => {
  46. expect(validateBackgroundFile()).toBe('请选择非空文件')
  47. expect(validateBackgroundFile({ name: '', size: 1 })).toBe('请选择非空文件')
  48. expect(validateBackgroundFile({ name: 'empty.pdf', size: 0 })).toBe('请选择非空文件')
  49. })
  50. test('exports the exact file-picker accept list', () => {
  51. expect(ACCEPT).toBe('.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.md,.csv')
  52. })
  53. test('formats byte counts across byte, KB and MB thresholds', () => {
  54. expect(formatFileSize(0)).toBe('0 B')
  55. expect(formatFileSize(1)).toBe('1 B')
  56. expect(formatFileSize(1023)).toBe('1023 B')
  57. expect(formatFileSize(1024)).toBe('1 KB')
  58. expect(formatFileSize(1536)).toBe('1.5 KB')
  59. expect(formatFileSize(1024 * 1024)).toBe('1 MB')
  60. expect(formatFileSize(1.5 * 1024 * 1024)).toBe('1.5 MB')
  61. })
  62. test('uses backend-controlled authenticated file routes', () => {
  63. listTeamBackgroundFiles(7)
  64. createTeamBackgroundSession(7)
  65. disableTeamBackgroundFile(7, 12)
  66. downloadTeamBackgroundFile(7, 12)
  67. expect(request.mock.calls).toEqual([
  68. [{ url: '/core/userteam/7/background-files', method: 'get' }],
  69. [{ url: '/core/userteam/7/background-upload-session', method: 'post' }],
  70. [{ url: '/core/userteam/7/background-files/12', method: 'delete' }],
  71. [{ url: '/core/userteam/7/background-files/12/download', method: 'get', responseType: 'blob' }]
  72. ])
  73. })
  74. test('uploads authenticated files without client-supplied identity fields', () => {
  75. const file = { name: 'brief.pdf' }
  76. uploadTeamBackgroundFile(7, file)
  77. const config = request.mock.calls[0][0]
  78. expect(config).toEqual({
  79. url: '/core/userteam/7/background-files',
  80. method: 'post',
  81. data: expect.any(TestFormData)
  82. })
  83. expect(config.data.entries).toEqual([['file', file]])
  84. })
  85. test('uses fixed public routes and sends only server-issued credentials', () => {
  86. const file = { name: 'brief.pdf' }
  87. const onProgress = jest.fn()
  88. getPublicUploadSession('session-token')
  89. verifyPublicUploadCode('123456')
  90. completePublicUpload('upload-token')
  91. uploadPublicTeamBackgroundFile('upload-token', file, onProgress)
  92. const uploadData = request.mock.calls[3][0].data
  93. expect(request.mock.calls).toEqual([
  94. [{ url: '/public/team-background-upload/session', method: 'get', params: { token: 'session-token' } }],
  95. [{ url: '/public/team-background-upload/verify', method: 'post', data: { code: '123456' } }],
  96. [{ url: '/public/team-background-upload/complete', method: 'post', headers: { 'X-Upload-Token': 'upload-token' } }],
  97. [{
  98. url: '/public/team-background-upload/files',
  99. method: 'post',
  100. data: uploadData,
  101. headers: { 'X-Upload-Token': 'upload-token' },
  102. onUploadProgress: onProgress
  103. }]
  104. ])
  105. expect(uploadData).toEqual(expect.any(TestFormData))
  106. expect(uploadData.entries).toEqual([['file', file]])
  107. })