apply.client.spec.ts 1.2 KB

12345678910111213141516171819202122232425262728
  1. /** The document Remote is available only while its Client plugin owns the mount. */
  2. import { Context } from '@deepseek-ai/cordis'
  3. import { expect, it, vi } from 'vitest'
  4. const descriptor = vi.hoisted(() => ({ package: '@deepseek-ai/dsh-api-document-render-controller', descriptors: [] }))
  5. vi.mock('@deepseek-ai/dsh-api-document-render-controller/remote', () => ({ default: descriptor }))
  6. import * as client from '../src/client/index.ts'
  7. it('waits for the Remote carrier, mounts its descriptor, and joins namespace disposal', async () => {
  8. const ctx = new Context()
  9. const released = Promise.withResolvers<undefined>()
  10. const dispose = vi.fn(() => released.promise)
  11. const mount = vi.fn(async () => dispose)
  12. const fiber = ctx.plugin(client)
  13. try {
  14. expect(mount).not.toHaveBeenCalled()
  15. ctx.provide('remote', { $mount: mount } as never)
  16. await fiber.await()
  17. expect(mount).toHaveBeenCalledExactlyOnceWith(descriptor)
  18. let closed = false
  19. const closing = fiber.dispose().then(() => { closed = true })
  20. await expect.poll(() => dispose.mock.calls.length).toBe(1)
  21. expect(closed).toBe(false)
  22. released.resolve(undefined)
  23. await closing
  24. expect(closed).toBe(true)
  25. } finally { released.resolve(undefined); await fiber.dispose() }
  26. })