38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
// Guards the lazy-body behaviour of the shared collapsible wrappers.
|
|
//
|
|
// bits-ui's Collapsible.Content renders its children unconditionally and only
|
|
// sets `hidden`, so before this was gated a collapsed tool result kept its whole
|
|
// body in the DOM and re-rendered it on every streamed token (measured at
|
|
// ~41ms/section/token for a 200KB result). These tests pin the fix: closed means
|
|
// not rendered, and opening still mounts the body.
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import { render } from 'vitest-browser-svelte';
|
|
import { tick } from 'svelte';
|
|
import CollapsibleLazyBodyHarness from './components/CollapsibleLazyBodyHarness.svelte';
|
|
|
|
const MARKER = 'collapsible-body-marker';
|
|
|
|
describe('collapsible wrappers render their body lazily', () => {
|
|
for (const variant of ['content', 'terminal'] as const) {
|
|
it(`${variant}: body is absent while closed and present once open`, async () => {
|
|
const screen = render(CollapsibleLazyBodyHarness, { variant, open: false });
|
|
await tick();
|
|
|
|
expect(document.body.textContent).not.toContain(MARKER);
|
|
|
|
await screen.rerender({ variant, open: true });
|
|
await tick();
|
|
|
|
expect(document.body.textContent).toContain(MARKER);
|
|
|
|
// And it unmounts again on close, so a collapsed block stops costing
|
|
// anything during streaming.
|
|
await screen.rerender({ variant, open: false });
|
|
await tick();
|
|
|
|
expect(document.body.textContent).not.toContain(MARKER);
|
|
});
|
|
}
|
|
});
|