diff --git a/packages/api/session-controller/src/history.ts b/packages/api/session-controller/src/history.ts index 19fe5dc5bc..07fbbfe6be 100644 --- a/packages/api/session-controller/src/history.ts +++ b/packages/api/session-controller/src/history.ts @@ -393,7 +393,7 @@ function paginate( events: readonly SessionEvent[], beforeSeq: SessionLogOffsetType | undefined, maxMessages: number, - throughSeq: SessionSeqCursor = events.at(-1)?.seq ?? -1, + throughSeq: SessionSeqCursor, turnWindow?: SessionPageRequest['turnWindow'], ): { readonly events: SessionEvent[]; readonly hasMore: boolean } { const end = SessionLogOffset(Math.min(throughSeq + 1, beforeSeq ?? throughSeq + 1)) diff --git a/packages/client/ui-agent-preset/tests/section.client.spec.tsx b/packages/client/ui-agent-preset/tests/section.client.spec.tsx index 9add87de92..2079d0c67a 100644 --- a/packages/client/ui-agent-preset/tests/section.client.spec.tsx +++ b/packages/client/ui-agent-preset/tests/section.client.spec.tsx @@ -193,13 +193,19 @@ it('closes help even when the browser reports no previously focused element', () it.each([false, true])('only offers a description tooltip when the card clips it: %s', (overflow) => { vi.spyOn(Element.prototype, 'scrollHeight', 'get').mockReturnValue(overflow ? 400 : 80) vi.spyOn(Element.prototype, 'clientHeight', 'get').mockReturnValue(80) - const disconnect = vi.fn() - vi.stubGlobal('ResizeObserver', class { observe() {} disconnect = disconnect }) + const disconnect = vi.spyOn(ResizeObserver.prototype, 'disconnect') vi.useFakeTimers() view({ rows: [{ id: 'mine', isDefault: false, description: 'Preset description' }] }) fireEvent.mouseEnter(screen.getByText('Preset description')) act(() => { vi.advanceTimersByTime(400) }) expect(screen.queryByRole('tooltip')?.textContent ?? null).toBe(overflow ? 'Preset description' : null) cleanup() - expect(disconnect).toHaveBeenCalledOnce() + expect(disconnect).toHaveBeenCalledTimes(overflow ? 2 : 1) +}) +it('renders descriptions and allows selection without resize observation', () => { + vi.stubGlobal('ResizeObserver', undefined) + const actions = view({ rows: [{ id: 'mine', name: 'Mine', isDefault: false, description: 'Preset description' }] }) + expect(screen.getByText('Preset description')).toBeTruthy() + fireEvent.click(screen.getByRole('button', { name: `${en.setDefault}: Mine` })) + expect(actions.makeDefault).toHaveBeenCalledWith('mine') }) diff --git a/packages/client/ui-conversation/tests/control-row-dom.ts b/packages/client/ui-conversation/tests/control-row-dom.ts index 4c1cbc502e..7afc5ffaf7 100644 --- a/packages/client/ui-conversation/tests/control-row-dom.ts +++ b/packages/client/ui-conversation/tests/control-row-dom.ts @@ -1,12 +1,8 @@ -/** jsdom omits resize observation and font loading; layout tests drive their own measurements. */ +/** jsdom font-loading events; layout tests drive their own measurements. */ import { beforeEach, afterEach, vi } from 'vitest' const fonts = Object.getOwnPropertyDescriptor(document, 'fonts') beforeEach(() => { - vi.stubGlobal('ResizeObserver', class { - observe(): void {} - disconnect(): void {} - }) Object.defineProperty(document, 'fonts', { configurable: true, value: new EventTarget() }) }) afterEach(() => { diff --git a/packages/client/ui-dockkit/tests/components.client.spec.tsx b/packages/client/ui-dockkit/tests/components.client.spec.tsx index 85768ebb55..d2ed9768b9 100644 --- a/packages/client/ui-dockkit/tests/components.client.spec.tsx +++ b/packages/client/ui-dockkit/tests/components.client.spec.tsx @@ -462,7 +462,8 @@ describe('DockSurface', () => { expect(document.querySelector('[data-dockkit-split-button]')).toBeNull() }) - it('names the chip box\'s hidden sides in data-dockkit-strip-scroll as it scrolls', () => { + it.each([true, false])('names the chip box\'s hidden sides as it scrolls with resize observation: %s', (observed) => { + if (!observed) vi.stubGlobal('ResizeObserver', undefined) let scrollLeft = 0 const descriptors = ['scrollLeft', 'scrollWidth', 'clientWidth'].map(name => [name, Object.getOwnPropertyDescriptor(Element.prototype, name)] as const) diff --git a/packages/client/ui-primitives/tests/tooltip.client.spec.tsx b/packages/client/ui-primitives/tests/tooltip.client.spec.tsx index b8d0825b91..787475f721 100644 --- a/packages/client/ui-primitives/tests/tooltip.client.spec.tsx +++ b/packages/client/ui-primitives/tests/tooltip.client.spec.tsx @@ -48,6 +48,9 @@ describe('Tooltip', () => { const bubble = view.container.querySelector('[role="tooltip"]')! expect(measured.mock.contexts).toEqual([anchor]) expect(bubble.style.visibility).toBe('hidden') + fireEvent(window, new Event('resize')) + expect(bubble.style.visibility).toBe('hidden') + expect(measured.mock.contexts).toEqual([anchor]) bubbleSize = { inlineSize: 100, blockSize: 20 } act(() => { observers[0]!.deliver() }) expect(screen.getByRole('tooltip').style.left).toBe('62px') diff --git a/packages/client/ui-sidebar-documentpreview/tests/zoom-viewport.client.spec.tsx b/packages/client/ui-sidebar-documentpreview/tests/zoom-viewport.client.spec.tsx index f7a38e249e..a073c31637 100644 --- a/packages/client/ui-sidebar-documentpreview/tests/zoom-viewport.client.spec.tsx +++ b/packages/client/ui-sidebar-documentpreview/tests/zoom-viewport.client.spec.tsx @@ -66,6 +66,23 @@ it('resolves missing and small content to 100 percent', () => { expect(fitWidthZoom(200, 100, 24)).toBe(1) }) +it('fits the initial pane and allows fixed zoom without resize observation', () => { + vi.stubGlobal('ResizeObserver', undefined) + const onPreference = vi.fn() + render( `${String(percent)}%` }} signal={new AbortController().signal} + scrollportRef={() => {}} onPreference={onPreference}> +
+ ) + const menu = screen.getByRole('button', { name: 'Choose zoom' }) + expect(menu.textContent).toContain('48%') + fireEvent.click(menu) + fireEvent.click(screen.getByRole('menuitem', { name: '100%' })) + expect(onPreference).toHaveBeenCalledExactlyOnceWith({ kind: 'fixed', scale: 1 }) + expect(menu.textContent).toContain('100%') +}) + it('keeps a centred surface point under the pointer while crossing into overflow', () => { const onPreference = vi.fn() const view = render(