1
0

error-handling.spec.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import { haveText, html, test } from '../utils'
  2. export function setupConsoleInterceptor( ...targetIds ) {
  3. const mappedTargetIds = targetIds.map( tid => `'${tid}'` ).join( ',' )
  4. return `
  5. let errorContainer = document.createElement('div');
  6. errorContainer.id = 'errors'
  7. errorContainer.textContent = 'false'
  8. document.querySelector('#root').after(errorContainer)
  9. console.warnlog = console.warn.bind(console)
  10. console.warn = function () {
  11. document.getElementById( 'errors' ).textContent = [${mappedTargetIds}].some( target => arguments[1] === document.getElementById( target ) )
  12. console.warnlog.apply(console, arguments)
  13. }
  14. `
  15. }
  16. export function assertConsoleInterceptorHadErrorWithCorrectElement() {
  17. return ({get}) => {
  18. get('#errors').should(haveText('true'))
  19. };
  20. }
  21. test('x-for identifier issue',
  22. [html`
  23. <div x-data="{ items: ['foo'] }">
  24. <template id="xfor" x-for="item in itemzzzz">
  25. <span x-text="item"></span>
  26. </template>
  27. </div>
  28. `,
  29. setupConsoleInterceptor( "xfor" )
  30. ],
  31. assertConsoleInterceptorHadErrorWithCorrectElement(),
  32. true
  33. )
  34. test('x-text identifier issue',
  35. [html`
  36. <div x-data="{ items: ['foo'] }">
  37. <template x-for="item in items">
  38. <span id="xtext" x-text="itemzzz"></span>
  39. </template>
  40. </div>
  41. `,
  42. setupConsoleInterceptor( "xtext" )
  43. ],
  44. assertConsoleInterceptorHadErrorWithCorrectElement(),
  45. true
  46. )
  47. test('x-init identifier issue',
  48. [html`
  49. <div id="xinit" x-data x-init="doesNotExist()">
  50. </div>
  51. `,
  52. setupConsoleInterceptor( "xinit" )
  53. ],
  54. assertConsoleInterceptorHadErrorWithCorrectElement(),
  55. true
  56. )
  57. test('x-show identifier issue',
  58. [html`
  59. <div id="xshow" x-data="{isOpen: true}" x-show="isVisible">
  60. </div>
  61. `,
  62. setupConsoleInterceptor( "xshow" )
  63. ],
  64. assertConsoleInterceptorHadErrorWithCorrectElement(),
  65. true
  66. )
  67. test('x-bind class object syntax identifier issue',
  68. [html`
  69. <div x-data="{isOpen: true}">
  70. <div id="xbind" :class="{ 'block' : isVisible, 'hidden' : !isVisible }"></div>
  71. </div>
  72. `,
  73. setupConsoleInterceptor( "xbind" )
  74. ],
  75. assertConsoleInterceptorHadErrorWithCorrectElement(),
  76. true
  77. )
  78. test('x-model identifier issue',
  79. [html`
  80. <div x-data="{value: ''}">
  81. <input id="xmodel" x-model="thething"/>
  82. </div>
  83. `,
  84. setupConsoleInterceptor( "xmodel" )
  85. ],
  86. assertConsoleInterceptorHadErrorWithCorrectElement(),
  87. true
  88. )
  89. test('x-if identifier issue',
  90. [html`
  91. <div x-data="{value: ''}">
  92. <template id="xif" x-if="valuez === ''">
  93. <span>Words</span>
  94. </template>
  95. </div>
  96. `,
  97. setupConsoleInterceptor( "xif" )
  98. ],
  99. assertConsoleInterceptorHadErrorWithCorrectElement(),
  100. true
  101. )
  102. test('x-if identifier issue ( function )',
  103. [html`
  104. <div x-data="{shouldOpen: function(){}}">
  105. <template id="xif" x-if="isOpen()">
  106. <span>Words</span>
  107. </template>
  108. </div>
  109. `,
  110. setupConsoleInterceptor( "xif" )
  111. ],
  112. assertConsoleInterceptorHadErrorWithCorrectElement(),
  113. true
  114. )
  115. test('x-effect identifier issue',
  116. [html`
  117. <div id="xeffect" x-data="{ label: 'Hello' }" x-effect="System.out.println(label)">
  118. </div>
  119. `,
  120. setupConsoleInterceptor( "xeffect" )
  121. ],
  122. assertConsoleInterceptorHadErrorWithCorrectElement(),
  123. true
  124. )
  125. test('x-on identifier issue',
  126. [html`
  127. <div x-data="{ label: 'Hello' }">
  128. <div x-text="label"></div>
  129. <button id="xon" x-on:click="labelz += ' World!'">Change Message</button>
  130. </div>
  131. `,
  132. setupConsoleInterceptor( "xon" )
  133. ],
  134. ({ get }) => {
  135. get( "#xon" ).click()
  136. get( "#errors" ).should(haveText('true'))
  137. },
  138. true
  139. )
  140. test('x-data syntax error',
  141. [html`
  142. <div id="xdata" x-data="{ label: 'Hello' }aaa">
  143. </div>
  144. `,
  145. setupConsoleInterceptor( "xdata" )
  146. ],
  147. assertConsoleInterceptorHadErrorWithCorrectElement(),
  148. true
  149. )
  150. test('if statement syntax error',
  151. [html`
  152. <div x-data="{ label: 'Hello' }">
  153. <div id="xtext" x-text="if( false { label } else { 'bye' }"></div>
  154. </div>
  155. `,
  156. setupConsoleInterceptor( "xtext" )
  157. ],
  158. assertConsoleInterceptorHadErrorWithCorrectElement(),
  159. true
  160. )
  161. test('x-data with reference error and multiple errors',
  162. [html`
  163. <div id="xdata" x-data="{ items : [ {v:'one'},{v:'two'}], replaceItems }">
  164. <template id="xtext" x-for="item in items">
  165. <span x-text="item.v"></span>
  166. </template>
  167. </div>
  168. `,
  169. setupConsoleInterceptor( "xdata", "xtext" )
  170. ],
  171. assertConsoleInterceptorHadErrorWithCorrectElement(),
  172. true
  173. )
  174. test('evaluation with syntax error',
  175. [html`
  176. <div x-data="{value: ''}">
  177. <template id="xif" x-if="value ==== ''">
  178. <span>Words</span>
  179. </template>
  180. </div>
  181. `,
  182. setupConsoleInterceptor( "xif" )
  183. ],
  184. assertConsoleInterceptorHadErrorWithCorrectElement(),
  185. true
  186. )