error.spec.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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-init eval contains element, expression and original error', async () => {
  27. document.body.innerHTML = `
  28. <div x-data x-init="foo.bar = 'baz'">
  29. </div>
  30. `
  31. await Alpine.start()
  32. expect(mockConsoleError).toHaveBeenCalledWith(
  33. "Alpine: error in expression \"foo.bar = 'baz'\" in component:",
  34. document.querySelector('[x-data]'),
  35. "due to \"ReferenceError: foo is not defined\""
  36. )
  37. })
  38. test('error in x-bind eval contains element, expression and original error', async () => {
  39. document.body.innerHTML = `
  40. <div x-data="{ foo: null }">
  41. <span x-bind:foo="foo.bar"></span>
  42. </div>
  43. `
  44. await Alpine.start()
  45. expect(mockConsoleError).toHaveBeenCalledWith(
  46. "Alpine: error in expression \"foo.bar\" in component:",
  47. document.querySelector('[x-bind:foo]'),
  48. "due to \"TypeError: Cannot read property 'bar' of null\""
  49. )
  50. })
  51. test('error in x-model eval contains element, expression and original error', async () => {
  52. document.body.innerHTML = `
  53. <div x-data="{ foo: null }">
  54. <input x-model="foo.bar">
  55. </div>
  56. `
  57. await Alpine.start()
  58. expect(mockConsoleError).toHaveBeenCalledWith(
  59. "Alpine: error in expression \"foo.bar\" in component:",
  60. document.querySelector('[x-model]'),
  61. "due to \"TypeError: Cannot read property 'bar' of null\""
  62. )
  63. })
  64. test('error in x-for eval contains element, expression and original error', async () => {
  65. document.body.innerHTML = `
  66. <div x-data="{}">
  67. <template x-for="element in foo">
  68. <span x-text="element"></span>
  69. </template>
  70. </div>
  71. `
  72. await expect(Alpine.start()).rejects.toThrow()
  73. expect(mockConsoleError).toHaveBeenCalledWith(
  74. "Alpine: error in expression \"foo\" in component:",
  75. document.querySelector('[x-for]'),
  76. "due to \"ReferenceError: foo is not defined\""
  77. )
  78. })
  79. test('error in x-on eval contains element, expression and original error', async () => {
  80. document.body.innerHTML = `
  81. <div
  82. x-data="{hello: null}"
  83. x-on:click="hello.world"
  84. ></div>
  85. `
  86. await Alpine.start()
  87. document.querySelector('div').click()
  88. await wait(() => {
  89. expect(mockConsoleError).toHaveBeenCalled()
  90. })
  91. })