vue-public-api-hook.spec.ts 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { describe, expect, it } from 'vitest'
  2. import { computed, ref } from 'vue'
  3. import { useViewerPublicApi } from '../packages/components/vue3/src/package/components/FileViewer/hooks/useViewerPublicApi'
  4. import type {
  5. FileViewerOperationAvailability,
  6. FileViewerSearchState,
  7. FileViewerZoomState
  8. } from '../packages/components/vue3/src/package/common/type'
  9. const createAvailability = (): FileViewerOperationAvailability => ({
  10. download: true,
  11. print: true,
  12. exportHtml: false,
  13. zoom: true,
  14. zoomIn: true,
  15. zoomOut: false,
  16. zoomReset: true
  17. })
  18. const createSearchState = (query = ''): FileViewerSearchState => ({
  19. query,
  20. total: query ? 1 : 0,
  21. currentIndex: query ? 0 : -1,
  22. current: null,
  23. matches: []
  24. })
  25. const createZoomState = (): FileViewerZoomState => ({
  26. scale: 1,
  27. label: '100%',
  28. canZoomIn: true,
  29. canZoomOut: false,
  30. canReset: false
  31. })
  32. describe('Vue FileViewer public api hook', () => {
  33. it('exposes a stable api surface and clones operation availability snapshots', async () => {
  34. const availability = ref(createAvailability())
  35. const calls: string[] = []
  36. const api = useViewerPublicApi({
  37. operationAvailability: computed(() => availability.value),
  38. downloadOriginalFile: async () => { calls.push('download') },
  39. printRenderedHtml: async () => { calls.push('print') },
  40. exportRenderedHtml: async () => { calls.push('export-html') },
  41. zoomIn: async () => createZoomState(),
  42. zoomOut: async () => createZoomState(),
  43. resetZoom: async () => createZoomState(),
  44. getZoomState: createZoomState,
  45. getScrollContainer: () => null,
  46. searchDocument: async query => createSearchState(query),
  47. clearDocumentSearch: async () => createSearchState(),
  48. nextSearchResult: async () => createSearchState('next'),
  49. previousSearchResult: async () => createSearchState('previous'),
  50. getSearchState: () => createSearchState('current'),
  51. collectDocumentAnchors: async () => [],
  52. scrollToAnchor: async () => true,
  53. scrollToLine: async () => true,
  54. getDocumentTextChunks: () => []
  55. })
  56. expect(Object.keys(api).sort()).toEqual([
  57. 'clearDocumentSearch',
  58. 'collectDocumentAnchors',
  59. 'downloadOriginalFile',
  60. 'exportRenderedHtml',
  61. 'getDocumentTextChunks',
  62. 'getOperationAvailability',
  63. 'getScrollContainer',
  64. 'getSearchState',
  65. 'getZoomState',
  66. 'nextSearchResult',
  67. 'previousSearchResult',
  68. 'printRenderedHtml',
  69. 'resetZoom',
  70. 'scrollToAnchor',
  71. 'scrollToLine',
  72. 'searchDocument',
  73. 'zoomIn',
  74. 'zoomOut'
  75. ])
  76. const snapshot = api.getOperationAvailability()
  77. snapshot.download = false
  78. expect(api.getOperationAvailability().download).toBe(true)
  79. availability.value = {
  80. ...availability.value,
  81. print: false
  82. }
  83. expect(api.getOperationAvailability().print).toBe(false)
  84. await api.downloadOriginalFile()
  85. await api.printRenderedHtml()
  86. await api.exportRenderedHtml()
  87. expect(calls).toEqual(['download', 'print', 'export-html'])
  88. await expect(api.searchDocument('pdf')).resolves.toMatchObject({ query: 'pdf', total: 1 })
  89. })
  90. })