@nyaruka/temba-components 0.129.8 → 0.129.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/CHANGELOG.md +37 -3
  2. package/demo/data/flows/sample-flow.json +186 -96
  3. package/demo/test-colorpicker.html +30 -0
  4. package/dist/temba-components.js +1126 -1111
  5. package/dist/temba-components.js.map +1 -1
  6. package/out-tsc/src/events.js.map +1 -1
  7. package/out-tsc/src/excellent/helpers.js +2 -2
  8. package/out-tsc/src/excellent/helpers.js.map +1 -1
  9. package/out-tsc/src/flow/CanvasNode.js +25 -7
  10. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  11. package/out-tsc/src/flow/Editor.js +11 -1
  12. package/out-tsc/src/flow/Editor.js.map +1 -1
  13. package/out-tsc/src/flow/NodeEditor.js +133 -290
  14. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  15. package/out-tsc/src/flow/actions/add_input_labels.js +40 -0
  16. package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
  17. package/out-tsc/src/flow/actions/call_llm.js +56 -3
  18. package/out-tsc/src/flow/actions/call_llm.js.map +1 -1
  19. package/out-tsc/src/flow/actions/call_webhook.js +1 -1
  20. package/out-tsc/src/flow/actions/call_webhook.js.map +1 -1
  21. package/out-tsc/src/flow/actions/open_ticket.js +65 -3
  22. package/out-tsc/src/flow/actions/open_ticket.js.map +1 -1
  23. package/out-tsc/src/flow/actions/set_run_result.js +75 -0
  24. package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
  25. package/out-tsc/src/flow/config.js +4 -0
  26. package/out-tsc/src/flow/config.js.map +1 -1
  27. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +227 -0
  28. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -0
  29. package/out-tsc/src/flow/nodes/split_by_ticket.js +18 -0
  30. package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -0
  31. package/out-tsc/src/flow/nodes/wait_for_response.js +27 -1
  32. package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
  33. package/out-tsc/src/flow/types.js +0 -65
  34. package/out-tsc/src/flow/types.js.map +1 -1
  35. package/out-tsc/src/form/ArrayEditor.js +63 -117
  36. package/out-tsc/src/form/ArrayEditor.js.map +1 -1
  37. package/out-tsc/src/form/BaseListEditor.js +4 -3
  38. package/out-tsc/src/form/BaseListEditor.js.map +1 -1
  39. package/out-tsc/src/form/Checkbox.js +77 -24
  40. package/out-tsc/src/form/Checkbox.js.map +1 -1
  41. package/out-tsc/src/form/ColorPicker.js +28 -40
  42. package/out-tsc/src/form/ColorPicker.js.map +1 -1
  43. package/out-tsc/src/form/Completion.js +44 -53
  44. package/out-tsc/src/form/Completion.js.map +1 -1
  45. package/out-tsc/src/form/Compose.js +7 -8
  46. package/out-tsc/src/form/Compose.js.map +1 -1
  47. package/out-tsc/src/form/ContactSearch.js +3 -4
  48. package/out-tsc/src/form/ContactSearch.js.map +1 -1
  49. package/out-tsc/src/form/DatePicker.js +29 -36
  50. package/out-tsc/src/form/DatePicker.js.map +1 -1
  51. package/out-tsc/src/form/{FormField.js → FieldElement.js} +81 -53
  52. package/out-tsc/src/form/FieldElement.js.map +1 -0
  53. package/out-tsc/src/form/FieldRenderer.js +306 -0
  54. package/out-tsc/src/form/FieldRenderer.js.map +1 -0
  55. package/out-tsc/src/form/ImagePicker.js +122 -126
  56. package/out-tsc/src/form/ImagePicker.js.map +1 -1
  57. package/out-tsc/src/form/KeyValueEditor.js +41 -37
  58. package/out-tsc/src/form/KeyValueEditor.js.map +1 -1
  59. package/out-tsc/src/form/MessageEditor.js +55 -63
  60. package/out-tsc/src/form/MessageEditor.js.map +1 -1
  61. package/out-tsc/src/form/TembaSlider.js +3 -3
  62. package/out-tsc/src/form/TembaSlider.js.map +1 -1
  63. package/out-tsc/src/form/TemplateEditor.js +3 -3
  64. package/out-tsc/src/form/TemplateEditor.js.map +1 -1
  65. package/out-tsc/src/form/TextInput.js +23 -27
  66. package/out-tsc/src/form/TextInput.js.map +1 -1
  67. package/out-tsc/src/form/select/Select.js +57 -35
  68. package/out-tsc/src/form/select/Select.js.map +1 -1
  69. package/out-tsc/src/form/select/UserSelect.js +8 -9
  70. package/out-tsc/src/form/select/UserSelect.js.map +1 -1
  71. package/out-tsc/src/form/select/WorkspaceSelect.js +7 -8
  72. package/out-tsc/src/form/select/WorkspaceSelect.js.map +1 -1
  73. package/out-tsc/src/live/ContactChat.js +62 -44
  74. package/out-tsc/src/live/ContactChat.js.map +1 -1
  75. package/out-tsc/src/live/ContactFieldEditor.js.map +1 -1
  76. package/out-tsc/src/markdown.js +13 -11
  77. package/out-tsc/src/markdown.js.map +1 -1
  78. package/out-tsc/temba-modules.js +3 -2
  79. package/out-tsc/temba-modules.js.map +1 -1
  80. package/out-tsc/test/ActionHelper.js +2 -0
  81. package/out-tsc/test/ActionHelper.js.map +1 -1
  82. package/out-tsc/test/NodeHelper.js +148 -0
  83. package/out-tsc/test/NodeHelper.js.map +1 -0
  84. package/out-tsc/test/actions/call_llm.test.js +103 -0
  85. package/out-tsc/test/actions/call_llm.test.js.map +1 -0
  86. package/out-tsc/test/nodes/split_by_llm_categorize.test.js +532 -0
  87. package/out-tsc/test/nodes/split_by_llm_categorize.test.js.map +1 -0
  88. package/out-tsc/test/nodes/split_by_random.test.js +150 -0
  89. package/out-tsc/test/nodes/split_by_random.test.js.map +1 -0
  90. package/out-tsc/test/nodes/wait_for_digits.test.js +150 -0
  91. package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -0
  92. package/out-tsc/test/nodes/wait_for_response.test.js +171 -0
  93. package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -0
  94. package/out-tsc/test/temba-add-input-labels.test.js +70 -0
  95. package/out-tsc/test/temba-add-input-labels.test.js.map +1 -0
  96. package/out-tsc/test/temba-checkbox.test.js +16 -0
  97. package/out-tsc/test/temba-checkbox.test.js.map +1 -1
  98. package/out-tsc/test/temba-field-renderer.test.js +296 -0
  99. package/out-tsc/test/temba-field-renderer.test.js.map +1 -0
  100. package/out-tsc/test/temba-integration-markdown.test.js +2 -4
  101. package/out-tsc/test/temba-integration-markdown.test.js.map +1 -1
  102. package/out-tsc/test/temba-markdown.test.js +1 -1
  103. package/out-tsc/test/temba-markdown.test.js.map +1 -1
  104. package/out-tsc/test/temba-node-editor.test.js +400 -0
  105. package/out-tsc/test/temba-node-editor.test.js.map +1 -1
  106. package/out-tsc/test/temba-select.test.js +6 -3
  107. package/out-tsc/test/temba-select.test.js.map +1 -1
  108. package/out-tsc/test/temba-slider.test.js +0 -1
  109. package/out-tsc/test/temba-slider.test.js.map +1 -1
  110. package/out-tsc/test/temba-webchat.test.js +1 -1
  111. package/out-tsc/test/temba-webchat.test.js.map +1 -1
  112. package/package.json +1 -1
  113. package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
  114. package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
  115. package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
  116. package/screenshots/truth/actions/call_llm/editor/information-extraction.png +0 -0
  117. package/screenshots/truth/actions/call_llm/editor/sentiment-analysis.png +0 -0
  118. package/screenshots/truth/actions/call_llm/editor/summarization.png +0 -0
  119. package/screenshots/truth/actions/call_llm/editor/translation-task.png +0 -0
  120. package/screenshots/truth/actions/call_llm/render/information-extraction.png +0 -0
  121. package/screenshots/truth/actions/call_llm/render/sentiment-analysis.png +0 -0
  122. package/screenshots/truth/actions/call_llm/render/summarization.png +0 -0
  123. package/screenshots/truth/actions/call_llm/render/translation-task.png +0 -0
  124. package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
  125. package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
  126. package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
  127. package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
  128. package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
  129. package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
  130. package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
  131. package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
  132. package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
  133. package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
  134. package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
  135. package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
  136. package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
  137. package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
  138. package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
  139. package/screenshots/truth/checkbox/checkbox-label-background-hover.png +0 -0
  140. package/screenshots/truth/checkbox/checkbox-no-label-no-background-hover.png +0 -0
  141. package/screenshots/truth/checkbox/checkbox-with-help-text.png +0 -0
  142. package/screenshots/truth/checkbox/checked.png +0 -0
  143. package/screenshots/truth/checkbox/default.png +0 -0
  144. package/screenshots/truth/colorpicker/default.png +0 -0
  145. package/screenshots/truth/colorpicker/focused.png +0 -0
  146. package/screenshots/truth/colorpicker/initialized.png +0 -0
  147. package/screenshots/truth/colorpicker/selected.png +0 -0
  148. package/screenshots/truth/editor/router.png +0 -0
  149. package/screenshots/truth/editor/send_msg.png +0 -0
  150. package/screenshots/truth/editor/set_contact_language.png +0 -0
  151. package/screenshots/truth/editor/set_contact_name.png +0 -0
  152. package/screenshots/truth/editor/set_run_result.png +0 -0
  153. package/screenshots/truth/editor/wait.png +0 -0
  154. package/screenshots/truth/field-renderer/checkbox-checked.png +0 -0
  155. package/screenshots/truth/field-renderer/checkbox-unchecked.png +0 -0
  156. package/screenshots/truth/field-renderer/checkbox-with-errors.png +0 -0
  157. package/screenshots/truth/field-renderer/context-comparison.png +0 -0
  158. package/screenshots/truth/field-renderer/key-value-with-label.png +0 -0
  159. package/screenshots/truth/field-renderer/message-editor-with-label.png +0 -0
  160. package/screenshots/truth/field-renderer/select-multi.png +0 -0
  161. package/screenshots/truth/field-renderer/select-no-label.png +0 -0
  162. package/screenshots/truth/field-renderer/select-with-label.png +0 -0
  163. package/screenshots/truth/field-renderer/text-evaluated.png +0 -0
  164. package/screenshots/truth/field-renderer/text-no-label.png +0 -0
  165. package/screenshots/truth/field-renderer/text-with-errors.png +0 -0
  166. package/screenshots/truth/field-renderer/text-with-label.png +0 -0
  167. package/screenshots/truth/field-renderer/textarea-evaluated.png +0 -0
  168. package/screenshots/truth/field-renderer/textarea-with-label.png +0 -0
  169. package/screenshots/truth/integration/checkbox-markdown-errors.png +0 -0
  170. package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
  171. package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
  172. package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
  173. package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
  174. package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
  175. package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
  176. package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
  177. package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
  178. package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
  179. package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
  180. package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
  181. package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
  182. package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
  183. package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
  184. package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
  185. package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
  186. package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
  187. package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
  188. package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
  189. package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
  190. package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
  191. package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
  192. package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
  193. package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
  194. package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
  195. package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
  196. package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
  197. package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
  198. package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
  199. package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
  200. package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
  201. package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
  202. package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
  203. package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
  204. package/screenshots/truth/omnibox/selected.png +0 -0
  205. package/screenshots/truth/run-list/basic.png +0 -0
  206. package/screenshots/truth/select/functions.png +0 -0
  207. package/screenshots/truth/select/multi-with-endpoint.png +0 -0
  208. package/screenshots/truth/select/search-enabled.png +0 -0
  209. package/src/events.ts +12 -6
  210. package/src/excellent/helpers.ts +2 -2
  211. package/src/flow/CanvasNode.ts +22 -1
  212. package/src/flow/Editor.ts +12 -1
  213. package/src/flow/NodeEditor.ts +186 -374
  214. package/src/flow/actions/add_input_labels.ts +45 -0
  215. package/src/flow/actions/call_llm.ts +57 -3
  216. package/src/flow/actions/call_webhook.ts +1 -1
  217. package/src/flow/actions/open_ticket.ts +74 -3
  218. package/src/flow/actions/set_run_result.ts +83 -0
  219. package/src/flow/config.ts +4 -0
  220. package/src/flow/nodes/split_by_llm_categorize.ts +277 -0
  221. package/src/flow/nodes/split_by_ticket.ts +19 -0
  222. package/src/flow/nodes/wait_for_response.ts +28 -1
  223. package/src/flow/types.ts +26 -127
  224. package/src/form/ArrayEditor.ts +79 -139
  225. package/src/form/BaseListEditor.ts +4 -4
  226. package/src/form/Checkbox.ts +81 -24
  227. package/src/form/ColorPicker.ts +31 -43
  228. package/src/form/Completion.ts +49 -56
  229. package/src/form/Compose.ts +8 -8
  230. package/src/form/ContactSearch.ts +3 -4
  231. package/src/form/DatePicker.ts +32 -38
  232. package/src/form/{FormField.ts → FieldElement.ts} +108 -55
  233. package/src/form/FieldRenderer.ts +466 -0
  234. package/src/form/ImagePicker.ts +107 -110
  235. package/src/form/KeyValueEditor.ts +43 -39
  236. package/src/form/MessageEditor.ts +61 -67
  237. package/src/form/TembaSlider.ts +3 -3
  238. package/src/form/TemplateEditor.ts +3 -3
  239. package/src/form/TextInput.ts +26 -29
  240. package/src/form/select/Select.ts +63 -37
  241. package/src/form/select/UserSelect.ts +10 -11
  242. package/src/form/select/WorkspaceSelect.ts +9 -10
  243. package/src/live/ContactChat.ts +62 -47
  244. package/src/live/ContactFieldEditor.ts +2 -2
  245. package/src/markdown.ts +19 -11
  246. package/src/store/flow-definition.d.ts +5 -2
  247. package/static/api/labels.json +31 -0
  248. package/static/api/topics.json +24 -9
  249. package/static/api/users.json +35 -16
  250. package/static/css/temba-components.css +3 -3
  251. package/stress-test.js +18 -13
  252. package/temba-modules.ts +3 -2
  253. package/test/ActionHelper.ts +2 -0
  254. package/test/NodeHelper.ts +184 -0
  255. package/test/actions/call_llm.test.ts +137 -0
  256. package/test/nodes/README.md +78 -0
  257. package/test/nodes/split_by_llm_categorize.test.ts +698 -0
  258. package/test/nodes/split_by_random.test.ts +177 -0
  259. package/test/nodes/wait_for_digits.test.ts +176 -0
  260. package/test/nodes/wait_for_response.test.ts +206 -0
  261. package/test/temba-add-input-labels.test.ts +87 -0
  262. package/test/temba-checkbox.test.ts +26 -0
  263. package/test/temba-field-renderer.test.ts +482 -0
  264. package/test/temba-integration-markdown.test.ts +2 -4
  265. package/test/temba-markdown.test.ts +1 -1
  266. package/test/temba-node-editor.test.ts +496 -0
  267. package/test/temba-select.test.ts +6 -6
  268. package/test/temba-slider.test.ts +0 -1
  269. package/test/temba-webchat.test.ts +1 -1
  270. package/test-assets/contacts/history.json +7 -20
  271. package/test-assets/select/llms.json +18 -0
  272. package/web-dev-mock.mjs +96 -6
  273. package/web-dev-server.config.mjs +29 -7
  274. package/out-tsc/src/form/FormElement.js +0 -67
  275. package/out-tsc/src/form/FormElement.js.map +0 -1
  276. package/out-tsc/src/form/FormField.js.map +0 -1
  277. package/out-tsc/test/temba-formfield.test.js +0 -94
  278. package/out-tsc/test/temba-formfield.test.js.map +0 -1
  279. package/src/form/FormElement.ts +0 -69
  280. package/test/temba-flow-editor.test.ts.backup +0 -563
  281. package/test/temba-formfield.test.ts +0 -121
  282. package/test/temba-utils-index.test.ts.backup +0 -1737
@@ -1 +1 @@
1
- {"version":3,"file":"temba-webchat.test.js","sourceRoot":"","sources":["../../test/temba-webchat.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { useFakeTimers, stub, SinonStub } from 'sinon';\nimport { WebChat } from '../src/webchat/WebChat';\nimport {\n assertScreenshot,\n getClip,\n getComponent,\n mockNow,\n mouseClickElement\n} from '../test/utils.test';\nimport { expect, assert } from '@open-wc/testing';\n\nlet clock: any;\n\nconst TAG = 'temba-webchat';\n\nconst getWebChat = async (attrs: any = {}) => {\n const webChat = (await getComponent(TAG, attrs, '', 400, 600)) as WebChat;\n\n // Ensure component is fully initialized before returning\n await webChat.updateComplete;\n clock.tick(100);\n await webChat.updateComplete;\n\n return webChat;\n};\n\n// Mock WebSocket\nclass MockWebSocket {\n public onopen: ((event: Event) => void) | null = null;\n public onclose: ((event: CloseEvent) => void) | null = null;\n public onmessage: ((event: MessageEvent) => void) | null = null;\n public onerror: ((event: Event) => void) | null = null;\n public readyState: number = 0;\n public url: string;\n public sentMessages: string[] = [];\n public autoOpen: boolean = true;\n\n constructor(url: string) {\n this.url = url;\n // Only auto-open if enabled\n if (this.autoOpen) {\n // Use synchronous execution instead of setTimeout to avoid clock advancing issues\n this.readyState = 1; // OPEN\n if (this.onopen) {\n this.onopen(new Event('open'));\n }\n }\n }\n\n send(data: string) {\n this.sentMessages.push(data);\n }\n\n close() {\n this.readyState = 3; // CLOSED\n if (this.onclose) {\n this.onclose(new CloseEvent('close'));\n }\n }\n\n // Test helper to manually open connection\n manualOpen() {\n this.readyState = 1; // OPEN\n if (this.onopen) {\n this.onopen(new Event('open'));\n }\n }\n\n // Test helper to simulate incoming messages\n simulateMessage(data: any) {\n if (this.onmessage) {\n this.onmessage(\n new MessageEvent('message', { data: JSON.stringify(data) })\n );\n }\n }\n\n // Test helper to simulate errors\n simulateError() {\n if (this.onerror) {\n this.onerror(new Event('error'));\n }\n }\n}\n\ndescribe('temba-webchat', () => {\n let originalWebSocket: any;\n let mockWebSocket: MockWebSocket;\n let webSocketStub: SinonStub;\n let cookieStub: SinonStub;\n let mockedNow: SinonStub;\n\n beforeEach(() => {\n mockedNow = mockNow('2021-03-31T00:31:00.000-00:00');\n\n // Mock WebSocket\n originalWebSocket = window.WebSocket;\n webSocketStub = stub(window, 'WebSocket').callsFake((url: string) => {\n mockWebSocket = new MockWebSocket(url);\n mockWebSocket.autoOpen = false; // Disable auto-open by default\n return mockWebSocket as any;\n });\n\n // Mock document.cookie\n cookieStub = stub(document, 'cookie').value('');\n\n // Use fake timers but with a shorter timeout to avoid test hanging\n clock = useFakeTimers({\n shouldAdvanceTime: true,\n advanceTimeDelta: 10\n });\n });\n\n afterEach(() => {\n clock.restore();\n webSocketStub.restore();\n cookieStub.restore();\n mockedNow.restore();\n window.WebSocket = originalWebSocket;\n });\n\n describe('Component Initialization', () => {\n it('creates component with default properties', async () => {\n const webChat = await getWebChat();\n\n assert.instanceOf(webChat, WebChat);\n expect(webChat.open).to.equal(false);\n expect(webChat.status).to.equal('disconnected');\n expect(webChat.hasPendingText).to.equal(false);\n expect(webChat.messageGroups).to.deep.equal([]);\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('accepts channel and urn properties', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n urn: 'test-urn-123'\n });\n\n expect(webChat.channel).to.equal('test-channel');\n expect(webChat.urn).to.equal('test-urn-123');\n });\n\n it('accepts host and activeUserAvatar properties', async () => {\n const webChat = await getWebChat({\n host: 'example.com',\n activeUserAvatar: 'https://example.com/avatar.jpg'\n });\n\n expect(webChat.host).to.equal('example.com');\n expect(webChat.activeUserAvatar).to.equal(\n 'https://example.com/avatar.jpg'\n );\n });\n\n it('initializes chat component on first update', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n // Check that the chat component was initialized\n const chatElement = webChat.shadowRoot.querySelector('temba-chat');\n expect(chatElement).to.exist;\n });\n });\n\n describe('UI Rendering', () => {\n it('renders closed chat widget by default', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n await assertScreenshot('webchat/closed-widget', getClip(webChat));\n });\n\n it('renders opened chat widget', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true\n });\n\n await assertScreenshot('webchat/opened-widget', getClip(webChat));\n });\n\n it('renders connecting state', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.open).to.equal(false);\n expect(webChat.status).to.equal('disconnected');\n\n // Click to open the widget, which should trigger connecting state\n const toggleElement = webChat.shadowRoot.querySelector('.toggle');\n expect(toggleElement).to.exist;\n\n await mouseClickElement(toggleElement);\n await webChat.updateComplete;\n clock.tick(50);\n\n // Now it should be open and connecting\n expect(webChat.open).to.equal(true);\n expect(webChat.status).to.equal('connecting');\n\n await assertScreenshot('webchat/connecting-state', getClip(webChat));\n });\n\n it('renders disconnected state with reconnect option', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'disconnected'\n });\n\n await assertScreenshot('webchat/disconnected-state', getClip(webChat));\n });\n\n it('renders connected state with input field', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n // the cursor is blinking, we need to account for it in our screenshot by making it transparent\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n expect(inputField).to.exist;\n inputField.style.caretColor = 'transparent';\n\n await assertScreenshot('webchat/connected-state', getClip(webChat));\n });\n });\n\n describe('Chat Toggle Functionality', () => {\n it('toggles chat open/closed', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.open).to.equal(false);\n\n // Click the toggle element\n const toggleElement = webChat.shadowRoot.querySelector('.toggle');\n expect(toggleElement).to.exist;\n\n await mouseClickElement(toggleElement);\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.open).to.equal(true);\n\n // Click toggle again\n await mouseClickElement(toggleElement);\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.open).to.equal(false);\n });\n\n it('toggles chat via close button', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true\n });\n\n expect(webChat.open).to.equal(true);\n\n // Click close button in header\n const closeButton = webChat.shadowRoot.querySelector('.close-button');\n expect(closeButton).to.exist;\n\n await mouseClickElement(closeButton);\n await webChat.updateComplete;\n\n expect(webChat.open).to.equal(false);\n });\n\n it('opens chat programmatically', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.open).to.equal(false);\n\n webChat.openChat();\n await webChat.updateComplete;\n\n expect(webChat.open).to.equal(true);\n });\n });\n\n describe('Socket Connection Management', () => {\n it('opens socket when chat is opened', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.status).to.equal('disconnected');\n\n // Open chat - this should trigger socket connection\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('connecting');\n expect(webSocketStub.called).to.be.true;\n expect(mockWebSocket.url).to.include('test-channel');\n\n // Now simulate the socket opening\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('connected');\n });\n\n it('does not open socket if already connecting or connected', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n // First connection\n webChat.open = true;\n await webChat.updateComplete;\n await clock.tick(0);\n\n const firstCallCount = webSocketStub.callCount;\n\n // Try to connect again while connecting\n webChat.open = false;\n webChat.open = true;\n await webChat.updateComplete;\n await clock.tick(0);\n\n // Should not create another socket\n expect(webSocketStub.callCount).to.equal(firstCallCount);\n });\n\n it('constructs correct WebSocket URL with channel', async () => {\n const webChat = await getWebChat({\n channel: 'my-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(mockWebSocket.url).to.equal(\n 'wss://localhost.textit.com/wc/connect/my-channel/'\n );\n });\n\n it('includes urn in WebSocket URL when present', async () => {\n const webChat = await getWebChat({\n channel: 'my-channel',\n urn: 'chat-123'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(mockWebSocket.url).to.equal(\n 'wss://localhost.textit.com/wc/connect/my-channel/?chat_id=chat-123'\n );\n });\n\n it('sends start_chat command on socket open', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n\n // Manually open the socket to trigger the start_chat command\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n clock.tick(100);\n\n expect(mockWebSocket.sentMessages.length).to.be.at.least(1);\n const sentMessage = JSON.parse(mockWebSocket.sentMessages[0]);\n expect(sentMessage.type).to.equal('start_chat');\n });\n\n it('includes chat_id in start_chat command when urn is present', async () => {\n // Set the cookie directly in document.cookie\n cookieStub.value('temba-chat-urn=existing-chat-123');\n\n const webChat = await getWebChat({\n channel: 'test-channel',\n urn: 'existing-chat-123'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n clock.tick(50);\n\n const sentMessage = JSON.parse(mockWebSocket.sentMessages[0]);\n expect(sentMessage.type).to.equal('start_chat');\n // The chat_id should be 'existing-chat-123' either from the urn property or cookie\n expect(sentMessage.chat_id).to.equal('existing-chat-123');\n });\n\n it('handles socket close event', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('connecting');\n\n mockWebSocket.close();\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('disconnected');\n });\n\n it('handles socket error event', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connecting');\n\n mockWebSocket.simulateError();\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('disconnected');\n });\n\n it('reconnects when reconnect button is clicked', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'disconnected'\n });\n\n const reconnectButton = webChat.shadowRoot.querySelector('.reconnect');\n expect(reconnectButton).to.exist;\n\n await mouseClickElement(reconnectButton);\n await webChat.updateComplete;\n\n expect(webSocketStub.called).to.be.true;\n expect(webChat.status).to.equal('connecting');\n });\n });\n\n describe('Message Handling', () => {\n it('handles chat_started message', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connected');\n\n // Simulate chat_started message\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'new-chat-456'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('new-chat-456');\n expect(webChat.messageGroups).to.deep.equal([]);\n });\n\n it('handles chat_resumed message and fetches history', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate chat_resumed message\n mockWebSocket.simulateMessage({\n type: 'chat_resumed',\n chat_id: 'resumed-chat-789'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('resumed-chat-789');\n\n // Should have sent get_history command\n expect(mockWebSocket.sentMessages.length).to.be.greaterThan(1);\n const lastMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(lastMessage.type).to.equal('get_history');\n });\n\n it('handles chat_out message and sends ack', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Simulate incoming message\n mockWebSocket.simulateMessage({\n type: 'chat_out',\n msg_out: {\n id: 'msg-123',\n text: 'Hello from server',\n time: '2021-03-31T00:31:00.000Z',\n user: {\n id: 'user-1',\n name: 'Test User',\n email: 'test@example.com'\n }\n }\n });\n await webChat.updateComplete;\n\n // Should have sent ack\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const ackMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(ackMessage.type).to.equal('ack_chat');\n expect(ackMessage.msg_id).to.equal('msg-123');\n });\n\n it('handles history response', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate history response\n mockWebSocket.simulateMessage({\n type: 'history',\n history: [\n {\n msg_out: {\n id: 'msg-1',\n text: 'First message',\n time: '2021-03-31T00:30:00.000Z',\n user: { id: 'user-1', name: 'User', email: 'user@example.com' }\n }\n },\n {\n msg_in: {\n id: 'msg-2',\n text: 'Second message',\n time: '2021-03-31T00:30:30.000Z'\n }\n }\n ]\n });\n await webChat.updateComplete;\n\n // Should have updated beforeTime and unblocked history fetching\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('clears messages when chat_id changes', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n urn: 'old-chat-123'\n });\n\n webChat.messageGroups = [['existing', 'messages']];\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate chat_started with different chat_id\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'new-chat-456'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('new-chat-456');\n expect(webChat.messageGroups).to.deep.equal([]);\n });\n\n it('keeps messages when chat_id is the same', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // First, simulate a chat_started to set the URN\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'same-chat-123'\n });\n await webChat.updateComplete;\n\n // Now set some messages\n webChat.messageGroups = [['existing', 'messages']];\n await webChat.updateComplete;\n\n // Simulate another chat_started with the same chat_id\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'same-chat-123'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('same-chat-123');\n expect(webChat.messageGroups).to.deep.equal([['existing', 'messages']]);\n });\n });\n\n describe('User Input and Message Sending', () => {\n it('updates hasPendingText on keyup', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n expect(inputField).to.exist;\n\n expect(webChat.hasPendingText).to.equal(false);\n\n // Simulate typing\n inputField.value = 'Hello';\n inputField.dispatchEvent(new KeyboardEvent('keydown', { key: 'h' }));\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(true);\n\n // Clear input\n inputField.value = '';\n inputField.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Backspace' })\n );\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(false);\n });\n\n it('sends message on Enter key', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Ensure the socket is properly set\n expect(webChat.status).to.equal('connected');\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n inputField.value = 'Test message';\n webChat.hasPendingText = true;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Call handleKeyUp directly with Enter key event\n webChat.handleKeyUp({ key: 'Enter', target: inputField });\n await webChat.updateComplete;\n\n // Should have sent message\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const sentMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(sentMessage.type).to.equal('send_msg');\n expect(sentMessage.text).to.equal('Test message');\n\n // input should be cleared and hasPendingText should be false\n expect(inputField.value).to.equal('');\n expect(webChat.hasPendingText).to.equal(false);\n });\n\n it('sends message via send button click', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n\n inputField.value = 'Button click message';\n webChat.hasPendingText = true;\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // call sendPendingMessage directly since it's a private method called by click handler\n (webChat as any).sendPendingMessage();\n await webChat.updateComplete;\n\n // should have sent message\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const sentMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(sentMessage.type).to.equal('send_msg');\n expect(sentMessage.text).to.equal('Button click message');\n });\n\n it('focuses input when input panel is clicked', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n const inputPanel = webChat.shadowRoot.querySelector('.input-panel');\n expect(inputPanel).to.exist;\n\n // Mock focus method\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n let focusCalled = false;\n inputField.focus = () => {\n focusCalled = true;\n };\n\n await mouseClickElement(inputPanel);\n\n expect(focusCalled).to.be.true;\n });\n\n it('does not send message when disconnected', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true\n });\n\n // Keep the status as disconnected - don't connect the socket\n expect(webChat.status).to.equal('disconnected');\n\n // Find input field - it might not exist in disconnected state\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n if (inputField) {\n inputField.value = 'Should not send';\n webChat.hasPendingText = true;\n\n // Try to send message by calling handleKeyUp\n webChat.handleKeyUp({ key: 'Enter', target: inputField });\n await webChat.updateComplete;\n }\n\n // Should not have created any WebSocket connections\n expect(webSocketStub.called).to.be.false;\n });\n });\n\n describe('History Fetching', () => {\n it('fetches previous messages when requested', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Manually call fetchPreviousMessages\n webChat.fetchPreviousMessages();\n await webChat.updateComplete;\n\n expect(webChat.blockHistoryFetching).to.equal(true);\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n\n const historyRequest = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(historyRequest.type).to.equal('get_history');\n expect(historyRequest.before).to.exist;\n });\n\n it('does not fetch when already fetching', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.blockHistoryFetching = true;\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Try to fetch - should be blocked\n webChat.fetchPreviousMessages();\n await webChat.updateComplete;\n\n expect(mockWebSocket.sentMessages.length).to.equal(initialMessageCount);\n });\n\n it('completes fetch and unblocks history fetching', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.blockHistoryFetching = true;\n\n webChat.fetchComplete();\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n });\n\n describe('Edge Cases and Additional Coverage', () => {\n it('handles keyup events that are not Enter', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n inputField.value = 'Some text';\n\n // Test with non-Enter key\n webChat.handleKeyUp({ key: 'a', target: inputField });\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(true);\n\n // Test with empty value\n inputField.value = '';\n webChat.handleKeyUp({ key: 'Backspace', target: inputField });\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(false);\n });\n\n it('does not send message on Enter if no pending text', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n inputField.value = '';\n webChat.hasPendingText = false;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Try to send with Enter but no pending text\n webChat.handleKeyUp({ key: 'Enter', target: inputField });\n await webChat.updateComplete;\n\n // Should not have sent any new messages\n expect(mockWebSocket.sentMessages.length).to.equal(initialMessageCount);\n });\n\n it('updates status when open changes from false to true', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.status).to.equal('disconnected');\n\n // Open the chat for the first time\n webChat.open = true;\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connecting');\n expect(webSocketStub.called).to.be.true;\n });\n\n it('focuses input when status changes to connected', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n // Open chat to trigger connection\n webChat.open = true;\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connecting');\n\n // Mock focus method before the input is rendered\n let focusCalled = false;\n const originalFocus = HTMLInputElement.prototype.focus;\n HTMLInputElement.prototype.focus = function () {\n focusCalled = true;\n };\n\n // Manually open socket to trigger status change to connected\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Restore original focus\n HTMLInputElement.prototype.focus = originalFocus;\n\n // Focus should have been called when status changed to connected\n expect(focusCalled).to.be.true;\n });\n\n it('handles focus input when input element does not exist', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'disconnected'\n });\n\n // Try to focus input when it might not exist\n (webChat as any).focusInput();\n\n // Should not throw an error\n expect(true).to.be.true;\n });\n\n it('handles empty history response', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate empty history response\n mockWebSocket.simulateMessage({\n type: 'history',\n history: []\n });\n await webChat.updateComplete;\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('handles message with msg_in in history response', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate history response with msg_in first\n mockWebSocket.simulateMessage({\n type: 'history',\n history: [\n {\n msg_in: {\n id: 'msg-1',\n text: 'Incoming message',\n time: '2021-03-31T00:30:00.000Z'\n }\n }\n ]\n });\n await webChat.updateComplete;\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('prevents event propagation on input panel click', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n const inputPanel = webChat.shadowRoot.querySelector('.input-panel');\n expect(inputPanel).to.exist;\n\n let preventDefaultCalled = false;\n let stopPropagationCalled = false;\n\n const mockEvent = {\n preventDefault: () => {\n preventDefaultCalled = true;\n },\n stopPropagation: () => {\n stopPropagationCalled = true;\n }\n };\n\n (webChat as any).handleClickInputPanel(mockEvent);\n\n expect(preventDefaultCalled).to.be.true;\n expect(stopPropagationCalled).to.be.true;\n });\n\n it('handles unknown message types gracefully', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate unknown message type\n mockWebSocket.simulateMessage({\n type: 'unknown_message_type',\n data: 'some data'\n });\n await webChat.updateComplete;\n\n // Should not throw an error\n expect(true).to.be.true;\n });\n });\n\n describe('Integration with Chat Component', () => {\n it('listens to scroll threshold event for history fetching', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const chatElement = webChat.shadowRoot.querySelector('temba-chat');\n expect(chatElement).to.exist;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Simulate scroll threshold event\n chatElement.dispatchEvent(new CustomEvent('temba-scroll-threshold'));\n await webChat.updateComplete;\n\n // Should have triggered history fetch\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const historyRequest = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(historyRequest.type).to.equal('get_history');\n });\n\n it('listens to fetch complete event', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.blockHistoryFetching = true;\n\n const chatElement = webChat.shadowRoot.querySelector('temba-chat');\n expect(chatElement).to.exist;\n\n // Simulate fetch complete event\n chatElement.dispatchEvent(new CustomEvent('temba-fetch-complete'));\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-webchat.test.js","sourceRoot":"","sources":["../../test/temba-webchat.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { useFakeTimers, stub, SinonStub } from 'sinon';\nimport { WebChat } from '../src/webchat/WebChat';\nimport {\n assertScreenshot,\n getClip,\n getComponent,\n mockNow,\n mouseClickElement\n} from '../test/utils.test';\nimport { expect, assert } from '@open-wc/testing';\n\nlet clock: any;\n\nconst TAG = 'temba-webchat';\n\nconst getWebChat = async (attrs: any = {}) => {\n const webChat = (await getComponent(TAG, attrs, '', 400, 600)) as WebChat;\n\n // Ensure component is fully initialized before returning\n await webChat.updateComplete;\n clock.tick(100);\n await webChat.updateComplete;\n\n return webChat;\n};\n\n// Mock WebSocket\nclass MockWebSocket {\n public onopen: ((event: Event) => void) | null = null;\n public onclose: ((event: CloseEvent) => void) | null = null;\n public onmessage: ((event: MessageEvent) => void) | null = null;\n public onerror: ((event: Event) => void) | null = null;\n public readyState: number = 0;\n public url: string;\n public sentMessages: string[] = [];\n public autoOpen: boolean = true;\n\n constructor(url: string) {\n this.url = url;\n // Only auto-open if enabled\n if (this.autoOpen) {\n // Use synchronous execution instead of setTimeout to avoid clock advancing issues\n this.readyState = 1; // OPEN\n if (this.onopen) {\n this.onopen(new Event('open'));\n }\n }\n }\n\n send(data: string) {\n this.sentMessages.push(data);\n }\n\n close() {\n this.readyState = 3; // CLOSED\n if (this.onclose) {\n this.onclose(new CloseEvent('close'));\n }\n }\n\n // Test helper to manually open connection\n manualOpen() {\n this.readyState = 1; // OPEN\n if (this.onopen) {\n this.onopen(new Event('open'));\n }\n }\n\n // Test helper to simulate incoming messages\n simulateMessage(data: any) {\n if (this.onmessage) {\n this.onmessage(\n new MessageEvent('message', { data: JSON.stringify(data) })\n );\n }\n }\n\n // Test helper to simulate errors\n simulateError() {\n if (this.onerror) {\n this.onerror(new Event('error'));\n }\n }\n}\n\ndescribe('temba-webchat', () => {\n let originalWebSocket: any;\n let mockWebSocket: MockWebSocket;\n let webSocketStub: SinonStub;\n let cookieStub: SinonStub;\n let mockedNow: SinonStub;\n\n beforeEach(() => {\n mockedNow = mockNow('2021-03-31T00:31:00.000-00:00');\n\n // Mock WebSocket\n originalWebSocket = window.WebSocket;\n webSocketStub = stub(window, 'WebSocket').callsFake((url: string) => {\n mockWebSocket = new MockWebSocket(url);\n mockWebSocket.autoOpen = false; // Disable auto-open by default\n return mockWebSocket as any;\n });\n\n // Mock document.cookie\n cookieStub = stub(document, 'cookie').value('');\n\n // Use fake timers but with a shorter timeout to avoid test hanging\n clock = useFakeTimers({\n shouldAdvanceTime: true,\n advanceTimeDelta: 10\n });\n });\n\n afterEach(() => {\n clock.restore();\n webSocketStub.restore();\n cookieStub.restore();\n mockedNow.restore();\n window.WebSocket = originalWebSocket;\n });\n\n describe('Component Initialization', () => {\n it('creates component with default properties', async () => {\n const webChat = await getWebChat();\n\n assert.instanceOf(webChat, WebChat);\n expect(webChat.open).to.equal(false);\n expect(webChat.status).to.equal('disconnected');\n expect(webChat.hasPendingText).to.equal(false);\n expect(webChat.messageGroups).to.deep.equal([]);\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('accepts channel and urn properties', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n urn: 'test-urn-123'\n });\n\n expect(webChat.channel).to.equal('test-channel');\n expect(webChat.urn).to.equal('test-urn-123');\n });\n\n it('accepts host and activeUserAvatar properties', async () => {\n const webChat = await getWebChat({\n host: 'example.com',\n activeUserAvatar: 'https://example.com/avatar.jpg'\n });\n\n expect(webChat.host).to.equal('example.com');\n expect(webChat.activeUserAvatar).to.equal(\n 'https://example.com/avatar.jpg'\n );\n });\n\n it('initializes chat component on first update', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n // Check that the chat component was initialized\n const chatElement = webChat.shadowRoot.querySelector('temba-chat');\n expect(chatElement).to.exist;\n });\n });\n\n describe('UI Rendering', () => {\n it('renders closed chat widget by default', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n await assertScreenshot('webchat/closed-widget', getClip(webChat));\n });\n\n it('renders opened chat widget', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true\n });\n\n await assertScreenshot('webchat/opened-widget', getClip(webChat));\n });\n\n it('renders connecting state', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.open).to.equal(false);\n expect(webChat.status).to.equal('disconnected');\n\n // Click to open the widget, which should trigger connecting state\n const toggleElement = webChat.shadowRoot.querySelector('.toggle');\n expect(toggleElement).to.exist;\n\n await mouseClickElement(toggleElement);\n await webChat.updateComplete;\n clock.tick(50);\n\n // Now it should be open and connecting\n expect(webChat.open).to.equal(true);\n expect(webChat.status).to.equal('connecting');\n\n // await assertScreenshot('webchat/connecting-state', getClip(webChat));\n });\n\n it('renders disconnected state with reconnect option', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'disconnected'\n });\n\n await assertScreenshot('webchat/disconnected-state', getClip(webChat));\n });\n\n it('renders connected state with input field', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n // the cursor is blinking, we need to account for it in our screenshot by making it transparent\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n expect(inputField).to.exist;\n inputField.style.caretColor = 'transparent';\n\n await assertScreenshot('webchat/connected-state', getClip(webChat));\n });\n });\n\n describe('Chat Toggle Functionality', () => {\n it('toggles chat open/closed', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.open).to.equal(false);\n\n // Click the toggle element\n const toggleElement = webChat.shadowRoot.querySelector('.toggle');\n expect(toggleElement).to.exist;\n\n await mouseClickElement(toggleElement);\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.open).to.equal(true);\n\n // Click toggle again\n await mouseClickElement(toggleElement);\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.open).to.equal(false);\n });\n\n it('toggles chat via close button', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true\n });\n\n expect(webChat.open).to.equal(true);\n\n // Click close button in header\n const closeButton = webChat.shadowRoot.querySelector('.close-button');\n expect(closeButton).to.exist;\n\n await mouseClickElement(closeButton);\n await webChat.updateComplete;\n\n expect(webChat.open).to.equal(false);\n });\n\n it('opens chat programmatically', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.open).to.equal(false);\n\n webChat.openChat();\n await webChat.updateComplete;\n\n expect(webChat.open).to.equal(true);\n });\n });\n\n describe('Socket Connection Management', () => {\n it('opens socket when chat is opened', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.status).to.equal('disconnected');\n\n // Open chat - this should trigger socket connection\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('connecting');\n expect(webSocketStub.called).to.be.true;\n expect(mockWebSocket.url).to.include('test-channel');\n\n // Now simulate the socket opening\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('connected');\n });\n\n it('does not open socket if already connecting or connected', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n // First connection\n webChat.open = true;\n await webChat.updateComplete;\n await clock.tick(0);\n\n const firstCallCount = webSocketStub.callCount;\n\n // Try to connect again while connecting\n webChat.open = false;\n webChat.open = true;\n await webChat.updateComplete;\n await clock.tick(0);\n\n // Should not create another socket\n expect(webSocketStub.callCount).to.equal(firstCallCount);\n });\n\n it('constructs correct WebSocket URL with channel', async () => {\n const webChat = await getWebChat({\n channel: 'my-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(mockWebSocket.url).to.equal(\n 'wss://localhost.textit.com/wc/connect/my-channel/'\n );\n });\n\n it('includes urn in WebSocket URL when present', async () => {\n const webChat = await getWebChat({\n channel: 'my-channel',\n urn: 'chat-123'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(mockWebSocket.url).to.equal(\n 'wss://localhost.textit.com/wc/connect/my-channel/?chat_id=chat-123'\n );\n });\n\n it('sends start_chat command on socket open', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n\n // Manually open the socket to trigger the start_chat command\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n clock.tick(100);\n\n expect(mockWebSocket.sentMessages.length).to.be.at.least(1);\n const sentMessage = JSON.parse(mockWebSocket.sentMessages[0]);\n expect(sentMessage.type).to.equal('start_chat');\n });\n\n it('includes chat_id in start_chat command when urn is present', async () => {\n // Set the cookie directly in document.cookie\n cookieStub.value('temba-chat-urn=existing-chat-123');\n\n const webChat = await getWebChat({\n channel: 'test-channel',\n urn: 'existing-chat-123'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n clock.tick(50);\n\n const sentMessage = JSON.parse(mockWebSocket.sentMessages[0]);\n expect(sentMessage.type).to.equal('start_chat');\n // The chat_id should be 'existing-chat-123' either from the urn property or cookie\n expect(sentMessage.chat_id).to.equal('existing-chat-123');\n });\n\n it('handles socket close event', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('connecting');\n\n mockWebSocket.close();\n await webChat.updateComplete;\n clock.tick(50);\n\n expect(webChat.status).to.equal('disconnected');\n });\n\n it('handles socket error event', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connecting');\n\n mockWebSocket.simulateError();\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('disconnected');\n });\n\n it('reconnects when reconnect button is clicked', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'disconnected'\n });\n\n const reconnectButton = webChat.shadowRoot.querySelector('.reconnect');\n expect(reconnectButton).to.exist;\n\n await mouseClickElement(reconnectButton);\n await webChat.updateComplete;\n\n expect(webSocketStub.called).to.be.true;\n expect(webChat.status).to.equal('connecting');\n });\n });\n\n describe('Message Handling', () => {\n it('handles chat_started message', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connected');\n\n // Simulate chat_started message\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'new-chat-456'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('new-chat-456');\n expect(webChat.messageGroups).to.deep.equal([]);\n });\n\n it('handles chat_resumed message and fetches history', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate chat_resumed message\n mockWebSocket.simulateMessage({\n type: 'chat_resumed',\n chat_id: 'resumed-chat-789'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('resumed-chat-789');\n\n // Should have sent get_history command\n expect(mockWebSocket.sentMessages.length).to.be.greaterThan(1);\n const lastMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(lastMessage.type).to.equal('get_history');\n });\n\n it('handles chat_out message and sends ack', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Simulate incoming message\n mockWebSocket.simulateMessage({\n type: 'chat_out',\n msg_out: {\n id: 'msg-123',\n text: 'Hello from server',\n time: '2021-03-31T00:31:00.000Z',\n user: {\n id: 'user-1',\n name: 'Test User',\n email: 'test@example.com'\n }\n }\n });\n await webChat.updateComplete;\n\n // Should have sent ack\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const ackMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(ackMessage.type).to.equal('ack_chat');\n expect(ackMessage.msg_id).to.equal('msg-123');\n });\n\n it('handles history response', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate history response\n mockWebSocket.simulateMessage({\n type: 'history',\n history: [\n {\n msg_out: {\n id: 'msg-1',\n text: 'First message',\n time: '2021-03-31T00:30:00.000Z',\n user: { id: 'user-1', name: 'User', email: 'user@example.com' }\n }\n },\n {\n msg_in: {\n id: 'msg-2',\n text: 'Second message',\n time: '2021-03-31T00:30:30.000Z'\n }\n }\n ]\n });\n await webChat.updateComplete;\n\n // Should have updated beforeTime and unblocked history fetching\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('clears messages when chat_id changes', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n urn: 'old-chat-123'\n });\n\n webChat.messageGroups = [['existing', 'messages']];\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate chat_started with different chat_id\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'new-chat-456'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('new-chat-456');\n expect(webChat.messageGroups).to.deep.equal([]);\n });\n\n it('keeps messages when chat_id is the same', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // First, simulate a chat_started to set the URN\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'same-chat-123'\n });\n await webChat.updateComplete;\n\n // Now set some messages\n webChat.messageGroups = [['existing', 'messages']];\n await webChat.updateComplete;\n\n // Simulate another chat_started with the same chat_id\n mockWebSocket.simulateMessage({\n type: 'chat_started',\n chat_id: 'same-chat-123'\n });\n await webChat.updateComplete;\n\n expect(webChat.urn).to.equal('same-chat-123');\n expect(webChat.messageGroups).to.deep.equal([['existing', 'messages']]);\n });\n });\n\n describe('User Input and Message Sending', () => {\n it('updates hasPendingText on keyup', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n expect(inputField).to.exist;\n\n expect(webChat.hasPendingText).to.equal(false);\n\n // Simulate typing\n inputField.value = 'Hello';\n inputField.dispatchEvent(new KeyboardEvent('keydown', { key: 'h' }));\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(true);\n\n // Clear input\n inputField.value = '';\n inputField.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Backspace' })\n );\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(false);\n });\n\n it('sends message on Enter key', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Ensure the socket is properly set\n expect(webChat.status).to.equal('connected');\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n inputField.value = 'Test message';\n webChat.hasPendingText = true;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Call handleKeyUp directly with Enter key event\n webChat.handleKeyUp({ key: 'Enter', target: inputField });\n await webChat.updateComplete;\n\n // Should have sent message\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const sentMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(sentMessage.type).to.equal('send_msg');\n expect(sentMessage.text).to.equal('Test message');\n\n // input should be cleared and hasPendingText should be false\n expect(inputField.value).to.equal('');\n expect(webChat.hasPendingText).to.equal(false);\n });\n\n it('sends message via send button click', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n\n inputField.value = 'Button click message';\n webChat.hasPendingText = true;\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // call sendPendingMessage directly since it's a private method called by click handler\n (webChat as any).sendPendingMessage();\n await webChat.updateComplete;\n\n // should have sent message\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const sentMessage = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(sentMessage.type).to.equal('send_msg');\n expect(sentMessage.text).to.equal('Button click message');\n });\n\n it('focuses input when input panel is clicked', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n const inputPanel = webChat.shadowRoot.querySelector('.input-panel');\n expect(inputPanel).to.exist;\n\n // Mock focus method\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n let focusCalled = false;\n inputField.focus = () => {\n focusCalled = true;\n };\n\n await mouseClickElement(inputPanel);\n\n expect(focusCalled).to.be.true;\n });\n\n it('does not send message when disconnected', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true\n });\n\n // Keep the status as disconnected - don't connect the socket\n expect(webChat.status).to.equal('disconnected');\n\n // Find input field - it might not exist in disconnected state\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n if (inputField) {\n inputField.value = 'Should not send';\n webChat.hasPendingText = true;\n\n // Try to send message by calling handleKeyUp\n webChat.handleKeyUp({ key: 'Enter', target: inputField });\n await webChat.updateComplete;\n }\n\n // Should not have created any WebSocket connections\n expect(webSocketStub.called).to.be.false;\n });\n });\n\n describe('History Fetching', () => {\n it('fetches previous messages when requested', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Manually call fetchPreviousMessages\n webChat.fetchPreviousMessages();\n await webChat.updateComplete;\n\n expect(webChat.blockHistoryFetching).to.equal(true);\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n\n const historyRequest = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(historyRequest.type).to.equal('get_history');\n expect(historyRequest.before).to.exist;\n });\n\n it('does not fetch when already fetching', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.blockHistoryFetching = true;\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Try to fetch - should be blocked\n webChat.fetchPreviousMessages();\n await webChat.updateComplete;\n\n expect(mockWebSocket.sentMessages.length).to.equal(initialMessageCount);\n });\n\n it('completes fetch and unblocks history fetching', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.blockHistoryFetching = true;\n\n webChat.fetchComplete();\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n });\n\n describe('Edge Cases and Additional Coverage', () => {\n it('handles keyup events that are not Enter', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n inputField.value = 'Some text';\n\n // Test with non-Enter key\n webChat.handleKeyUp({ key: 'a', target: inputField });\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(true);\n\n // Test with empty value\n inputField.value = '';\n webChat.handleKeyUp({ key: 'Backspace', target: inputField });\n await webChat.updateComplete;\n\n expect(webChat.hasPendingText).to.equal(false);\n });\n\n it('does not send message on Enter if no pending text', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const inputField = webChat.shadowRoot.querySelector(\n '.input'\n ) as HTMLInputElement;\n inputField.value = '';\n webChat.hasPendingText = false;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Try to send with Enter but no pending text\n webChat.handleKeyUp({ key: 'Enter', target: inputField });\n await webChat.updateComplete;\n\n // Should not have sent any new messages\n expect(mockWebSocket.sentMessages.length).to.equal(initialMessageCount);\n });\n\n it('updates status when open changes from false to true', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n expect(webChat.status).to.equal('disconnected');\n\n // Open the chat for the first time\n webChat.open = true;\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connecting');\n expect(webSocketStub.called).to.be.true;\n });\n\n it('focuses input when status changes to connected', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n // Open chat to trigger connection\n webChat.open = true;\n await webChat.updateComplete;\n\n expect(webChat.status).to.equal('connecting');\n\n // Mock focus method before the input is rendered\n let focusCalled = false;\n const originalFocus = HTMLInputElement.prototype.focus;\n HTMLInputElement.prototype.focus = function () {\n focusCalled = true;\n };\n\n // Manually open socket to trigger status change to connected\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Restore original focus\n HTMLInputElement.prototype.focus = originalFocus;\n\n // Focus should have been called when status changed to connected\n expect(focusCalled).to.be.true;\n });\n\n it('handles focus input when input element does not exist', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'disconnected'\n });\n\n // Try to focus input when it might not exist\n (webChat as any).focusInput();\n\n // Should not throw an error\n expect(true).to.be.true;\n });\n\n it('handles empty history response', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate empty history response\n mockWebSocket.simulateMessage({\n type: 'history',\n history: []\n });\n await webChat.updateComplete;\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('handles message with msg_in in history response', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate history response with msg_in first\n mockWebSocket.simulateMessage({\n type: 'history',\n history: [\n {\n msg_in: {\n id: 'msg-1',\n text: 'Incoming message',\n time: '2021-03-31T00:30:00.000Z'\n }\n }\n ]\n });\n await webChat.updateComplete;\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n\n it('prevents event propagation on input panel click', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel',\n open: true,\n status: 'connected'\n });\n\n const inputPanel = webChat.shadowRoot.querySelector('.input-panel');\n expect(inputPanel).to.exist;\n\n let preventDefaultCalled = false;\n let stopPropagationCalled = false;\n\n const mockEvent = {\n preventDefault: () => {\n preventDefaultCalled = true;\n },\n stopPropagation: () => {\n stopPropagationCalled = true;\n }\n };\n\n (webChat as any).handleClickInputPanel(mockEvent);\n\n expect(preventDefaultCalled).to.be.true;\n expect(stopPropagationCalled).to.be.true;\n });\n\n it('handles unknown message types gracefully', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n // Simulate unknown message type\n mockWebSocket.simulateMessage({\n type: 'unknown_message_type',\n data: 'some data'\n });\n await webChat.updateComplete;\n\n // Should not throw an error\n expect(true).to.be.true;\n });\n });\n\n describe('Integration with Chat Component', () => {\n it('listens to scroll threshold event for history fetching', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.open = true;\n await webChat.updateComplete;\n mockWebSocket.manualOpen();\n await webChat.updateComplete;\n\n const chatElement = webChat.shadowRoot.querySelector('temba-chat');\n expect(chatElement).to.exist;\n\n const initialMessageCount = mockWebSocket.sentMessages.length;\n\n // Simulate scroll threshold event\n chatElement.dispatchEvent(new CustomEvent('temba-scroll-threshold'));\n await webChat.updateComplete;\n\n // Should have triggered history fetch\n expect(mockWebSocket.sentMessages.length).to.equal(\n initialMessageCount + 1\n );\n const historyRequest = JSON.parse(\n mockWebSocket.sentMessages[mockWebSocket.sentMessages.length - 1]\n );\n expect(historyRequest.type).to.equal('get_history');\n });\n\n it('listens to fetch complete event', async () => {\n const webChat = await getWebChat({\n channel: 'test-channel'\n });\n\n webChat.blockHistoryFetching = true;\n\n const chatElement = webChat.shadowRoot.querySelector('temba-chat');\n expect(chatElement).to.exist;\n\n // Simulate fetch complete event\n chatElement.dispatchEvent(new CustomEvent('temba-fetch-complete'));\n\n expect(webChat.blockHistoryFetching).to.equal(false);\n });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nyaruka/temba-components",
3
- "version": "0.129.8",
3
+ "version": "0.129.10",
4
4
  "description": "Web components to support rapidpro and related projects",
5
5
  "author": "Nyaruka <code@nyaruka.coim>",
6
6
  "main": "dist/index.js",
Binary file
Binary file