import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import { enableAutoUnmount, mount } from '@vue/test-utils'
import type { FormField } from '../../src/api/types'
import MarkdownField from '../../src/components/form/fields/MarkdownField.vue'
import MLMarkdownField from '../../src/components/form/fields/MLMarkdownField.vue'
import { resetState } from '../helpers'
function field(type = 'markdown', name = 'body'): FormField {
return { name, label: 'Body', type } as FormField
}
beforeEach(() => {
resetState()
})
afterEach(() => {
document.body.innerHTML = ''
})
enableAutoUnmount(afterEach)
describe('MarkdownField composition and sinks', () => {
it('edits source and previews interpolated text without v-html', async () => {
const wrapper = mount(MarkdownField, {
props: {
field: field(),
modelValue: '# Hello',
controlId: 'f-body',
},
attachTo: document.body,
})
expect(wrapper.find('textarea').element.value).toBe('# Hello')
await wrapper.find('textarea').setValue('# Changed')
expect(wrapper.emitted('update:modelValue')?.at(-1)).toEqual(['# Changed'])
await wrapper.setProps({ modelValue: '# Changed' })
await wrapper.find('[data-markdown-preview]').trigger('click')
expect(wrapper.find('[data-markdown-preview-pane]').text()).toBe('# Changed')
expect(wrapper.find('h1').exists()).toBe(false)
})
it('does not execute script, iframe, or event-handler HTML', async () => {
const wrapper = mount(MarkdownField, {
props: {
field: field(),
modelValue:
'
',
controlId: 'f-body',
},
attachTo: document.body,
})
await wrapper.find('[data-markdown-preview]').trigger('click')
expect(wrapper.find('script').exists()).toBe(false)
expect(wrapper.find('iframe').exists()).toBe(false)
expect(wrapper.find('img').exists()).toBe(false)
expect((window as unknown as { __md_xss?: number }).__md_xss).toBeUndefined()
expect(wrapper.html()).not.toMatch(/v-html|innerHTML/)
})
it('composes inside mlmarkdown without a raw-HTML sink', async () => {
const wrapper = mount(MLMarkdownField, {
props: {
field: field('mlmarkdown', 'body'),
modelValue: { en: '# Hi', pl: '' },
controlId: 'f-body',
},
attachTo: document.body,
})
expect(wrapper.findComponent(MarkdownField).exists()).toBe(true)
await wrapper.find('[data-ml-locale]').setValue('pl')
await wrapper.find('[data-markdown-preview]').trigger('click')
expect(wrapper.find('script').exists()).toBe(false)
expect((window as unknown as { __md_xss?: number }).__md_xss).toBeUndefined()
expect(wrapper.find('[data-markdown-preview-pane]').text()).toContain('