1
0

error.spec.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import Alpine from 'alpinejs'
  2. import { wait } from '@testing-library/dom'
  3. global.MutationObserver = class {
  4. observe() {}
  5. }
  6. jest.spyOn(window, 'setTimeout').mockImplementation((callback) => {
  7. callback()
  8. })
  9. const mockConsoleError = jest.spyOn(console, 'error').mockImplementation(() => {})
  10. beforeEach(() => {
  11. jest.clearAllMocks()
  12. })
  13. test('error in x-data eval contains element, expression and original error', async () => {
  14. document.body.innerHTML = `
  15. <div x-data="{ foo: 'bar' ">
  16. <span x-bind:foo="foo.bar"></span>
  17. </div>
  18. `
  19. await expect(Alpine.start()).rejects.toThrow()
  20. expect(mockConsoleError).toHaveBeenCalledWith(
  21. "Alpine: error in expression \"{ foo: 'bar' \" in component: ",
  22. document.querySelector('[x-data]'),
  23. "due to \"SyntaxError: Unexpected token ')'\""
  24. )
  25. })
  26. test('error in x-bind eval contains element, expression and original error', async () => {
  27. document.body.innerHTML = `
  28. <div x-data="{ foo: null }">
  29. <span x-bind:foo="foo.bar"></span>
  30. </div>
  31. `
  32. await Alpine.start()
  33. expect(mockConsoleError).toHaveBeenCalledWith(
  34. "Alpine: error in expression \"foo.bar\" in component: ",
  35. document.querySelector('[x-bind:foo]'),
  36. "due to \"TypeError: Cannot read property 'bar' of null\""
  37. )
  38. })
  39. test('error in x-model eval contains element, expression and original error', async () => {
  40. document.body.innerHTML = `
  41. <div x-data="{ foo: null }">
  42. <input x-model="foo.bar">
  43. </div>
  44. `
  45. await Alpine.start()
  46. expect(mockConsoleError).toHaveBeenCalledWith(
  47. "Alpine: error in expression \"foo.bar\" in component: ",
  48. document.querySelector('[x-model]'),
  49. "due to \"TypeError: Cannot read property 'bar' of null\""
  50. )
  51. })
  52. test('error in x-for eval contains element, expression and original error', async () => {
  53. document.body.innerHTML = `
  54. <div x-data="{}">
  55. <template x-for="element in foo">
  56. <span x-text="element"></span>
  57. </template>
  58. </div>
  59. `
  60. await expect(Alpine.start()).rejects.toThrow()
  61. expect(mockConsoleError).toHaveBeenCalledWith(
  62. "Alpine: error in expression \"foo\" in component: ",
  63. document.querySelector('[x-for]'),
  64. "due to \"ReferenceError: foo is not defined\""
  65. )
  66. })
  67. test('error in x-on eval contains element, expression and original error', async () => {
  68. document.body.innerHTML = `
  69. <div
  70. x-data="{hello: null}"
  71. x-on:click="hello.world"
  72. ></div>
  73. `
  74. await Alpine.start()
  75. document.querySelector('div').click()
  76. await wait(() => {
  77. expect(mockConsoleError).toHaveBeenCalled()
  78. })
  79. })