@thoughtspot/visual-embed-sdk 1.50.0 → 1.50.1

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 (188) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +59 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +31 -2
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +13 -2
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +101 -0
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/conversation.d.ts +26 -0
  11. package/cjs/src/embed/conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/conversation.js +12 -2
  13. package/cjs/src/embed/conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.spec.js +23 -0
  15. package/cjs/src/embed/conversation.spec.js.map +1 -1
  16. package/cjs/src/embed/events.spec.js +593 -0
  17. package/cjs/src/embed/events.spec.js.map +1 -1
  18. package/cjs/src/embed/host-events.spec.js +106 -0
  19. package/cjs/src/embed/host-events.spec.js.map +1 -1
  20. package/cjs/src/embed/hostEventClient/contracts.d.ts +36 -14
  21. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  22. package/cjs/src/embed/hostEventClient/contracts.js +10 -1
  23. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  24. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  25. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  26. package/cjs/src/embed/hostEventClient/host-event-client.js +8 -0
  27. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  28. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +209 -0
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/utils.d.ts +2 -0
  31. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/utils.js +32 -2
  33. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/utils.spec.js +178 -0
  35. package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
  36. package/cjs/src/embed/liveboard.d.ts +6 -0
  37. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  38. package/cjs/src/embed/liveboard.js.map +1 -1
  39. package/cjs/src/embed/spotter-viz-utils.d.ts +34 -0
  40. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  41. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  42. package/cjs/src/embed/spotter-viz-utils.spec.js +17 -0
  43. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
  44. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  45. package/cjs/src/embed/ts-embed.js +14 -7
  46. package/cjs/src/embed/ts-embed.js.map +1 -1
  47. package/cjs/src/embed/ts-embed.spec.js +146 -0
  48. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  49. package/cjs/src/errors.d.ts +1 -0
  50. package/cjs/src/errors.d.ts.map +1 -1
  51. package/cjs/src/errors.js +1 -0
  52. package/cjs/src/errors.js.map +1 -1
  53. package/cjs/src/index.d.ts +2 -2
  54. package/cjs/src/index.d.ts.map +1 -1
  55. package/cjs/src/index.js +3 -2
  56. package/cjs/src/index.js.map +1 -1
  57. package/cjs/src/react/util.spec.js +251 -0
  58. package/cjs/src/react/util.spec.js.map +1 -1
  59. package/cjs/src/types.d.ts +119 -2
  60. package/cjs/src/types.d.ts.map +1 -1
  61. package/cjs/src/types.js +97 -0
  62. package/cjs/src/types.js.map +1 -1
  63. package/cjs/src/utils/processData.spec.js +93 -0
  64. package/cjs/src/utils/processData.spec.js.map +1 -1
  65. package/cjs/src/utils/processTrigger.spec.js +61 -0
  66. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  67. package/dist/{index-B5xoN6Cp.js → index-fCne7kmU.js} +1 -1
  68. package/dist/src/css-variables.d.ts +59 -0
  69. package/dist/src/css-variables.d.ts.map +1 -1
  70. package/dist/src/embed/app.d.ts +31 -2
  71. package/dist/src/embed/app.d.ts.map +1 -1
  72. package/dist/src/embed/conversation.d.ts +26 -0
  73. package/dist/src/embed/conversation.d.ts.map +1 -1
  74. package/dist/src/embed/hostEventClient/contracts.d.ts +36 -14
  75. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  76. package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  77. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  78. package/dist/src/embed/hostEventClient/utils.d.ts +2 -0
  79. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  80. package/dist/src/embed/liveboard.d.ts +6 -0
  81. package/dist/src/embed/liveboard.d.ts.map +1 -1
  82. package/dist/src/embed/spotter-viz-utils.d.ts +34 -0
  83. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  84. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  85. package/dist/src/errors.d.ts +1 -0
  86. package/dist/src/errors.d.ts.map +1 -1
  87. package/dist/src/index.d.ts +2 -2
  88. package/dist/src/index.d.ts.map +1 -1
  89. package/dist/src/types.d.ts +119 -2
  90. package/dist/src/types.d.ts.map +1 -1
  91. package/dist/tsembed-react.es.js +389 -84
  92. package/dist/tsembed-react.js +388 -83
  93. package/dist/tsembed.es.js +390 -85
  94. package/dist/tsembed.js +388 -83
  95. package/dist/visual-embed-sdk-react-full.d.ts +302 -17
  96. package/dist/visual-embed-sdk-react.d.ts +302 -17
  97. package/dist/visual-embed-sdk.d.ts +306 -17
  98. package/lib/package.json +1 -1
  99. package/lib/src/css-variables.d.ts +59 -0
  100. package/lib/src/css-variables.d.ts.map +1 -1
  101. package/lib/src/embed/app.d.ts +31 -2
  102. package/lib/src/embed/app.d.ts.map +1 -1
  103. package/lib/src/embed/app.js +13 -2
  104. package/lib/src/embed/app.js.map +1 -1
  105. package/lib/src/embed/app.spec.js +101 -0
  106. package/lib/src/embed/app.spec.js.map +1 -1
  107. package/lib/src/embed/conversation.d.ts +26 -0
  108. package/lib/src/embed/conversation.d.ts.map +1 -1
  109. package/lib/src/embed/conversation.js +11 -1
  110. package/lib/src/embed/conversation.js.map +1 -1
  111. package/lib/src/embed/conversation.spec.js +24 -1
  112. package/lib/src/embed/conversation.spec.js.map +1 -1
  113. package/lib/src/embed/events.spec.js +593 -0
  114. package/lib/src/embed/events.spec.js.map +1 -1
  115. package/lib/src/embed/host-events.spec.js +107 -1
  116. package/lib/src/embed/host-events.spec.js.map +1 -1
  117. package/lib/src/embed/hostEventClient/contracts.d.ts +36 -14
  118. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  119. package/lib/src/embed/hostEventClient/contracts.js +9 -0
  120. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  121. package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  122. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  123. package/lib/src/embed/hostEventClient/host-event-client.js +9 -1
  124. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  125. package/lib/src/embed/hostEventClient/host-event-client.spec.js +209 -0
  126. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  127. package/lib/src/embed/hostEventClient/utils.d.ts +2 -0
  128. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  129. package/lib/src/embed/hostEventClient/utils.js +28 -1
  130. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  131. package/lib/src/embed/hostEventClient/utils.spec.js +179 -1
  132. package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
  133. package/lib/src/embed/liveboard.d.ts +6 -0
  134. package/lib/src/embed/liveboard.d.ts.map +1 -1
  135. package/lib/src/embed/liveboard.js.map +1 -1
  136. package/lib/src/embed/spotter-viz-utils.d.ts +34 -0
  137. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  138. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  139. package/lib/src/embed/spotter-viz-utils.spec.js +17 -0
  140. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
  141. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  142. package/lib/src/embed/ts-embed.js +14 -7
  143. package/lib/src/embed/ts-embed.js.map +1 -1
  144. package/lib/src/embed/ts-embed.spec.js +146 -0
  145. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  146. package/lib/src/errors.d.ts +1 -0
  147. package/lib/src/errors.d.ts.map +1 -1
  148. package/lib/src/errors.js +1 -0
  149. package/lib/src/errors.js.map +1 -1
  150. package/lib/src/index.d.ts +2 -2
  151. package/lib/src/index.d.ts.map +1 -1
  152. package/lib/src/index.js +2 -2
  153. package/lib/src/index.js.map +1 -1
  154. package/lib/src/react/util.spec.js +251 -0
  155. package/lib/src/react/util.spec.js.map +1 -1
  156. package/lib/src/types.d.ts +119 -2
  157. package/lib/src/types.d.ts.map +1 -1
  158. package/lib/src/types.js +97 -0
  159. package/lib/src/types.js.map +1 -1
  160. package/lib/src/utils/processData.spec.js +93 -0
  161. package/lib/src/utils/processData.spec.js.map +1 -1
  162. package/lib/src/utils/processTrigger.spec.js +61 -0
  163. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  164. package/lib/src/visual-embed-sdk.d.ts +306 -17
  165. package/package.json +1 -1
  166. package/src/css-variables.ts +73 -0
  167. package/src/embed/app.spec.ts +140 -0
  168. package/src/embed/app.ts +38 -2
  169. package/src/embed/conversation.spec.ts +32 -1
  170. package/src/embed/conversation.ts +29 -0
  171. package/src/embed/events.spec.ts +705 -1
  172. package/src/embed/host-events.spec.ts +124 -0
  173. package/src/embed/hostEventClient/contracts.ts +41 -14
  174. package/src/embed/hostEventClient/host-event-client.spec.ts +326 -0
  175. package/src/embed/hostEventClient/host-event-client.ts +15 -0
  176. package/src/embed/hostEventClient/utils.spec.ts +204 -0
  177. package/src/embed/hostEventClient/utils.ts +37 -10
  178. package/src/embed/liveboard.ts +6 -0
  179. package/src/embed/spotter-viz-utils.spec.ts +17 -0
  180. package/src/embed/spotter-viz-utils.ts +34 -0
  181. package/src/embed/ts-embed.spec.ts +186 -0
  182. package/src/embed/ts-embed.ts +12 -4
  183. package/src/errors.ts +1 -0
  184. package/src/index.ts +2 -1
  185. package/src/react/util.spec.tsx +255 -0
  186. package/src/types.ts +119 -0
  187. package/src/utils/processData.spec.ts +97 -0
  188. package/src/utils/processTrigger.spec.ts +91 -0
@@ -41,6 +41,22 @@ describe('test communication between host app and ThoughtSpot', () => {
41
41
  });
42
42
  });
43
43
  });
44
+ test('should capture SpotterResponseComplete event from ThoughtSpot app', (done) => {
45
+ const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
46
+ appEmbed
47
+ .on(index_1.EmbedEvent.SpotterResponseComplete, (data) => {
48
+ expect(data.data).toEqual({ convId: 'c1', messageId: 'm1' });
49
+ done();
50
+ })
51
+ .render();
52
+ (0, test_utils_1.executeAfterWait)(() => {
53
+ const iframe = (0, test_utils_1.getIFrameEl)();
54
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
55
+ type: index_1.EmbedEvent.SpotterResponseComplete,
56
+ data: { convId: 'c1', messageId: 'm1' },
57
+ });
58
+ });
59
+ });
44
60
  // TODO: enable test once we are actually able to load stuff in the iframe
45
61
  xtest('should trigger iframe load event', async () => {
46
62
  const onLoadSpy = jest.fn();
@@ -266,6 +282,36 @@ describe('test communication between host app and ThoughtSpot', () => {
266
282
  expect(handler.mock.calls[0][0].data).toBe(PAYLOAD);
267
283
  }, test_utils_1.EVENT_WAIT_TIME);
268
284
  });
285
+ test('should fire QueryChanged handler when {type:queryChanged} postMessage arrives from iframe', async () => {
286
+ const handler = jest.fn();
287
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
288
+ searchEmbed.on(index_1.EmbedEvent.QueryChanged, handler).render();
289
+ await (0, test_utils_1.executeAfterWait)(() => {
290
+ const iframe = (0, test_utils_1.getIFrameEl)();
291
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
292
+ type: index_1.EmbedEvent.QueryChanged,
293
+ data: PAYLOAD,
294
+ });
295
+ });
296
+ await (0, test_utils_1.executeAfterWait)(() => {
297
+ expect(handler).toHaveBeenCalled();
298
+ expect(handler.mock.calls[0][0].data).toBe(PAYLOAD);
299
+ }, test_utils_1.EVENT_WAIT_TIME);
300
+ });
301
+ test('should not fire QueryChanged handler for postMessage from non-iframe source', async () => {
302
+ const handler = jest.fn();
303
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
304
+ searchEmbed.on(index_1.EmbedEvent.QueryChanged, handler).render();
305
+ await (0, test_utils_1.executeAfterWait)(() => {
306
+ (0, test_utils_1.postMessageToParent)(window, {
307
+ type: index_1.EmbedEvent.QueryChanged,
308
+ data: PAYLOAD,
309
+ });
310
+ });
311
+ await (0, test_utils_1.executeAfterWait)(() => {
312
+ expect(handler).not.toHaveBeenCalled();
313
+ }, test_utils_1.EVENT_WAIT_TIME);
314
+ });
269
315
  test('ALL event listener should fire for all events with the event type set correctly', async () => {
270
316
  const embed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
271
317
  const spy = jest.fn();
@@ -316,4 +362,551 @@ describe('Action enum values', () => {
316
362
  expect(index_1.Action.RemoveFromFavorites).toBe('removeFromFavorites');
317
363
  });
318
364
  });
365
+ describe('EmbedEvent basic routing', () => {
366
+ beforeEach(() => {
367
+ document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
368
+ });
369
+ const UNCOVERED_EVENTS = [
370
+ ['Drilldown', index_1.EmbedEvent.Drilldown],
371
+ ['DataSourceSelected', index_1.EmbedEvent.DataSourceSelected],
372
+ ['AddRemoveColumns', index_1.EmbedEvent.AddRemoveColumns],
373
+ ['VizPointDoubleClick', index_1.EmbedEvent.VizPointDoubleClick],
374
+ ['VizPointClick', index_1.EmbedEvent.VizPointClick],
375
+ ['Alert', index_1.EmbedEvent.Alert],
376
+ ['GetDataClick', index_1.EmbedEvent.GetDataClick],
377
+ ['DialogClose', index_1.EmbedEvent.DialogClose],
378
+ ['Download', index_1.EmbedEvent.Download],
379
+ ['DownloadAsPng', index_1.EmbedEvent.DownloadAsPng],
380
+ ['DownloadAsPdf', index_1.EmbedEvent.DownloadAsPdf],
381
+ ['DownloadAsCsv', index_1.EmbedEvent.DownloadAsCsv],
382
+ ['DownloadAsXlsx', index_1.EmbedEvent.DownloadAsXlsx],
383
+ ['DownloadLiveboardAsContinuousPDF', index_1.EmbedEvent.DownloadLiveboardAsContinuousPDF],
384
+ ['AnswerDelete', index_1.EmbedEvent.AnswerDelete],
385
+ ['AIHighlights', index_1.EmbedEvent.AIHighlights],
386
+ ['Pin', index_1.EmbedEvent.Pin],
387
+ ['SpotIQAnalyze', index_1.EmbedEvent.SpotIQAnalyze],
388
+ ['Share', index_1.EmbedEvent.Share],
389
+ ['DrillInclude', index_1.EmbedEvent.DrillInclude],
390
+ ['DrillExclude', index_1.EmbedEvent.DrillExclude],
391
+ ['CopyToClipboard', index_1.EmbedEvent.CopyToClipboard],
392
+ ['UpdateTML', index_1.EmbedEvent.UpdateTML],
393
+ ['EditTML', index_1.EmbedEvent.EditTML],
394
+ ['ExportTML', index_1.EmbedEvent.ExportTML],
395
+ ['SaveAsView', index_1.EmbedEvent.SaveAsView],
396
+ ['CopyAEdit', index_1.EmbedEvent.CopyAEdit],
397
+ ['ShowUnderlyingData', index_1.EmbedEvent.ShowUnderlyingData],
398
+ ['AnswerChartSwitcher', index_1.EmbedEvent.AnswerChartSwitcher],
399
+ ['LiveboardInfo', index_1.EmbedEvent.LiveboardInfo],
400
+ ['AddToFavorites', index_1.EmbedEvent.AddToFavorites],
401
+ ['Schedule', index_1.EmbedEvent.Schedule],
402
+ ['Edit', index_1.EmbedEvent.Edit],
403
+ ['MakeACopy', index_1.EmbedEvent.MakeACopy],
404
+ ['Present', index_1.EmbedEvent.Present],
405
+ ['Delete', index_1.EmbedEvent.Delete],
406
+ ['SchedulesList', index_1.EmbedEvent.SchedulesList],
407
+ ['Cancel', index_1.EmbedEvent.Cancel],
408
+ ['Explore', index_1.EmbedEvent.Explore],
409
+ ['CopyLink', index_1.EmbedEvent.CopyLink],
410
+ ['CrossFilterChanged', index_1.EmbedEvent.CrossFilterChanged],
411
+ ['VizPointRightClick', index_1.EmbedEvent.VizPointRightClick],
412
+ ['InsertIntoSlide', index_1.EmbedEvent.InsertIntoSlide],
413
+ ['FilterChanged', index_1.EmbedEvent.FilterChanged],
414
+ ['UpdateConnection', index_1.EmbedEvent.UpdateConnection],
415
+ ['CreateConnection', index_1.EmbedEvent.CreateConnection],
416
+ ['ResetLiveboard', index_1.EmbedEvent.ResetLiveboard],
417
+ ['ChangePersonalizedView', index_1.EmbedEvent.ChangePersonalizedView],
418
+ ['CreateWorksheet', index_1.EmbedEvent.CreateWorksheet],
419
+ ['AskSageInit', index_1.EmbedEvent.AskSageInit],
420
+ ['Rename', index_1.EmbedEvent.Rename],
421
+ ['ParameterChanged', index_1.EmbedEvent.ParameterChanged],
422
+ ['TableVizRendered', index_1.EmbedEvent.TableVizRendered],
423
+ ['CreateLiveboard', index_1.EmbedEvent.CreateLiveboard],
424
+ ['CreateModel', index_1.EmbedEvent.CreateModel],
425
+ ['SpotterData', index_1.EmbedEvent.SpotterData],
426
+ ['PreviewSpotterData', index_1.EmbedEvent.PreviewSpotterData],
427
+ ['AddToCoaching', index_1.EmbedEvent.AddToCoaching],
428
+ ['DataModelInstructions', index_1.EmbedEvent.DataModelInstructions],
429
+ ['SpotterQueryTriggered', index_1.EmbedEvent.SpotterQueryTriggered],
430
+ ['LastPromptEdited', index_1.EmbedEvent.LastPromptEdited],
431
+ ['LastPromptDeleted', index_1.EmbedEvent.LastPromptDeleted],
432
+ ['ResetSpotterConversation', index_1.EmbedEvent.ResetSpotterConversation],
433
+ ['SpotterInit', index_1.EmbedEvent.SpotterInit],
434
+ ['SpotterLoadComplete', index_1.EmbedEvent.SpotterLoadComplete],
435
+ ['OrgSwitched', index_1.EmbedEvent.OrgSwitched],
436
+ ['SpotterConversationRenamed', index_1.EmbedEvent.SpotterConversationRenamed],
437
+ ['SpotterConversationDeleted', index_1.EmbedEvent.SpotterConversationDeleted],
438
+ ['SpotterConversationSelected', index_1.EmbedEvent.SpotterConversationSelected],
439
+ ['EmbedPageContextChanged', index_1.EmbedEvent.EmbedPageContextChanged],
440
+ ['Subscribed', index_1.EmbedEvent.Subscribed],
441
+ ['SendTestScheduleEmail', index_1.EmbedEvent.SendTestScheduleEmail],
442
+ ['SpotterVizInit', index_1.EmbedEvent.SpotterVizInit],
443
+ ['SpotterVizQueryTriggered', index_1.EmbedEvent.SpotterVizQueryTriggered],
444
+ ['SpotterVizResponseComplete', index_1.EmbedEvent.SpotterVizResponseComplete],
445
+ ['SpotterVizCheckpointCreated', index_1.EmbedEvent.SpotterVizCheckpointCreated],
446
+ ['SpotterVizCheckpointRestored', index_1.EmbedEvent.SpotterVizCheckpointRestored],
447
+ ['SpotterVizError', index_1.EmbedEvent.SpotterVizError],
448
+ ['SpotterVizClosed', index_1.EmbedEvent.SpotterVizClosed],
449
+ ['RefreshLiveboardBrowserCache', index_1.EmbedEvent.RefreshLiveboardBrowserCache],
450
+ ['V1Data', index_1.EmbedEvent.V1Data],
451
+ ];
452
+ test.each(UNCOVERED_EVENTS)('%s handler fires on iframe postMessage', async (eventName, embedEvent) => {
453
+ const handler = jest.fn();
454
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
455
+ searchEmbed.on(embedEvent, handler).render();
456
+ await (0, test_utils_1.executeAfterWait)(() => {
457
+ const iframe = (0, test_utils_1.getIFrameEl)();
458
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
459
+ type: embedEvent,
460
+ data: PAYLOAD,
461
+ });
462
+ });
463
+ await (0, test_utils_1.executeAfterWait)(() => {
464
+ expect(handler).toHaveBeenCalled();
465
+ expect(handler.mock.calls[0][0].data).toBe(PAYLOAD);
466
+ }, test_utils_1.EVENT_WAIT_TIME);
467
+ });
468
+ });
469
+ describe('EmbedEvent start/end status', () => {
470
+ beforeEach(() => {
471
+ document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
472
+ });
473
+ const START_END_EVENTS = [
474
+ ['DownloadAsPng', index_1.EmbedEvent.DownloadAsPng],
475
+ ['DownloadAsPdf', index_1.EmbedEvent.DownloadAsPdf],
476
+ ['DownloadAsCsv', index_1.EmbedEvent.DownloadAsCsv],
477
+ ['DownloadAsXlsx', index_1.EmbedEvent.DownloadAsXlsx],
478
+ ['AnswerDelete', index_1.EmbedEvent.AnswerDelete],
479
+ ['Pin', index_1.EmbedEvent.Pin],
480
+ ['SpotIQAnalyze', index_1.EmbedEvent.SpotIQAnalyze],
481
+ ['Share', index_1.EmbedEvent.Share],
482
+ ['ExportTML', index_1.EmbedEvent.ExportTML],
483
+ ['CopyAEdit', index_1.EmbedEvent.CopyAEdit],
484
+ ];
485
+ test.each(START_END_EVENTS)('%s start handler fires on START, not END', async (eventName, embedEvent) => {
486
+ const startHandler = jest.fn();
487
+ const endHandler = jest.fn();
488
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
489
+ searchEmbed
490
+ .on(embedEvent, startHandler, { start: true })
491
+ .on(embedEvent, endHandler)
492
+ .render();
493
+ await (0, test_utils_1.executeAfterWait)(() => {
494
+ const iframe = (0, test_utils_1.getIFrameEl)();
495
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
496
+ type: embedEvent,
497
+ data: PAYLOAD,
498
+ status: 'start',
499
+ });
500
+ });
501
+ await (0, test_utils_1.executeAfterWait)(() => {
502
+ expect(startHandler).toHaveBeenCalled();
503
+ expect(endHandler).not.toHaveBeenCalled();
504
+ }, test_utils_1.EVENT_WAIT_TIME);
505
+ });
506
+ test.each(START_END_EVENTS)('%s end handler fires on END, not START', async (eventName, embedEvent) => {
507
+ const startHandler = jest.fn();
508
+ const endHandler = jest.fn();
509
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
510
+ searchEmbed
511
+ .on(embedEvent, startHandler, { start: true })
512
+ .on(embedEvent, endHandler)
513
+ .render();
514
+ await (0, test_utils_1.executeAfterWait)(() => {
515
+ const iframe = (0, test_utils_1.getIFrameEl)();
516
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
517
+ type: embedEvent,
518
+ data: PAYLOAD,
519
+ status: 'end',
520
+ });
521
+ });
522
+ await (0, test_utils_1.executeAfterWait)(() => {
523
+ expect(endHandler).toHaveBeenCalled();
524
+ expect(startHandler).not.toHaveBeenCalled();
525
+ }, test_utils_1.EVENT_WAIT_TIME);
526
+ });
527
+ const END_ONLY_EVENTS = [
528
+ ['Download', index_1.EmbedEvent.Download],
529
+ ['DownloadLiveboardAsContinuousPDF', index_1.EmbedEvent.DownloadLiveboardAsContinuousPDF],
530
+ ];
531
+ test.each(END_ONLY_EVENTS)('%s ignores start handler (end-only event)', async (eventName, embedEvent) => {
532
+ const startHandler = jest.fn();
533
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
534
+ searchEmbed.on(embedEvent, startHandler, { start: true }).render();
535
+ await (0, test_utils_1.executeAfterWait)(() => {
536
+ const iframe = (0, test_utils_1.getIFrameEl)();
537
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
538
+ type: embedEvent,
539
+ data: PAYLOAD,
540
+ });
541
+ });
542
+ await (0, test_utils_1.executeAfterWait)(() => {
543
+ expect(startHandler).not.toHaveBeenCalled();
544
+ }, test_utils_1.EVENT_WAIT_TIME);
545
+ });
546
+ });
547
+ describe('EmbedEvent payload and routing', () => {
548
+ beforeEach(() => {
549
+ document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
550
+ });
551
+ test('Drilldown payload includes additionalFilters, drillDownColumns, nonFilteredColumns', async () => {
552
+ const handler = jest.fn();
553
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
554
+ searchEmbed.on(index_1.EmbedEvent.Drilldown, handler).render();
555
+ const drilldownData = {
556
+ additionalFilters: [{ column: 'region', value: 'west' }],
557
+ drillDownColumns: ['revenue'],
558
+ nonFilteredColumns: ['date'],
559
+ };
560
+ await (0, test_utils_1.executeAfterWait)(() => {
561
+ const iframe = (0, test_utils_1.getIFrameEl)();
562
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
563
+ type: index_1.EmbedEvent.Drilldown,
564
+ data: drilldownData,
565
+ });
566
+ });
567
+ await (0, test_utils_1.executeAfterWait)(() => {
568
+ expect(handler).toHaveBeenCalled();
569
+ const received = handler.mock.calls[0][0].data;
570
+ expect(received.additionalFilters).toEqual(drilldownData.additionalFilters);
571
+ expect(received.drillDownColumns).toEqual(drilldownData.drillDownColumns);
572
+ expect(received.nonFilteredColumns).toEqual(drilldownData.nonFilteredColumns);
573
+ }, test_utils_1.EVENT_WAIT_TIME);
574
+ });
575
+ test('DataSourceSelected payload contains dataSourceIds array', async () => {
576
+ const handler = jest.fn();
577
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
578
+ searchEmbed.on(index_1.EmbedEvent.DataSourceSelected, handler).render();
579
+ const dataSourceIds = ['ds-aaa', 'ds-bbb'];
580
+ await (0, test_utils_1.executeAfterWait)(() => {
581
+ const iframe = (0, test_utils_1.getIFrameEl)();
582
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
583
+ type: index_1.EmbedEvent.DataSourceSelected,
584
+ data: { dataSourceIds },
585
+ });
586
+ });
587
+ await (0, test_utils_1.executeAfterWait)(() => {
588
+ expect(handler).toHaveBeenCalled();
589
+ expect(handler.mock.calls[0][0].data.dataSourceIds).toEqual(dataSourceIds);
590
+ }, test_utils_1.EVENT_WAIT_TIME);
591
+ });
592
+ test('V1Data fires via __type field when type is absent', async () => {
593
+ const handler = jest.fn();
594
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
595
+ searchEmbed.on(index_1.EmbedEvent.V1Data, handler).render();
596
+ await (0, test_utils_1.executeAfterWait)(() => {
597
+ const iframe = (0, test_utils_1.getIFrameEl)();
598
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
599
+ __type: index_1.EmbedEvent.V1Data,
600
+ data: PAYLOAD,
601
+ });
602
+ });
603
+ await (0, test_utils_1.executeAfterWait)(() => {
604
+ expect(handler).toHaveBeenCalled();
605
+ }, test_utils_1.EVENT_WAIT_TIME);
606
+ });
607
+ test('subscribedEvent builds composed key and routes to registered handler', async () => {
608
+ const handler = jest.fn();
609
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
610
+ const composedEvent = searchEmbed.subscribedEvent(index_1.HostEvent.Save);
611
+ expect(composedEvent).toBe(`${index_1.HostEvent.Save} ${index_1.EmbedEvent.Subscribed}`);
612
+ searchEmbed.on(composedEvent, handler).render();
613
+ await (0, test_utils_1.executeAfterWait)(() => {
614
+ const iframe = (0, test_utils_1.getIFrameEl)();
615
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
616
+ type: composedEvent,
617
+ data: PAYLOAD,
618
+ });
619
+ });
620
+ await (0, test_utils_1.executeAfterWait)(() => {
621
+ expect(handler).toHaveBeenCalled();
622
+ }, test_utils_1.EVENT_WAIT_TIME);
623
+ });
624
+ test('non-iframe postMessage does not trigger registered handler', async () => {
625
+ const handler = jest.fn();
626
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
627
+ searchEmbed.on(index_1.EmbedEvent.Drilldown, handler).render();
628
+ await (0, test_utils_1.executeAfterWait)(() => {
629
+ (0, test_utils_1.postMessageToParent)(window, {
630
+ type: index_1.EmbedEvent.Drilldown,
631
+ data: PAYLOAD,
632
+ });
633
+ });
634
+ await (0, test_utils_1.executeAfterWait)(() => {
635
+ expect(handler).not.toHaveBeenCalled();
636
+ }, test_utils_1.EVENT_WAIT_TIME);
637
+ });
638
+ test('DataSourceSelected falls back to payload field when data is absent', async () => {
639
+ const handler = jest.fn();
640
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
641
+ searchEmbed.on(index_1.EmbedEvent.DataSourceSelected, handler).render();
642
+ const dataSourceIds = ['ds-fallback'];
643
+ await (0, test_utils_1.executeAfterWait)(() => {
644
+ const iframe = (0, test_utils_1.getIFrameEl)();
645
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
646
+ type: index_1.EmbedEvent.DataSourceSelected,
647
+ payload: { dataSourceIds },
648
+ // no data field — formatEventData should copy payload → data
649
+ });
650
+ });
651
+ await (0, test_utils_1.executeAfterWait)(() => {
652
+ expect(handler).toHaveBeenCalled();
653
+ expect(handler.mock.calls[0][0].data.dataSourceIds).toEqual(dataSourceIds);
654
+ }, test_utils_1.EVENT_WAIT_TIME);
655
+ });
656
+ test('Alert handler fires independently of window.alert', async () => {
657
+ const alertSpy = jest.spyOn(window, 'alert').mockImplementation(() => undefined);
658
+ const handler = jest.fn();
659
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
660
+ searchEmbed.on(index_1.EmbedEvent.Alert, handler).render();
661
+ await (0, test_utils_1.executeAfterWait)(() => {
662
+ const iframe = (0, test_utils_1.getIFrameEl)();
663
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
664
+ type: index_1.EmbedEvent.Alert,
665
+ data: { message: 'test alert' },
666
+ });
667
+ });
668
+ await (0, test_utils_1.executeAfterWait)(() => {
669
+ expect(handler).toHaveBeenCalled();
670
+ expect(alertSpy).not.toHaveBeenCalled();
671
+ }, test_utils_1.EVENT_WAIT_TIME);
672
+ alertSpy.mockRestore();
673
+ });
674
+ test('Share reaches EmbedEvent.ALL wildcard handler', async () => {
675
+ const allHandler = jest.fn();
676
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
677
+ searchEmbed.on(index_1.EmbedEvent.ALL, allHandler).render();
678
+ await (0, test_utils_1.executeAfterWait)(() => {
679
+ const iframe = (0, test_utils_1.getIFrameEl)();
680
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
681
+ type: index_1.EmbedEvent.Share,
682
+ data: PAYLOAD,
683
+ });
684
+ });
685
+ await (0, test_utils_1.executeAfterWait)(() => {
686
+ const types = allHandler.mock.calls.map((c) => c[0].type);
687
+ expect(types).toContain(index_1.EmbedEvent.Share);
688
+ }, test_utils_1.EVENT_WAIT_TIME);
689
+ });
690
+ test('DialogClose reaches EmbedEvent.ALL wildcard handler', async () => {
691
+ const allHandler = jest.fn();
692
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
693
+ searchEmbed.on(index_1.EmbedEvent.ALL, allHandler).render();
694
+ await (0, test_utils_1.executeAfterWait)(() => {
695
+ const iframe = (0, test_utils_1.getIFrameEl)();
696
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
697
+ type: index_1.EmbedEvent.DialogClose,
698
+ data: PAYLOAD,
699
+ });
700
+ });
701
+ await (0, test_utils_1.executeAfterWait)(() => {
702
+ const types = allHandler.mock.calls.map((c) => c[0].type);
703
+ expect(types).toContain(index_1.EmbedEvent.DialogClose);
704
+ }, test_utils_1.EVENT_WAIT_TIME);
705
+ });
706
+ test('SpotterConversationRenamed payload contains convId, oldTitle, newTitle', async () => {
707
+ const handler = jest.fn();
708
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
709
+ searchEmbed.on(index_1.EmbedEvent.SpotterConversationRenamed, handler).render();
710
+ const convData = { convId: 'conv-1', oldTitle: 'Old', newTitle: 'New' };
711
+ await (0, test_utils_1.executeAfterWait)(() => {
712
+ const iframe = (0, test_utils_1.getIFrameEl)();
713
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
714
+ type: index_1.EmbedEvent.SpotterConversationRenamed,
715
+ data: convData,
716
+ });
717
+ });
718
+ await (0, test_utils_1.executeAfterWait)(() => {
719
+ expect(handler).toHaveBeenCalled();
720
+ expect(handler.mock.calls[0][0].data).toMatchObject(convData);
721
+ }, test_utils_1.EVENT_WAIT_TIME);
722
+ });
723
+ test('SpotterConversationDeleted payload contains convId and title', async () => {
724
+ const handler = jest.fn();
725
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
726
+ searchEmbed.on(index_1.EmbedEvent.SpotterConversationDeleted, handler).render();
727
+ const convData = { convId: 'conv-2', title: 'My Conversation' };
728
+ await (0, test_utils_1.executeAfterWait)(() => {
729
+ const iframe = (0, test_utils_1.getIFrameEl)();
730
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
731
+ type: index_1.EmbedEvent.SpotterConversationDeleted,
732
+ data: convData,
733
+ });
734
+ });
735
+ await (0, test_utils_1.executeAfterWait)(() => {
736
+ expect(handler).toHaveBeenCalled();
737
+ expect(handler.mock.calls[0][0].data).toMatchObject(convData);
738
+ }, test_utils_1.EVENT_WAIT_TIME);
739
+ });
740
+ test('SpotterConversationSelected payload contains convId, title, worksheetId', async () => {
741
+ const handler = jest.fn();
742
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
743
+ searchEmbed.on(index_1.EmbedEvent.SpotterConversationSelected, handler).render();
744
+ const convData = { convId: 'conv-3', title: 'My Conv', worksheetId: 'ws-1' };
745
+ await (0, test_utils_1.executeAfterWait)(() => {
746
+ const iframe = (0, test_utils_1.getIFrameEl)();
747
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
748
+ type: index_1.EmbedEvent.SpotterConversationSelected,
749
+ data: convData,
750
+ });
751
+ });
752
+ await (0, test_utils_1.executeAfterWait)(() => {
753
+ expect(handler).toHaveBeenCalled();
754
+ expect(handler.mock.calls[0][0].data).toMatchObject(convData);
755
+ }, test_utils_1.EVENT_WAIT_TIME);
756
+ });
757
+ test('TableVizRendered payload forwards columnDataLite array intact', async () => {
758
+ const handler = jest.fn();
759
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
760
+ searchEmbed.on(index_1.EmbedEvent.TableVizRendered, handler).render();
761
+ const columnDataLite = [['col1', 'col2'], ['val1', 'val2']];
762
+ await (0, test_utils_1.executeAfterWait)(() => {
763
+ const iframe = (0, test_utils_1.getIFrameEl)();
764
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
765
+ type: index_1.EmbedEvent.TableVizRendered,
766
+ data: { data: { columnDataLite } },
767
+ });
768
+ });
769
+ await (0, test_utils_1.executeAfterWait)(() => {
770
+ expect(handler).toHaveBeenCalled();
771
+ expect(handler.mock.calls[0][0].data.data.columnDataLite).toEqual(columnDataLite);
772
+ }, test_utils_1.EVENT_WAIT_TIME);
773
+ });
774
+ test('SendTestScheduleEmail payload preserves liveboardId and sendToSelf boolean', async () => {
775
+ const handler = jest.fn();
776
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
777
+ searchEmbed.on(index_1.EmbedEvent.SendTestScheduleEmail, handler).render();
778
+ const emailData = { liveboardId: 'lb-123', sendToSelf: true };
779
+ await (0, test_utils_1.executeAfterWait)(() => {
780
+ const iframe = (0, test_utils_1.getIFrameEl)();
781
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
782
+ type: index_1.EmbedEvent.SendTestScheduleEmail,
783
+ data: emailData,
784
+ });
785
+ });
786
+ await (0, test_utils_1.executeAfterWait)(() => {
787
+ expect(handler).toHaveBeenCalled();
788
+ const received = handler.mock.calls[0][0].data;
789
+ expect(received.liveboardId).toBe('lb-123');
790
+ expect(received.sendToSelf).toBe(true);
791
+ expect(typeof received.sendToSelf).toBe('boolean');
792
+ }, test_utils_1.EVENT_WAIT_TIME);
793
+ });
794
+ test('ChangePersonalizedView payload viewId can be null (reset-to-default)', async () => {
795
+ const handler = jest.fn();
796
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
797
+ searchEmbed.on(index_1.EmbedEvent.ChangePersonalizedView, handler).render();
798
+ await (0, test_utils_1.executeAfterWait)(() => {
799
+ const iframe = (0, test_utils_1.getIFrameEl)();
800
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
801
+ type: index_1.EmbedEvent.ChangePersonalizedView,
802
+ data: { viewId: null, viewName: 'Original View', liveboardId: 'lb-1', isPublic: false },
803
+ });
804
+ });
805
+ await (0, test_utils_1.executeAfterWait)(() => {
806
+ expect(handler).toHaveBeenCalled();
807
+ expect(handler.mock.calls[0][0].data.viewId).toBeNull();
808
+ expect(handler.mock.calls[0][0].data.viewName).toBe('Original View');
809
+ }, test_utils_1.EVENT_WAIT_TIME);
810
+ });
811
+ test('VizPointDoubleClick payload exposes vizId and clickedPoint.selectedPoints', async () => {
812
+ const handler = jest.fn();
813
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
814
+ searchEmbed.on(index_1.EmbedEvent.VizPointDoubleClick, handler).render();
815
+ const pointData = {
816
+ vizId: 'viz-1',
817
+ clickedPoint: { selectedPoints: [{ x: 10, y: 20 }] },
818
+ };
819
+ await (0, test_utils_1.executeAfterWait)(() => {
820
+ const iframe = (0, test_utils_1.getIFrameEl)();
821
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
822
+ type: index_1.EmbedEvent.VizPointDoubleClick,
823
+ data: pointData,
824
+ });
825
+ });
826
+ await (0, test_utils_1.executeAfterWait)(() => {
827
+ expect(handler).toHaveBeenCalled();
828
+ const { data } = handler.mock.calls[0][0];
829
+ expect(data.vizId).toBe('viz-1');
830
+ expect(data.clickedPoint.selectedPoints).toEqual(pointData.clickedPoint.selectedPoints);
831
+ }, test_utils_1.EVENT_WAIT_TIME);
832
+ });
833
+ test('VizPointClick payload exposes vizId, selectedAttributes and selectedMeasures', async () => {
834
+ const handler = jest.fn();
835
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
836
+ searchEmbed.on(index_1.EmbedEvent.VizPointClick, handler).render();
837
+ const pointData = {
838
+ vizId: 'viz-2',
839
+ clickedPoint: {
840
+ selectedAttributes: [{ value: 'West', column: { name: 'region' } }],
841
+ selectedMeasures: [{ value: 42, column: { name: 'revenue' } }],
842
+ },
843
+ };
844
+ await (0, test_utils_1.executeAfterWait)(() => {
845
+ const iframe = (0, test_utils_1.getIFrameEl)();
846
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
847
+ type: index_1.EmbedEvent.VizPointClick,
848
+ data: pointData,
849
+ });
850
+ });
851
+ await (0, test_utils_1.executeAfterWait)(() => {
852
+ expect(handler).toHaveBeenCalled();
853
+ const { data } = handler.mock.calls[0][0];
854
+ expect(data.vizId).toBe('viz-2');
855
+ expect(data.clickedPoint.selectedAttributes[0].value).toBe('West');
856
+ expect(data.clickedPoint.selectedAttributes[0].column.name).toBe('region');
857
+ expect(data.clickedPoint.selectedMeasures[0].value).toBe(42);
858
+ expect(data.clickedPoint.selectedMeasures[0].column.name).toBe('revenue');
859
+ }, test_utils_1.EVENT_WAIT_TIME);
860
+ });
861
+ test('SpotterVizError reaches EmbedEvent.ALL handler', async () => {
862
+ const allHandler = jest.fn();
863
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
864
+ searchEmbed.on(index_1.EmbedEvent.ALL, allHandler).render();
865
+ await (0, test_utils_1.executeAfterWait)(() => {
866
+ const iframe = (0, test_utils_1.getIFrameEl)();
867
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
868
+ type: index_1.EmbedEvent.SpotterVizError,
869
+ data: PAYLOAD,
870
+ });
871
+ });
872
+ await (0, test_utils_1.executeAfterWait)(() => {
873
+ const types = allHandler.mock.calls.map((c) => c[0].type);
874
+ expect(types).toContain(index_1.EmbedEvent.SpotterVizError);
875
+ }, test_utils_1.EVENT_WAIT_TIME);
876
+ });
877
+ test('SpotterVizClosed reaches EmbedEvent.ALL handler', async () => {
878
+ const allHandler = jest.fn();
879
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
880
+ searchEmbed.on(index_1.EmbedEvent.ALL, allHandler).render();
881
+ await (0, test_utils_1.executeAfterWait)(() => {
882
+ const iframe = (0, test_utils_1.getIFrameEl)();
883
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
884
+ type: index_1.EmbedEvent.SpotterVizClosed,
885
+ data: PAYLOAD,
886
+ });
887
+ });
888
+ await (0, test_utils_1.executeAfterWait)(() => {
889
+ const types = allHandler.mock.calls.map((c) => c[0].type);
890
+ expect(types).toContain(index_1.EmbedEvent.SpotterVizClosed);
891
+ }, test_utils_1.EVENT_WAIT_TIME);
892
+ });
893
+ test('SpotterVizCheckpointRestored payload newGenNumber is a number', async () => {
894
+ const handler = jest.fn();
895
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
896
+ searchEmbed.on(index_1.EmbedEvent.SpotterVizCheckpointRestored, handler).render();
897
+ await (0, test_utils_1.executeAfterWait)(() => {
898
+ const iframe = (0, test_utils_1.getIFrameEl)();
899
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, {
900
+ type: index_1.EmbedEvent.SpotterVizCheckpointRestored,
901
+ data: { checkpointId: 'cp-1', newGenNumber: 42 },
902
+ });
903
+ });
904
+ await (0, test_utils_1.executeAfterWait)(() => {
905
+ expect(handler).toHaveBeenCalled();
906
+ const { newGenNumber } = handler.mock.calls[0][0].data;
907
+ expect(newGenNumber).toBe(42);
908
+ expect(typeof newGenNumber).toBe('number');
909
+ }, test_utils_1.EVENT_WAIT_TIME);
910
+ });
911
+ });
319
912
  //# sourceMappingURL=events.spec.js.map