| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // @vitest-environment jsdom
- /**
- * buildRenderApp on SlotTestRuntime: the fail-loud sessions precondition, the
- * one ctx-level renderSlot('root') call, and the document-title projection
- * arms over the real slot stack.
- */
- import { afterEach, describe, expect, it } from 'vitest'
- import { cleanup, render } from '@testing-library/react'
- import { Context } from 'cordis'
- import { SlotTestRuntime } from '@deepseek-ai/dsh-client-test-runtime'
- import type { SessionId } from '@deepseek-ai/dsh-client-runtime/client'
- import { buildRenderApp } from '@deepseek-ai/dsh-client-web/src/app.tsx'
- let runtime: SlotTestRuntime | undefined
- afterEach(async () => {
- cleanup()
- await runtime?.dispose()
- runtime = undefined
- document.title = ''
- })
- async function bench() {
- runtime = await SlotTestRuntime.create()
- await runtime.root.declare({}, () => <div data-testid="frame" />)
- return { runtime, renderApp: buildRenderApp({ ctx: runtime.ctx }) }
- }
- describe('buildRenderApp', () => {
- it('fails loud when the sessions service is unavailable', () => {
- expect(() => buildRenderApp({ ctx: new Context() })).toThrow('sessions service unavailable')
- })
- it('renders the root slot tree through the one ctx-level renderSlot call', async () => {
- const b = await bench()
- const view = render(<>{b.renderApp()}</>)
- expect(view.getByTestId('frame')).toBeTruthy()
- })
- it('projects the current session durable title and falls back to the product title', async () => {
- document.title = 'Product'
- const b = await bench()
- render(<>{b.renderApp()}</>)
- // No current session: the product title stands.
- expect(document.title).toBe('Product')
- await b.runtime.sessions.add({ id: 's1', summary: { title: 'First' } })
- expect(document.title).toBe('First — Product')
- await b.runtime.sessions.setCurrent(undefined)
- expect(document.title).toBe('Product')
- // A session without a durable title keeps the product title.
- await b.runtime.sessions.add({ id: 's2' })
- expect(document.title).toBe('Product')
- })
- it('a current id without a list row falls back (selection/list arbitration transient)', async () => {
- document.title = 'Product'
- const b = await bench()
- await b.runtime.sessions.add({ id: 's1', summary: { title: 'First' } })
- render(<>{b.renderApp()}</>)
- expect(document.title).toBe('First — Product')
- b.runtime.sessions.list.update((draft) => { draft.current = 'ghost' as SessionId })
- await b.runtime.flush()
- expect(document.title).toBe('Product')
- })
- })
|