import { mock, test } from 'bun:test'
import { html } from 'dhtml'
import { renderToReadableStream, renderToString } from 'dhtml/server'
import assert from 'node:assert/strict'
const dev_test = test.skipIf(!__DEV__)
test('basic html renders correctly', () => {
assert.equal(renderToString(html`
Hello, world!
`), 'Hello, world!
')
})
test('basic html renders correctly via stream', async () => {
const stream = renderToReadableStream(html`Hello, world!
`)
assert.equal(await new Response(stream).text(), 'Hello, world!
')
})
test('inner content renders correctly', () => {
assert.equal(renderToString(html`${html`Inner content!`}
`), 'Inner content!
')
})
test('template with number renders correctly', () => {
const template = (n: number) => html`Hello, ${n}!
`
assert.equal(renderToString(template(1)), 'Hello, 1!
')
assert.equal(renderToString(template(2)), 'Hello, 2!
')
})
test('lists of items', () => {
assert.equal(renderToString([1, 'a', html`thing`]), '1athing')
})
test('basic children render correctly', () => {
assert.equal(
renderToString(html`${'This is a'} ${html`test`} ${html`test`} ${html`test`}`),
'This is a test test test',
)
})
dev_test('invalid part placement raises error', () => {
assert.throws(() => renderToString(html`<${'div'}>${'text'}${'div'}>`))
})
test('parts in comments do not throw', () => {
renderToString(html``)
})
dev_test('manually specifying internal template syntax throws', () => {
assert.throws(() => {
renderToString(html`${1} dyn-$0$`)
})
})
test('syntax close but not exact does not throw', () => {
assert.equal(renderToString(html`dyn-$${0}1$`), 'dyn-$01$')
})
test('directives', () => {
const directive = mock()
assert.equal(renderToString(html``), '')
assert.equal(directive.mock.calls.length, 1)
assert.deepEqual(directive.mock.calls[0], [])
})
test('attributes', () => {
assert.equal(renderToString(html``), '')
assert.equal(renderToString(html` `), ' ')
assert.equal(renderToString(html` `), ' ')
})
test('collapses whitespace', () => {
// prettier-ignore
assert.equal(renderToString(html`
`), '
')
// prettier-ignore
assert.equal(renderToString(html` x
`), ' x
')
})