forked from alpinejs/alpine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherror.spec.js
112 lines (101 loc) · 3.66 KB
/
error.spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import Alpine from 'alpinejs'
import { wait } from '@testing-library/dom'
global.MutationObserver = class {
observe() {}
}
jest.spyOn(window, 'setTimeout').mockImplementation((callback) => {
callback()
})
const mockConsoleWarn = jest.spyOn(console, 'warn').mockImplementation(() => {})
beforeEach(() => {
jest.clearAllMocks()
})
test('error in x-data eval contains element, expression and original error', async () => {
document.body.innerHTML = `
<div x-data="{ foo: 'bar' ">
<span x-bind:foo="foo.bar"></span>
</div>
`
await expect(Alpine.start()).rejects.toThrow()
expect(mockConsoleWarn).toHaveBeenCalledWith(
`Alpine Error: "SyntaxError: Unexpected token ')'"\n\nExpression: "{ foo: 'bar' "\nElement:`,
document.querySelector('[x-data]'),
)
})
test('error in x-init eval contains element, expression and original error', async () => {
document.body.innerHTML = `
<div x-data x-init="foo.bar = 'baz'">
</div>
`
await Alpine.start()
expect(mockConsoleWarn).toHaveBeenCalledWith(
`Alpine Error: "ReferenceError: foo is not defined"\n\nExpression: "foo.bar = 'baz'"\nElement:`,
document.querySelector('[x-data]'),
)
})
test('error in x-spread eval contains element, expression and original error', async () => {
document.body.innerHTML = `
<div x-data x-spread="foo.bar">
</div>
`
// swallow the rendering error
await expect(Alpine.start()).rejects.toThrow()
expect(mockConsoleWarn).toHaveBeenCalledWith(
`Alpine Error: "ReferenceError: foo is not defined"\n\nExpression: "foo.bar"\nElement:`,
document.querySelector('[x-data]'),
)
})
test('error in x-bind eval contains element, expression and original error', async () => {
document.body.innerHTML = `
<div x-data="{ foo: null }">
<span x-bind:foo="foo.bar"></span>
</div>
`
await Alpine.start()
expect(mockConsoleWarn).toHaveBeenCalledWith(
`Alpine Error: "TypeError: Cannot read property 'bar' of null"\n\nExpression: "foo.bar"\nElement:`,
document.querySelector('[x-bind:foo]'),
)
})
test('error in x-model eval contains element, expression and original error', async () => {
document.body.innerHTML = `
<div x-data="{ foo: null }">
<input x-model="foo.bar">
</div>
`
await Alpine.start()
expect(mockConsoleWarn).toHaveBeenCalledWith(
`Alpine Error: "TypeError: Cannot read property 'bar' of null"\n\nExpression: "foo.bar"\nElement:`,
document.querySelector('[x-model]',)
)
})
test('error in x-for eval contains element, expression and original error', async () => {
document.body.innerHTML = `
<div x-data="{}">
<template x-for="element in foo">
<span x-text="element"></span>
</template>
</div>
`
await expect(Alpine.start()).rejects.toThrow()
expect(mockConsoleWarn).toHaveBeenCalledWith(
`Alpine Error: "ReferenceError: foo is not defined"\n\nExpression: "foo"\nElement:`,
document.querySelector('[x-for]',)
)
})
test('error in x-on eval contains element, expression and original error', async () => {
document.body.innerHTML = `
<div
x-data="{hello: null}"
x-on:click="hello.world"
></div>
`
await Alpine.start()
document.querySelector('div').click()
await wait(() => {
expect(mockConsoleWarn).toHaveBeenCalledWith(
`Alpine Error: "TypeError: Cannot read property 'world' of null"\n\nExpression: "hello.world"\nElement:`,
document.querySelector('[x-data]',)
)
})
})