image-registration.client.spec.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /** Image metadata, keyed slot, dictionary, and disposal registration. */
  2. import { Context } from '@deepseek-ai/cordis'
  3. import { afterEach, describe, expect, it, vi } from 'vitest'
  4. import { DocumentPreviewRegistry } from '../src/client/document/registry.ts'
  5. import { ImageBody } from '../src/client/image/ImageBody.tsx'
  6. import { apply, IMAGE_BODY_ID, IMAGE_EXTENSIONS, imageBodyDefinition } from '../src/client/image/index.ts'
  7. import { en, zh } from '../src/client/image/locales.ts'
  8. let dispose: (() => Promise<void>) | undefined
  9. afterEach(async () => { await dispose?.(); dispose = undefined })
  10. describe('image registration', () => {
  11. it('claims common image suffixes as a builtin complete-byte renderer without wrap', () => {
  12. const title = vi.fn(() => 'localized image')
  13. const definition = imageBodyDefinition(title)
  14. expect(definition).toEqual({
  15. id: IMAGE_BODY_ID,
  16. extensions: IMAGE_EXTENSIONS,
  17. priority: 'builtin',
  18. title,
  19. loading: 'bytes-complete',
  20. wrap: false,
  21. })
  22. expect(title).not.toHaveBeenCalled()
  23. expect(definition.title()).toBe('localized image')
  24. })
  25. it('registers its dictionary and matching keyed body, then removes every contribution', async () => {
  26. const ctx = new Context()
  27. const registry = new DocumentPreviewRegistry()
  28. const dictionaries = new Map<string, unknown>()
  29. const bodies = new Map<string, unknown>()
  30. const register = vi.fn((options: { key: string }, body: unknown) => {
  31. bodies.set(options.key, body)
  32. return () => { bodies.delete(options.key) }
  33. })
  34. ctx.provide('documentPreviews', registry)
  35. ctx.provide('slots', { inject: (_key: string, callback: () => () => void) => callback(), register } as never)
  36. ctx.provide('locale', {
  37. bind: () => (key: keyof typeof en) => en[key],
  38. register: (name: string, value: unknown) => {
  39. dictionaries.set(name, value)
  40. return () => { dictionaries.delete(name) }
  41. },
  42. } as never)
  43. const fiber = ctx.plugin({ apply })
  44. dispose = async () => { await fiber.dispose() }
  45. await fiber.await()
  46. for (const extension of IMAGE_EXTENSIONS) {
  47. expect(registry.candidates(`ASSET.${extension}`).map(entry => entry.id)).toEqual([IMAGE_BODY_ID])
  48. }
  49. expect(registry.getSnapshot()[0]?.title()).toBe(en.title)
  50. expect(dictionaries.get('sidebarImage')).toEqual({ zh, en })
  51. expect(register).toHaveBeenCalledExactlyOnceWith(
  52. { name: 'sidebar.right.tab.document', key: IMAGE_BODY_ID, locale: 'sidebarImage' },
  53. ImageBody,
  54. )
  55. await dispose()
  56. expect(registry.getSnapshot()).toEqual([])
  57. expect(bodies.size).toBe(0)
  58. expect(dictionaries.size).toBe(0)
  59. })
  60. })