let { morph } = require('@alpinejs/morph')
let createElement = require('./createElement.js')
test('can use custom key name', () => {
let dom = createElement('
')
dom.querySelector('li').is_me = true
morph(dom, '', {
key(el) { return el.getAttribute('wire:key') }
})
expect(dom.querySelector('li:nth-of-type(2)').is_me).toBeTruthy()
})
test('can prevent update', () => {
let dom = createElement('foo
')
morph(dom, 'bar
', {
updating(from, to, childrenOnly, prevent) {
if (from.textContent === 'foo') {
prevent()
}
}
})
expect(dom.querySelector('span').textContent).toEqual('foo')
})
test('can prevent update, but still update children', () => {
let dom = createElement('foo
')
morph(dom, 'bar
', {
updating(from, to, childrenOnly, prevent) {
if (from.textContent === 'foo') {
childrenOnly()
}
}
})
expect(dom.querySelector('span').textContent).toEqual('bar')
expect(dom.querySelector('span').getAttribute('foo')).toEqual('bar')
})
test('changing tag doesnt trigger an update (add and remove instead)', () => {
let dom = createElement('foo
')
let updateHookCalledTimes = 0
morph(dom, 'foo
', {
updating(from, to, prevent) {
updateHookCalledTimes++
}
})
expect(updateHookCalledTimes).toEqual(1)
})
test('can impact update', () => {
let dom = createElement('foo
')
morph(dom, 'bar
', {
updated(from, to) {
if (from.textContent === 'bar') {
from.textContent = 'baz'
}
}
})
expect(dom.querySelector('span').textContent).toEqual('baz')
})
test('updating and updated are sequential when element has child updates ', () => {
let dom = createElement('foo
')
let updatings = []
let updateds = []
morph(dom, 'bar
', {
updating(from, to) {
updatings.push(from.nodeName.toLowerCase())
},
updated(from, to) {
updateds.push(from.nodeName.toLowerCase())
}
})
expect(updatings).toEqual(['div', 'span', '#text'])
expect(updateds).toEqual(['div', 'span', '#text'])
})
test('can prevent removal', () => {
let dom = createElement('foo
')
morph(dom, '', {
removing(from, prevent) {
prevent()
}
})
expect(dom.querySelector('span')).toBeTruthy()
})
test('can impact removal', () => {
let dom = createElement('foo
')
let textContent
morph(dom, '', {
removed(from) {
textContent = from.textContent
}
})
expect(textContent).toEqual('foo')
})
test('can prevent removal for tag replacement', () => {
let dom = createElement('foo
')
morph(dom, 'foo
', {
removing(from, prevent) {
prevent()
}
})
expect(dom.querySelector('span')).toBeTruthy()
})
test('can impact removal for tag replacement', () => {
let dom = createElement('foo
')
let textContent
morph(dom, 'foo
', {
removed(from) {
textContent = from.textContent
}
})
expect(textContent).toEqual('foo')
})
test('can prevent addition', () => {
let dom = createElement('')
morph(dom, 'foo
', {
adding(to, prevent) {
prevent()
}
})
expect(dom.querySelector('span')).toBeFalsy()
})
test('can impact addition', () => {
let dom = createElement('')
morph(dom, 'foo
', {
added(to) {
to.textContent = 'bar'
}
})
expect(dom.querySelector('span').textContent).toEqual('bar')
})
test('can prevent addition for tag replacement', () => {
let dom = createElement('foo
')
morph(dom, 'foo
', {
adding(to, prevent) {
prevent()
}
})
expect(dom.querySelector('span')).toBeFalsy()
})
test('can impact addition for tag replacement', () => {
let dom = createElement('foo
')
morph(dom, 'foo
', {
added(to) {
to.textContent = 'bar'
}
})
expect(dom.querySelector('span').textContent).toEqual('bar')
})