import { describe, it, expect, beforeEach, afterEach } from 'vitest' import { createRoot } from '../lib/vdom.ts' import { renderToString } from '../lib/stream.ts' import { invariant } from '../lib/invariant.ts' describe('hydration', () => { let container: HTMLDivElement beforeEach(() => { container = document.createElement('div') document.body.appendChild(container) }) afterEach(() => { document.body.innerHTML = '' }) describe('boolean attributes', () => { it('hydrates disabled attribute', async () => { let html = await renderToString() container.innerHTML = html let existingButton = container.querySelector('button') invariant(existingButton) expect(existingButton.disabled).toBe(true) let root = createRoot(container) root.render() root.flush() expect(container.querySelector('button')).toBe(existingButton) expect(existingButton.disabled).toBe(true) }) it('hydrates readonly attribute', async () => { let html = await renderToString() container.innerHTML = html let existingInput = container.querySelector('input') invariant(existingInput) let root = createRoot(container) root.render() root.flush() expect(container.querySelector('input')).toBe(existingInput) expect(existingInput.readOnly).toBe(true) }) it('hydrates required attribute', async () => { let html = await renderToString() container.innerHTML = html let existingInput = container.querySelector('input') invariant(existingInput) let root = createRoot(container) root.render() root.flush() expect(container.querySelector('input')).toBe(existingInput) expect(existingInput.required).toBe(true) }) it('hydrates multiple attribute on select', async () => { let html = await renderToString( , ) container.innerHTML = html let existingSelect = container.querySelector('select') invariant(existingSelect) let root = createRoot(container) root.render( , ) root.flush() expect(container.querySelector('select')).toBe(existingSelect) expect(existingSelect.multiple).toBe(true) }) it('hydrates hidden attribute', async () => { let html = await renderToString(