core-state.spec.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import { describe, expect, it } from 'vitest'
  2. import {
  3. DEFAULT_FILE_VIEWER_STATE_THEME,
  4. DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION,
  5. FILE_VIEWER_PREVIEW_MESSAGES,
  6. applyFileViewerLoadingState,
  7. createFileViewerLoadingController,
  8. createFileViewerLoadingControllerActionHandlers,
  9. createFileViewerEmptyState,
  10. createFileViewerErrorState,
  11. createFileViewerLoadingState,
  12. createFileViewerPreviewLoadingState,
  13. createFileViewerReadyState,
  14. createFileViewerUnsupportedState,
  15. formatFileViewerErrorMessage,
  16. normalizeFileViewerErrorMessage,
  17. resolveFileViewerLoadingTheme,
  18. runFileViewerLoadingControllerAction,
  19. runFileViewerLoadingExtensionSync,
  20. syncFileViewerLoadingControllerState
  21. } from '../packages/core/src'
  22. describe('@file-viewer/core render state helpers', () => {
  23. it('keeps preview process messages framework-neutral', () => {
  24. expect(FILE_VIEWER_PREVIEW_MESSAGES).toEqual({
  25. downloading: '正在下载文件资源...',
  26. streamingPdf: '正在建立 PDF 流式预览...',
  27. reading: '正在解析文件内容...'
  28. })
  29. })
  30. it('creates loading and ready descriptors with stable theme semantics', () => {
  31. expect(createFileViewerPreviewLoadingState('PDF', FILE_VIEWER_PREVIEW_MESSAGES.streamingPdf)).toMatchObject({
  32. state: 'loading',
  33. extension: 'pdf',
  34. title: DEFAULT_FILE_VIEWER_STATE_THEME.label,
  35. message: FILE_VIEWER_PREVIEW_MESSAGES.streamingPdf,
  36. description: DEFAULT_FILE_VIEWER_STATE_THEME.hint,
  37. recoverable: false
  38. })
  39. expect(createFileViewerReadyState('.Docx')).toMatchObject({
  40. state: 'ready',
  41. extension: 'docx',
  42. title: '预览完成',
  43. recoverable: false
  44. })
  45. })
  46. it('creates empty and unsupported descriptors for wrapper fallback UI', () => {
  47. expect(createFileViewerEmptyState()).toMatchObject({
  48. state: 'empty',
  49. extension: '',
  50. title: '暂无文件',
  51. recoverable: true
  52. })
  53. expect(createFileViewerUnsupportedState('foo')).toMatchObject({
  54. state: 'unsupported',
  55. extension: 'foo',
  56. title: '暂不支持在线预览',
  57. message: '不支持.foo格式的在线预览,请下载后预览或转换为支持的格式。',
  58. description: DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION,
  59. recoverable: true
  60. })
  61. })
  62. it('normalizes error messages and descriptors consistently', () => {
  63. expect(normalizeFileViewerErrorMessage(new Error('boom'))).toBe('boom')
  64. expect(formatFileViewerErrorMessage('打印失败', new Error('窗口被拦截'))).toBe('打印失败:窗口被拦截')
  65. expect(createFileViewerErrorState('pdf', new Error('加载失败'))).toMatchObject({
  66. state: 'error',
  67. extension: 'pdf',
  68. title: '预览失败',
  69. message: '加载失败',
  70. recoverable: true
  71. })
  72. })
  73. it('keeps loading state and themes framework-neutral', () => {
  74. expect(resolveFileViewerLoadingTheme('DOCX')).toMatchObject({
  75. badge: 'W',
  76. label: 'Word 文档',
  77. accent: '#2b78f6'
  78. })
  79. expect(resolveFileViewerLoadingTheme('unknown')).toEqual(DEFAULT_FILE_VIEWER_STATE_THEME)
  80. expect(createFileViewerLoadingState('pdf')).toMatchObject({
  81. loading: false,
  82. error: '',
  83. message: '',
  84. theme: {
  85. badge: 'PDF',
  86. label: 'PDF 文档'
  87. },
  88. styleVars: {
  89. '--viewer-accent': '#e5534b',
  90. '--viewer-soft': 'rgba(229, 83, 75, 0.12)'
  91. }
  92. })
  93. const controller = createFileViewerLoadingController('docx')
  94. expect(controller.startLoading(FILE_VIEWER_PREVIEW_MESSAGES.reading)).toMatchObject({
  95. loading: true,
  96. message: FILE_VIEWER_PREVIEW_MESSAGES.reading,
  97. error: ''
  98. })
  99. expect(controller.showError('加载失败')).toMatchObject({
  100. loading: false,
  101. message: '',
  102. error: '加载失败'
  103. })
  104. expect(controller.setExtension('xlsx')).toMatchObject({
  105. theme: {
  106. badge: 'X',
  107. label: 'Excel 表格'
  108. },
  109. styleVars: {
  110. '--viewer-accent': '#21a366'
  111. }
  112. })
  113. expect(controller.resetLoading()).toMatchObject({
  114. loading: false,
  115. message: '',
  116. error: ''
  117. })
  118. const source = controller.startLoading('再次加载')
  119. const target = createFileViewerLoadingState('pdf')
  120. expect(syncFileViewerLoadingControllerState(target, controller)).toBe(target)
  121. expect(target).toMatchObject({
  122. loading: true,
  123. message: '再次加载',
  124. theme: {
  125. badge: 'X',
  126. label: 'Excel 表格'
  127. }
  128. })
  129. const nextTarget = createFileViewerLoadingState('pdf')
  130. expect(runFileViewerLoadingControllerAction(nextTarget, () => source)).toBe(nextTarget)
  131. expect(nextTarget).toMatchObject({
  132. loading: true,
  133. message: '再次加载',
  134. theme: {
  135. badge: 'X',
  136. label: 'Excel 表格'
  137. }
  138. })
  139. expect(runFileViewerLoadingExtensionSync({
  140. target: nextTarget,
  141. controller,
  142. extension: 'dwg'
  143. })).toBe(nextTarget)
  144. expect(nextTarget).toMatchObject({
  145. theme: {
  146. badge: 'CAD',
  147. label: 'CAD 图纸'
  148. },
  149. styleVars: {
  150. '--viewer-accent': '#0f766e'
  151. }
  152. })
  153. expect(applyFileViewerLoadingState(target, source)).toBe(target)
  154. expect(target).toMatchObject({
  155. loading: true,
  156. message: '再次加载',
  157. theme: {
  158. badge: 'X',
  159. label: 'Excel 表格'
  160. }
  161. })
  162. expect(target.theme).not.toBe(source.theme)
  163. expect(target.styleVars).not.toBe(source.styleVars)
  164. })
  165. it('creates loading controller action facades for wrapper targets', () => {
  166. const controller = createFileViewerLoadingController('pdf')
  167. const target = createFileViewerLoadingState('docx')
  168. const actions = createFileViewerLoadingControllerActionHandlers(target, controller)
  169. expect(actions.syncLoadingState()).toBe(target)
  170. expect(target).toMatchObject({
  171. loading: false,
  172. theme: {
  173. badge: 'PDF',
  174. label: 'PDF 文档'
  175. }
  176. })
  177. expect(actions.startLoading('读取中')).toBe(target)
  178. expect(target).toMatchObject({ loading: true, message: '读取中', error: '' })
  179. expect(actions.setLoadingMessage('渲染中')).toBe(target)
  180. expect(target.message).toBe('渲染中')
  181. expect(actions.showError('失败')).toBe(target)
  182. expect(target).toMatchObject({ loading: false, message: '', error: '失败' })
  183. expect(actions.clearError()).toBe(target)
  184. expect(target.error).toBe('')
  185. expect(actions.setExtension('dwg')).toBe(target)
  186. expect(target).toMatchObject({
  187. theme: {
  188. badge: 'CAD',
  189. label: 'CAD 图纸'
  190. }
  191. })
  192. expect(actions.stopLoading()).toBe(target)
  193. expect(target).toMatchObject({ loading: false, message: '' })
  194. expect(actions.resetLoading()).toBe(target)
  195. expect(target).toMatchObject({ loading: false, message: '', error: '' })
  196. })
  197. })