teamBackgroundFile.spec.js 5.2 KB

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