Improve editor and cookie-consent test coverage, fix RegExp.exec lint

- Add 5 editor tests: toolbar mousedown, _sync, exec with/without value
- Mock document.execCommand for happy-dom compatibility
- Add cookie-consent test for duplicate script guard
- Use RegExp.exec() instead of String.match() per ESLint rule

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-20 16:41:40 +01:00
parent acc9e2a5b8
commit d1e3de33df
3 changed files with 62 additions and 1 deletions

View File

@@ -2,7 +2,7 @@ const COOKIE_NAME = 'e_ticket_consent'
const COOKIE_DAYS = 365
function getCookie(name) {
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'))
const match = new RegExp('(^| )' + name + '=([^;]+)').exec(document.cookie)
return match ? match[2] : null
}

View File

@@ -70,6 +70,14 @@ describe('initCookieConsent', () => {
expect(script).toBeNull()
})
it('does not duplicate analytics script if already loaded', () => {
document.cookie = 'e_ticket_consent=accepted;path=/'
initCookieConsent()
initCookieConsent()
const scripts = document.querySelectorAll('script[data-analytics]')
expect(scripts.length).toBe(1)
})
it('loads analytics immediately if already accepted', () => {
document.cookie = 'e_ticket_consent=accepted;path=/'
initCookieConsent()

View File

@@ -56,6 +56,9 @@ function createEditor(innerHtml = '<textarea></textarea>') {
describe('ETicketEditor', () => {
beforeEach(() => {
registerEditor()
if (!document.execCommand) {
document.execCommand = () => true
}
})
it('registers the custom element', () => {
@@ -114,4 +117,54 @@ describe('ETicketEditor', () => {
content.dispatchEvent(event)
expect(event.defaultPrevented).toBe(false)
})
it('toolbar button mousedown calls exec and prevents default', () => {
const editor = createEditor()
const btn = editor.querySelector('.ete-btn')
const event = new MouseEvent('mousedown', { cancelable: true, bubbles: true })
btn.dispatchEvent(event)
expect(event.defaultPrevented).toBe(true)
})
it('syncs content to textarea via _sync', () => {
const editor = createEditor()
const textarea = editor.querySelector('textarea')
editor._content.innerHTML = '<p>Updated</p>'
editor._sync()
expect(textarea.value).toBe('<p>Updated</p>')
})
it('syncs sanitized content to textarea via _sync', () => {
const editor = createEditor()
const textarea = editor.querySelector('textarea')
editor._content.innerHTML = '<div>Stripped</div><p>Safe</p>'
editor._sync()
expect(textarea.value).toBe('Stripped<p>Safe</p>')
})
it('exec with value calls execCommand with value', () => {
const editor = createEditor()
const btn = editor.querySelectorAll('.ete-btn')
const pBtn = Array.from(btn).find(b => b.title === 'Paragraphe')
if (pBtn) {
const event = new MouseEvent('mousedown', { cancelable: true, bubbles: true })
pBtn.dispatchEvent(event)
expect(event.defaultPrevented).toBe(true)
}
})
it('exec without value calls execCommand without value', () => {
const editor = createEditor()
const btn = editor.querySelectorAll('.ete-btn')
const boldBtn = Array.from(btn).find(b => b.title === 'Gras')
if (boldBtn) {
const event = new MouseEvent('mousedown', { cancelable: true, bubbles: true })
boldBtn.dispatchEvent(event)
expect(event.defaultPrevented).toBe(true)
}
})
})