| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // @vitest-environment jsdom
- import { Context } from '@deepseek-ai/cordis'
- import { describe, expect, it, vi } from 'vitest'
- import { mountClient } from '../src/mount.ts'
- /** Provide a fake `uiRenderer` from its own plugin fiber so it can be replaced. */
- function provideRenderer(ctx: Context, mount: (container: HTMLElement) => () => void) {
- return ctx.plugin({ apply: (scope: Context) => { scope.reflect.provide('uiRenderer', { mount }) } })
- }
- describe('mountClient', () => {
- it('mounts into the container and unmounts when the tree is disposed', async () => {
- const ctx = new Context()
- const unmount = vi.fn()
- const mount = vi.fn((_container: HTMLElement) => unmount)
- provideRenderer(ctx, mount)
- const container = document.createElement('div')
- await mountClient(ctx, container)
- expect(mount).toHaveBeenCalledExactlyOnceWith(container)
- expect(unmount).not.toHaveBeenCalled()
- await ctx.fiber.dispose()
- expect(unmount).toHaveBeenCalledOnce()
- })
- it('remounts when uiRenderer is replaced', async () => {
- const ctx = new Context()
- const container = document.createElement('div')
- const first = { unmount: vi.fn(), mount: vi.fn(() => first.unmount) }
- const second = { unmount: vi.fn(), mount: vi.fn(() => second.unmount) }
- await mountClient(ctx, container)
- expect(first.mount).not.toHaveBeenCalled()
- const renderer = provideRenderer(ctx, first.mount)
- await vi.waitFor(() => { expect(first.mount).toHaveBeenCalledExactlyOnceWith(container) })
- await renderer.dispose()
- expect(first.unmount).toHaveBeenCalledOnce()
- provideRenderer(ctx, second.mount)
- await vi.waitFor(() => { expect(second.mount).toHaveBeenCalledExactlyOnceWith(container) })
- await ctx.fiber.dispose()
- expect(second.unmount).toHaveBeenCalledOnce()
- })
- })
|