import Alpine from 'alpinejs'
import { wait } from '@testing-library/dom'
global.MutationObserver = class {
observe() {}
}
jest.spyOn(window, 'setTimeout').mockImplementation((callback) => {
callback()
})
const mockConsoleError = jest.spyOn(console, 'error').mockImplementation(() => {})
beforeEach(() => {
jest.clearAllMocks()
})
test('error in x-data eval contains element, expression and original error', async () => {
document.body.innerHTML = `
`
await expect(Alpine.start()).rejects.toThrow()
expect(mockConsoleError).toHaveBeenCalledWith(
"Alpine: error in expression \"{ foo: 'bar' \" in component:",
document.querySelector('[x-data]'),
"due to \"SyntaxError: Unexpected token ')'\""
)
})
test('error in x-init eval contains element, expression and original error', async () => {
document.body.innerHTML = `
`
await Alpine.start()
expect(mockConsoleError).toHaveBeenCalledWith(
"Alpine: error in expression \"foo.bar = 'baz'\" in component:",
document.querySelector('[x-data]'),
"due to \"ReferenceError: foo is not defined\""
)
})
test('error in x-bind eval contains element, expression and original error', async () => {
document.body.innerHTML = `
`
await Alpine.start()
expect(mockConsoleError).toHaveBeenCalledWith(
"Alpine: error in expression \"foo.bar\" in component:",
document.querySelector('[x-bind:foo]'),
"due to \"TypeError: Cannot read property 'bar' of null\""
)
})
test('error in x-model eval contains element, expression and original error', async () => {
document.body.innerHTML = `
`
await Alpine.start()
expect(mockConsoleError).toHaveBeenCalledWith(
"Alpine: error in expression \"foo.bar\" in component:",
document.querySelector('[x-model]'),
"due to \"TypeError: Cannot read property 'bar' of null\""
)
})
test('error in x-for eval contains element, expression and original error', async () => {
document.body.innerHTML = `
`
await expect(Alpine.start()).rejects.toThrow()
expect(mockConsoleError).toHaveBeenCalledWith(
"Alpine: error in expression \"foo\" in component:",
document.querySelector('[x-for]'),
"due to \"ReferenceError: foo is not defined\""
)
})
test('error in x-on eval contains element, expression and original error', async () => {
document.body.innerHTML = `
`
await Alpine.start()
document.querySelector('div').click()
await wait(() => {
expect(mockConsoleError).toHaveBeenCalled()
})
})