@thoughtspot/visual-embed-sdk 1.44.1-test → 1.44.2

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 (169) hide show
  1. package/cjs/package.json +6 -5
  2. package/cjs/src/auth.spec.js +43 -42
  3. package/cjs/src/auth.spec.js.map +1 -1
  4. package/cjs/src/authToken.spec.js +3 -3
  5. package/cjs/src/authToken.spec.js.map +1 -1
  6. package/cjs/src/embed/app.d.ts.map +1 -1
  7. package/cjs/src/embed/app.js +3 -1
  8. package/cjs/src/embed/app.js.map +1 -1
  9. package/cjs/src/embed/app.spec.js +12 -5
  10. package/cjs/src/embed/app.spec.js.map +1 -1
  11. package/cjs/src/embed/base.spec.js +11 -15
  12. package/cjs/src/embed/base.spec.js.map +1 -1
  13. package/cjs/src/embed/bodyless-conversation.spec.js +2 -2
  14. package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
  15. package/cjs/src/embed/conversation.spec.js +2 -2
  16. package/cjs/src/embed/conversation.spec.js.map +1 -1
  17. package/cjs/src/embed/embed.spec.js +101 -2
  18. package/cjs/src/embed/embed.spec.js.map +1 -1
  19. package/cjs/src/embed/events.spec.js +2 -2
  20. package/cjs/src/embed/events.spec.js.map +1 -1
  21. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +1 -1
  22. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  23. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  24. package/cjs/src/embed/liveboard.js +3 -1
  25. package/cjs/src/embed/liveboard.js.map +1 -1
  26. package/cjs/src/embed/liveboard.spec.js +28 -26
  27. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  28. package/cjs/src/embed/pinboard.spec.js +1 -1
  29. package/cjs/src/embed/pinboard.spec.js.map +1 -1
  30. package/cjs/src/embed/sage.spec.js +2 -2
  31. package/cjs/src/embed/sage.spec.js.map +1 -1
  32. package/cjs/src/embed/search.spec.js +118 -2
  33. package/cjs/src/embed/search.spec.js.map +1 -1
  34. package/cjs/src/embed/ts-embed-trigger.spec.js +2 -3
  35. package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -1
  36. package/cjs/src/embed/ts-embed.spec.js +242 -66
  37. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  38. package/cjs/src/mixpanel-service.spec.js +1 -1
  39. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  40. package/cjs/src/react/index.spec.js +3 -4
  41. package/cjs/src/react/index.spec.js.map +1 -1
  42. package/cjs/src/test/test-utils.js +1 -1
  43. package/cjs/src/test/test-utils.js.map +1 -1
  44. package/cjs/src/utils/authService/authService.spec.js +8 -8
  45. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  46. package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  47. package/cjs/src/utils/graphql/answerService/answerService.spec.js +1 -1
  48. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  49. package/cjs/src/utils/graphql/graphql-request.spec.js +1 -1
  50. package/cjs/src/utils/graphql/graphql-request.spec.js.map +1 -1
  51. package/cjs/src/utils/graphql/sourceService.spec.js +1 -1
  52. package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -1
  53. package/cjs/src/utils/logger.spec.d.ts +5 -20
  54. package/cjs/src/utils/logger.spec.d.ts.map +1 -1
  55. package/cjs/src/utils/processData.spec.js +17 -17
  56. package/cjs/src/utils/processData.spec.js.map +1 -1
  57. package/cjs/src/utils/processTrigger.spec.js +8 -8
  58. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  59. package/cjs/src/utils.d.ts +6 -0
  60. package/cjs/src/utils.d.ts.map +1 -1
  61. package/cjs/src/utils.js +32 -1
  62. package/cjs/src/utils.js.map +1 -1
  63. package/cjs/src/utils.spec.js +19 -10
  64. package/cjs/src/utils.spec.js.map +1 -1
  65. package/dist/{index-BXCUJ09L.js → index-CSFjfTVk.js} +1 -1
  66. package/dist/src/embed/app.d.ts.map +1 -1
  67. package/dist/src/embed/liveboard.d.ts.map +1 -1
  68. package/dist/src/utils/logger.spec.d.ts +5 -20
  69. package/dist/src/utils/logger.spec.d.ts.map +1 -1
  70. package/dist/src/utils.d.ts +6 -0
  71. package/dist/src/utils.d.ts.map +1 -1
  72. package/dist/tsembed-react.es.js +39 -5
  73. package/dist/tsembed-react.js +38 -4
  74. package/dist/tsembed.es.js +39 -5
  75. package/dist/tsembed.js +38 -4
  76. package/lib/package.json +6 -5
  77. package/lib/src/auth.spec.js +43 -42
  78. package/lib/src/auth.spec.js.map +1 -1
  79. package/lib/src/authToken.spec.js +3 -3
  80. package/lib/src/authToken.spec.js.map +1 -1
  81. package/lib/src/embed/app.d.ts.map +1 -1
  82. package/lib/src/embed/app.js +4 -2
  83. package/lib/src/embed/app.js.map +1 -1
  84. package/lib/src/embed/app.spec.js +12 -5
  85. package/lib/src/embed/app.spec.js.map +1 -1
  86. package/lib/src/embed/base.spec.js +11 -15
  87. package/lib/src/embed/base.spec.js.map +1 -1
  88. package/lib/src/embed/bodyless-conversation.spec.js +2 -2
  89. package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
  90. package/lib/src/embed/conversation.spec.js +2 -2
  91. package/lib/src/embed/conversation.spec.js.map +1 -1
  92. package/lib/src/embed/embed.spec.js +103 -4
  93. package/lib/src/embed/embed.spec.js.map +1 -1
  94. package/lib/src/embed/events.spec.js +2 -2
  95. package/lib/src/embed/events.spec.js.map +1 -1
  96. package/lib/src/embed/hostEventClient/host-event-client.spec.js +2 -2
  97. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  98. package/lib/src/embed/liveboard.d.ts.map +1 -1
  99. package/lib/src/embed/liveboard.js +4 -2
  100. package/lib/src/embed/liveboard.js.map +1 -1
  101. package/lib/src/embed/liveboard.spec.js +28 -26
  102. package/lib/src/embed/liveboard.spec.js.map +1 -1
  103. package/lib/src/embed/pinboard.spec.js +1 -1
  104. package/lib/src/embed/pinboard.spec.js.map +1 -1
  105. package/lib/src/embed/sage.spec.js +2 -2
  106. package/lib/src/embed/sage.spec.js.map +1 -1
  107. package/lib/src/embed/search.spec.js +118 -2
  108. package/lib/src/embed/search.spec.js.map +1 -1
  109. package/lib/src/embed/ts-embed-trigger.spec.js +2 -3
  110. package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -1
  111. package/lib/src/embed/ts-embed.spec.js +242 -66
  112. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  113. package/lib/src/mixpanel-service.spec.js +1 -1
  114. package/lib/src/mixpanel-service.spec.js.map +1 -1
  115. package/lib/src/react/index.spec.js +3 -4
  116. package/lib/src/react/index.spec.js.map +1 -1
  117. package/lib/src/test/test-utils.js +1 -1
  118. package/lib/src/test/test-utils.js.map +1 -1
  119. package/lib/src/utils/authService/authService.spec.js +8 -8
  120. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  121. package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  122. package/lib/src/utils/graphql/answerService/answerService.spec.js +1 -1
  123. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  124. package/lib/src/utils/graphql/graphql-request.spec.js +1 -1
  125. package/lib/src/utils/graphql/graphql-request.spec.js.map +1 -1
  126. package/lib/src/utils/graphql/sourceService.spec.js +1 -1
  127. package/lib/src/utils/graphql/sourceService.spec.js.map +1 -1
  128. package/lib/src/utils/logger.spec.d.ts +5 -20
  129. package/lib/src/utils/logger.spec.d.ts.map +1 -1
  130. package/lib/src/utils/processData.spec.js +17 -17
  131. package/lib/src/utils/processData.spec.js.map +1 -1
  132. package/lib/src/utils/processTrigger.spec.js +8 -8
  133. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  134. package/lib/src/utils.d.ts +6 -0
  135. package/lib/src/utils.d.ts.map +1 -1
  136. package/lib/src/utils.js +30 -0
  137. package/lib/src/utils.js.map +1 -1
  138. package/lib/src/utils.spec.js +20 -11
  139. package/lib/src/utils.spec.js.map +1 -1
  140. package/package.json +6 -5
  141. package/src/auth.spec.ts +53 -51
  142. package/src/authToken.spec.ts +3 -3
  143. package/src/embed/app.spec.ts +12 -5
  144. package/src/embed/app.ts +4 -2
  145. package/src/embed/base.spec.ts +16 -20
  146. package/src/embed/bodyless-conversation.spec.ts +2 -2
  147. package/src/embed/conversation.spec.ts +2 -2
  148. package/src/embed/embed.spec.ts +122 -2
  149. package/src/embed/events.spec.ts +2 -2
  150. package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
  151. package/src/embed/liveboard.spec.ts +30 -29
  152. package/src/embed/liveboard.ts +4 -2
  153. package/src/embed/pinboard.spec.ts +1 -1
  154. package/src/embed/sage.spec.ts +2 -2
  155. package/src/embed/search.spec.ts +133 -2
  156. package/src/embed/ts-embed-trigger.spec.ts +2 -3
  157. package/src/embed/ts-embed.spec.ts +317 -76
  158. package/src/mixpanel-service.spec.ts +1 -1
  159. package/src/react/index.spec.tsx +4 -5
  160. package/src/test/test-utils.ts +2 -2
  161. package/src/utils/authService/authService.spec.ts +17 -17
  162. package/src/utils/authService/tokenizedAuthService.spec.ts +4 -4
  163. package/src/utils/graphql/answerService/answerService.spec.ts +3 -3
  164. package/src/utils/graphql/graphql-request.spec.ts +2 -2
  165. package/src/utils/graphql/sourceService.spec.ts +1 -1
  166. package/src/utils/processData.spec.ts +26 -26
  167. package/src/utils/processTrigger.spec.ts +8 -8
  168. package/src/utils.spec.ts +22 -11
  169. package/src/utils.ts +34 -0
@@ -40,7 +40,7 @@ export const defaultParams = `&${defaultParamsWithoutHiddenActions}&hideAction=[
40
40
  const hideBydefault = `&hideAction=${fixedEncodeURI(JSON.stringify([Action.ReportError, ...HiddenActionItemByDefaultForSearchEmbed]))}`;
41
41
  const defaultParamsWithHiddenActions = defaultParamsWithoutHiddenActions + hideBydefault;
42
42
  beforeAll(() => {
43
- spyOn(window, 'alert');
43
+ jest.spyOn(window, 'alert').mockImplementation(() => { });
44
44
  });
45
45
  const customisations = {
46
46
  style: {
@@ -96,7 +96,7 @@ describe('Unit test case for ts embed', () => {
96
96
  resetCachedAuthToken();
97
97
  });
98
98
  beforeAll(() => {
99
- jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(true);
99
+ jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(undefined);
100
100
  });
101
101
  describe('Vaidate iframe properties', () => {
102
102
  beforeAll(() => {
@@ -204,7 +204,7 @@ describe('Unit test case for ts embed', () => {
204
204
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
205
205
  });
206
206
  await executeAfterWait(() => {
207
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.EXPIRY);
207
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
208
208
  expect(baseInstance.handleAuth).not.toHaveBeenCalled();
209
209
  expect(mockPort.postMessage).toHaveBeenCalledWith({
210
210
  type: EmbedEvent.AuthExpire,
@@ -236,7 +236,7 @@ describe('Unit test case for ts embed', () => {
236
236
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
237
237
  });
238
238
  await executeAfterWait(() => {
239
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.EXPIRY);
239
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
240
240
  expect(mockPort.postMessage).not.toHaveBeenCalledWith({
241
241
  type: EmbedEvent.AuthExpire,
242
242
  data: { authToken: 'test_auth_token2' },
@@ -588,7 +588,7 @@ describe('Unit test case for ts embed', () => {
588
588
  expect(iframe.contentWindow.postMessage).toHaveBeenCalledTimes(0);
589
589
  }, 1000);
590
590
  });
591
- test('should remove event listener when called off method', async (done) => {
591
+ test('should remove event listener when called off method', async () => {
592
592
  const mockEmbedEventPayload = {
593
593
  type: EmbedEvent.Save,
594
594
  data: { answerId: '123' },
@@ -606,10 +606,7 @@ describe('Unit test case for ts embed', () => {
606
606
  const iframe = getIFrameEl();
607
607
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
608
608
  });
609
- await executeAfterWait(() => {
610
- expect(mockFn).toHaveBeenCalledTimes(1);
611
- done();
612
- }, 100);
609
+ expect(mockFn).toHaveBeenCalledTimes(1);
613
610
  });
614
611
  });
615
612
  describe('Appinit embedEvent in cookieless authentication authType', () => {
@@ -850,7 +847,7 @@ describe('Unit test case for ts embed', () => {
850
847
  authType: AuthType.TrustedAuthTokenCookieless,
851
848
  getAuthToken: () => Promise.reject(),
852
849
  });
853
- jest.spyOn(logger, 'error').mockResolvedValue(true);
850
+ jest.spyOn(logger, 'error').mockImplementation(() => { });
854
851
  });
855
852
  afterEach(() => {
856
853
  jest.clearAllMocks();
@@ -917,14 +914,14 @@ describe('Unit test case for ts embed', () => {
917
914
  const mockPort = {
918
915
  postMessage: jest.fn(),
919
916
  };
920
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
917
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
921
918
  await executeAfterWait(() => {
922
919
  const iframe = getIFrameEl();
923
920
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
924
921
  });
925
922
  await executeAfterWait(() => {
926
923
  expect(getRootEl().innerHTML).toContain('Not logged in');
927
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.EXPIRY);
924
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
928
925
  expect(loggerSpy).toHaveBeenCalledTimes(1);
929
926
  });
930
927
  jest.spyOn(authService, 'verifyTokenService').mockClear();
@@ -941,7 +938,7 @@ describe('Unit test case for ts embed', () => {
941
938
  const searchEmbed = new SearchEmbed(getRootEl(), { ...defaultViewConfig, preRenderId: 'test' });
942
939
  jest.spyOn(baseInstance, 'notifyAuthFailure');
943
940
  searchEmbed.preRender();
944
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
941
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
945
942
  const mockPort = {
946
943
  postMessage: jest.fn(),
947
944
  };
@@ -952,7 +949,7 @@ describe('Unit test case for ts embed', () => {
952
949
  const preRenderWrapper = document.getElementById('tsEmbed-pre-render-wrapper-test');
953
950
  await executeAfterWait(() => {
954
951
  expect(preRenderWrapper.innerHTML).toContain('Not logged in');
955
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.EXPIRY);
952
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
956
953
  expect(loggerSpy).toHaveBeenCalledTimes(1);
957
954
  });
958
955
  jest.spyOn(authService, 'verifyTokenService').mockClear();
@@ -982,7 +979,7 @@ describe('Unit test case for ts embed', () => {
982
979
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
983
980
  });
984
981
  await executeAfterWait(() => {
985
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.EXPIRY);
982
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
986
983
  expect(baseInstance.handleAuth).toHaveBeenCalled();
987
984
  });
988
985
  });
@@ -1007,7 +1004,7 @@ describe('Unit test case for ts embed', () => {
1007
1004
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
1008
1005
  });
1009
1006
  await executeAfterWait(() => {
1010
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.EXPIRY);
1007
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
1011
1008
  expect(baseInstance.handleAuth).not.toHaveBeenCalled();
1012
1009
  });
1013
1010
  });
@@ -1023,9 +1020,7 @@ describe('Unit test case for ts embed', () => {
1023
1020
  const setup = async (isLoggedIn = false) => {
1024
1021
  jest.spyOn(window, 'addEventListener').mockImplementationOnce((event, handler, options) => {
1025
1022
  handler({
1026
- data: {
1027
- type: 'xyz',
1028
- },
1023
+ data: { type: 'xyz' },
1029
1024
  ports: [3000],
1030
1025
  source: null,
1031
1026
  });
@@ -1043,8 +1038,8 @@ describe('Unit test case for ts embed', () => {
1043
1038
  };
1044
1039
  test('mixpanel should call with VISUAL_SDK_RENDER_COMPLETE', async () => {
1045
1040
  await setup(true);
1046
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1047
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE, expect.objectContaining({
1041
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1042
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE, expect.objectContaining({
1048
1043
  elWidth: 0,
1049
1044
  elHeight: 0,
1050
1045
  }));
@@ -1054,12 +1049,9 @@ describe('Unit test case for ts embed', () => {
1054
1049
  const prefetchIframe = document.querySelectorAll('.prefetchIframe');
1055
1050
  expect(prefetchIframe.length).toBe(0);
1056
1051
  });
1057
- test('Should render failure when login fails', async (done) => {
1058
- setup(false);
1059
- executeAfterWait(() => {
1060
- expect(getRootEl().innerHTML).toContain('Failed to Login');
1061
- done();
1062
- });
1052
+ test('Should render failure when login fails', async () => {
1053
+ await setup(false);
1054
+ expect(getRootEl().innerHTML).toContain('Failed to Login');
1063
1055
  });
1064
1056
  });
1065
1057
  describe('Trigger infoSuccess event on iframe load', () => {
@@ -1074,9 +1066,7 @@ describe('Unit test case for ts embed', () => {
1074
1066
  const setup = async (isLoggedIn = false, overrideOrgId = undefined) => {
1075
1067
  jest.spyOn(window, 'addEventListener').mockImplementationOnce((event, handler, options) => {
1076
1068
  handler({
1077
- data: {
1078
- type: 'xyz',
1079
- },
1069
+ data: { type: 'xyz' },
1080
1070
  ports: [3000],
1081
1071
  source: null,
1082
1072
  });
@@ -1309,19 +1299,19 @@ describe('Unit test case for ts embed', () => {
1309
1299
  const iFrame = document.createElement('div');
1310
1300
  iFrame.contentWindow = null;
1311
1301
  jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
1312
- spyOn(logger, 'error');
1302
+ jest.spyOn(logger, 'error');
1313
1303
  await tsEmbed.render();
1314
1304
  });
1315
1305
  test('mixpanel should call with VISUAL_SDK_RENDER_FAILED', () => {
1316
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1317
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
1306
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1307
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
1318
1308
  error: 'false',
1319
1309
  });
1320
1310
  });
1321
1311
  });
1322
1312
  describe('when visible actions are set', () => {
1323
1313
  test('should throw error when there are both visible and hidden actions - pinboard', async () => {
1324
- spyOn(logger, 'error');
1314
+ jest.spyOn(logger, 'error');
1325
1315
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
1326
1316
  hiddenActions: [Action.DownloadAsCsv],
1327
1317
  visibleActions: [Action.DownloadAsCsv],
@@ -1352,7 +1342,7 @@ describe('Unit test case for ts embed', () => {
1352
1342
  * @param visibleActions
1353
1343
  */
1354
1344
  async function testActionsForLiveboards(hiddenActions, visibleActions) {
1355
- spyOn(logger, 'error');
1345
+ jest.spyOn(logger, 'error');
1356
1346
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1357
1347
  hiddenActions,
1358
1348
  visibleActions,
@@ -1398,7 +1388,7 @@ describe('Unit test case for ts embed', () => {
1398
1388
  });
1399
1389
  describe('when visible Tabs are set', () => {
1400
1390
  test('should throw error when there are both visible and hidden Tabs - pinboard', async () => {
1401
- spyOn(logger, 'error');
1391
+ jest.spyOn(logger, 'error');
1402
1392
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
1403
1393
  visibleTabs: [tabId1],
1404
1394
  hiddenTabs: [tabId2],
@@ -1429,7 +1419,7 @@ describe('Unit test case for ts embed', () => {
1429
1419
  * @param visibleTabs
1430
1420
  */
1431
1421
  async function testTabsForLiveboards(hiddenTabs, visibleTabs) {
1432
- spyOn(logger, 'error');
1422
+ jest.spyOn(logger, 'error');
1433
1423
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1434
1424
  hiddenTabs,
1435
1425
  visibleTabs,
@@ -1482,7 +1472,7 @@ describe('Unit test case for ts embed', () => {
1482
1472
  });
1483
1473
  });
1484
1474
  test('Error should be true', async () => {
1485
- spyOn(logger, 'error');
1475
+ jest.spyOn(logger, 'error');
1486
1476
  const tsEmbed = new SearchEmbed(getRootEl(), {});
1487
1477
  await tsEmbed.render();
1488
1478
  expect(tsEmbed['isError']).toBe(true);
@@ -1499,7 +1489,7 @@ describe('Unit test case for ts embed', () => {
1499
1489
  jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(() => 'http://tshost');
1500
1490
  });
1501
1491
  test('when isRendered is true than isError will be true', async () => {
1502
- spyOn(logger, 'warn');
1492
+ jest.spyOn(logger, 'warn');
1503
1493
  const viEmbedIns = new tsEmbedInstance.V1Embed(getRootEl(), defaultViewConfig);
1504
1494
  expect(viEmbedIns['isError']).toBe(false);
1505
1495
  await viEmbedIns.render();
@@ -1543,7 +1533,7 @@ describe('Unit test case for ts embed', () => {
1543
1533
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}${defaultParamsPost}#/${path}`);
1544
1534
  });
1545
1535
  test('navigateToPage function use before render', async () => {
1546
- spyOn(logger, 'log');
1536
+ jest.spyOn(logger, 'log');
1547
1537
  const appEmbed = new AppEmbed(getRootEl(), {
1548
1538
  frameParams: {
1549
1539
  width: '100%',
@@ -1747,7 +1737,7 @@ describe('Unit test case for ts embed', () => {
1747
1737
  await appEmbed.render();
1748
1738
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&additionalPendoKey=1234${defaultParamsPost}#/home`);
1749
1739
  });
1750
- xit('Sets the forceSAMLAutoRedirect param', async (done) => {
1740
+ xit('Sets the forceSAMLAutoRedirect param', async () => {
1751
1741
  jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
1752
1742
  init({
1753
1743
  thoughtSpotHost: 'tshost',
@@ -1760,11 +1750,8 @@ describe('Unit test case for ts embed', () => {
1760
1750
  },
1761
1751
  });
1762
1752
  appEmbed.render();
1763
- await waitFor(() => !!getIFrameEl()).then(() => {
1764
- expect(getIFrameSrc()).toContain('authType=EmbeddedSSO');
1765
- expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
1766
- done();
1767
- });
1753
+ expect(getIFrameSrc()).toContain('authType=EmbeddedSSO');
1754
+ expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
1768
1755
  });
1769
1756
  it('Should set the override locale for number/date and currency format', async () => {
1770
1757
  jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
@@ -1914,8 +1901,7 @@ describe('Unit test case for ts embed', () => {
1914
1901
  beforeAll(() => {
1915
1902
  delete window.location;
1916
1903
  window.location = {
1917
- hash: '',
1918
- search: '',
1904
+ assign: jest.fn(),
1919
1905
  };
1920
1906
  });
1921
1907
  beforeEach(() => {
@@ -1985,7 +1971,7 @@ describe('Unit test case for ts embed', () => {
1985
1971
  });
1986
1972
  afterAll(() => {
1987
1973
  const rootEle = document.getElementById('myRoot');
1988
- rootEle.remove();
1974
+ rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
1989
1975
  jest.clearAllMocks();
1990
1976
  });
1991
1977
  it('should preRender and hide the iframe', async () => {
@@ -2019,9 +2005,9 @@ describe('Unit test case for ts embed', () => {
2019
2005
  };
2020
2006
  });
2021
2007
  // show preRender
2022
- const warnSpy = spyOn(logger, 'warn');
2008
+ const warnSpy = jest.spyOn(logger, 'warn');
2023
2009
  libEmbed.showPreRender();
2024
- expect(warnSpy).toHaveBeenCalledTimes(0);
2010
+ expect(warnSpy).toHaveBeenCalledTimes(1);
2025
2011
  resizeObserverCb([
2026
2012
  {
2027
2013
  target: tsEmbedDiv,
@@ -2042,7 +2028,7 @@ describe('Unit test case for ts embed', () => {
2042
2028
  });
2043
2029
  it('preRender called without preRenderId should log error ', () => {
2044
2030
  createRootEleForEmbed();
2045
- spyOn(logger, 'error');
2031
+ jest.spyOn(logger, 'error');
2046
2032
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2047
2033
  liveboardId: 'myLiveboardId',
2048
2034
  });
@@ -2069,7 +2055,7 @@ describe('Unit test case for ts embed', () => {
2069
2055
  preRenderId: 'i-am-preRendered',
2070
2056
  liveboardId: 'myLiveboardId',
2071
2057
  });
2072
- spyOn(libEmbed, 'preRender');
2058
+ jest.spyOn(libEmbed, 'preRender');
2073
2059
  libEmbed.hidePreRender();
2074
2060
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
2075
2061
  });
@@ -2103,8 +2089,8 @@ describe('Unit test case for ts embed', () => {
2103
2089
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2104
2090
  liveboardId: 'myLiveboardId',
2105
2091
  });
2106
- spyOn(libEmbed, 'preRender');
2107
- spyOn(logger, 'error');
2092
+ jest.spyOn(libEmbed, 'preRender');
2093
+ jest.spyOn(logger, 'error');
2108
2094
  libEmbed.showPreRender();
2109
2095
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
2110
2096
  expect(logger.error).toHaveBeenCalledTimes(1);
@@ -2134,7 +2120,7 @@ describe('Unit test case for ts embed', () => {
2134
2120
  preRenderId: 'test',
2135
2121
  });
2136
2122
  await libEmbed.syncPreRenderStyle();
2137
- expect(logger.error).toBeCalledWith('PreRender should be called before using syncPreRenderStyle');
2123
+ expect(logger.error).toHaveBeenCalledWith('PreRender should be called before using syncPreRenderStyle');
2138
2124
  logger.error.mockClear();
2139
2125
  });
2140
2126
  });
@@ -2167,7 +2153,7 @@ describe('Unit test case for ts embed', () => {
2167
2153
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2168
2154
  });
2169
2155
  await executeAfterWait(() => {
2170
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2156
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2171
2157
  expect(baseInstance.handleAuth).toHaveBeenCalled();
2172
2158
  expect(mockPort.postMessage).toHaveBeenCalledWith({
2173
2159
  type: EmbedEvent.IdleSessionTimeout,
@@ -2193,14 +2179,14 @@ describe('Unit test case for ts embed', () => {
2193
2179
  const mockPort = {
2194
2180
  postMessage: jest.fn(),
2195
2181
  };
2196
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
2182
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
2197
2183
  await executeAfterWait(() => {
2198
2184
  const iframe = getIFrameEl();
2199
2185
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2200
2186
  });
2201
2187
  await executeAfterWait(() => {
2202
2188
  expect(getRootEl().innerHTML).toContain('Not logged in');
2203
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2189
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2204
2190
  expect(loggerSpy).toHaveBeenCalledTimes(1);
2205
2191
  });
2206
2192
  jest.spyOn(authService, 'verifyTokenService').mockClear();
@@ -2225,13 +2211,13 @@ describe('Unit test case for ts embed', () => {
2225
2211
  const mockPort = {
2226
2212
  postMessage: jest.fn(),
2227
2213
  };
2228
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
2214
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
2229
2215
  await executeAfterWait(() => {
2230
2216
  const iframe = getIFrameEl();
2231
2217
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2232
2218
  });
2233
2219
  await executeAfterWait(() => {
2234
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2220
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2235
2221
  expect(loggerSpy).toHaveBeenCalledTimes(0);
2236
2222
  });
2237
2223
  jest.spyOn(authService, 'verifyTokenService').mockClear();
@@ -2239,7 +2225,7 @@ describe('Unit test case for ts embed', () => {
2239
2225
  });
2240
2226
  });
2241
2227
  describe('Renders should wait for init to completed', () => {
2242
- const errorSpy = jest.spyOn(logger, 'error').mockResolvedValue(true);
2228
+ const errorSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
2243
2229
  beforeEach(() => {
2244
2230
  errorSpy.mockClear();
2245
2231
  resetValueFromWindow('initFlagKey');
@@ -2883,7 +2869,7 @@ describe('Unit test case for ts embed', () => {
2883
2869
  });
2884
2870
  test('should execute callbacks through executeEvent function', async () => {
2885
2871
  let capturedExecuteEvent;
2886
- mockHandleInterceptEvent.mockImplementation((params) => {
2872
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
2887
2873
  capturedExecuteEvent = params.executeEvent;
2888
2874
  });
2889
2875
  const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
@@ -2916,7 +2902,7 @@ describe('Unit test case for ts embed', () => {
2916
2902
  });
2917
2903
  test('should call triggerUIPassThrough through getUnsavedAnswerTml function', async () => {
2918
2904
  let capturedGetUnsavedAnswerTml;
2919
- mockHandleInterceptEvent.mockImplementation((params) => {
2905
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
2920
2906
  capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
2921
2907
  });
2922
2908
  const mockTmlResponse = { tml: 'test-tml-content' };
@@ -3066,7 +3052,7 @@ describe('Unit test case for ts embed', () => {
3066
3052
  });
3067
3053
  test('should pass eventPort to executeCallbacks', async () => {
3068
3054
  let capturedExecuteEvent;
3069
- mockHandleInterceptEvent.mockImplementation((params) => {
3055
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3070
3056
  capturedExecuteEvent = params.executeEvent;
3071
3057
  });
3072
3058
  const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
@@ -3099,7 +3085,7 @@ describe('Unit test case for ts embed', () => {
3099
3085
  });
3100
3086
  test('should handle getUnsavedAnswerTml with empty response', async () => {
3101
3087
  let capturedGetUnsavedAnswerTml;
3102
- mockHandleInterceptEvent.mockImplementation((params) => {
3088
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3103
3089
  capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
3104
3090
  });
3105
3091
  mockProcessTrigger.mockResolvedValue([]);
@@ -3220,4 +3206,194 @@ describe('Additional Coverage Tests', () => {
3220
3206
  expect(removeEventListenerSpy).toHaveBeenCalledWith('message', expect.any(Function));
3221
3207
  });
3222
3208
  });
3209
+ describe('Trigger method edge cases', () => {
3210
+ beforeAll(() => {
3211
+ init({
3212
+ thoughtSpotHost: 'tshost',
3213
+ authType: AuthType.None,
3214
+ });
3215
+ });
3216
+ beforeEach(() => {
3217
+ document.body.innerHTML = getDocumentBody();
3218
+ });
3219
+ test('should handle error when trigger is called with undefined messageType', async () => {
3220
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3221
+ jest.spyOn(logger, 'error');
3222
+ await searchEmbed.render();
3223
+ await executeAfterWait(async () => {
3224
+ const result = await searchEmbed.trigger(undefined);
3225
+ expect(result).toBeNull();
3226
+ expect(logger.error).toHaveBeenCalledWith(expect.objectContaining({
3227
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
3228
+ code: EmbedErrorCodes.HOST_EVENT_TYPE_UNDEFINED,
3229
+ }));
3230
+ });
3231
+ });
3232
+ test('should return null when trigger is called before iframe is ready', async () => {
3233
+ jest.spyOn(baseInstance, 'getAuthPromise').mockRejectedValueOnce(new Error('Auth failed'));
3234
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3235
+ jest.spyOn(logger, 'debug');
3236
+ await searchEmbed.render();
3237
+ await executeAfterWait(async () => {
3238
+ const result = await searchEmbed.trigger(HostEvent.Reload);
3239
+ expect(result).toBeNull();
3240
+ });
3241
+ });
3242
+ });
3243
+ describe('PreRender replaceExistingPreRender scenarios', () => {
3244
+ beforeAll(() => {
3245
+ init({
3246
+ thoughtSpotHost: 'tshost',
3247
+ authType: AuthType.None,
3248
+ });
3249
+ });
3250
+ afterEach(() => {
3251
+ const rootEle = document.getElementById('myRoot');
3252
+ rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
3253
+ });
3254
+ test('should skip re-rendering when preRender already exists and replaceExistingPreRender is false', async () => {
3255
+ createRootEleForEmbed();
3256
+ const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
3257
+ preRenderId: 'no-replace-test',
3258
+ liveboardId: 'lb1',
3259
+ });
3260
+ await embed1.preRender();
3261
+ await waitFor(() => !!getIFrameEl());
3262
+ const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
3263
+ preRenderId: 'no-replace-test',
3264
+ liveboardId: 'lb2',
3265
+ });
3266
+ const result = await embed2.preRender(false, false);
3267
+ expect(result).toBe(embed2);
3268
+ // The original iframe should still have lb1
3269
+ const iframe = getIFrameEl();
3270
+ expect(iframe.src).toContain('lb1');
3271
+ });
3272
+ });
3273
+ describe('Destroy error handling', () => {
3274
+ beforeAll(() => {
3275
+ init({
3276
+ thoughtSpotHost: 'tshost',
3277
+ authType: AuthType.None,
3278
+ });
3279
+ });
3280
+ beforeEach(() => {
3281
+ document.body.innerHTML = getDocumentBody();
3282
+ });
3283
+ test('should handle error gracefully when destroy fails', async () => {
3284
+ const appEmbed = new AppEmbed(getRootEl(), {
3285
+ frameParams: { width: '100%', height: '100%' },
3286
+ });
3287
+ await appEmbed.render();
3288
+ const logSpy = jest.spyOn(logger, 'log').mockImplementation(() => { });
3289
+ jest.spyOn(Node.prototype, 'removeChild').mockImplementationOnce(() => {
3290
+ throw new Error('Remove failed');
3291
+ });
3292
+ expect(() => {
3293
+ appEmbed.destroy();
3294
+ }).not.toThrow();
3295
+ expect(logSpy).toHaveBeenCalledWith('Error destroying TS Embed', expect.any(Error));
3296
+ logSpy.mockRestore();
3297
+ });
3298
+ });
3299
+ describe('Fullscreen change handler behavior', () => {
3300
+ beforeAll(() => {
3301
+ init({
3302
+ thoughtSpotHost: 'tshost',
3303
+ authType: AuthType.None,
3304
+ disableFullscreenPresentation: false,
3305
+ });
3306
+ });
3307
+ beforeEach(() => {
3308
+ document.body.innerHTML = getDocumentBody();
3309
+ });
3310
+ test('should trigger ExitPresentMode when exiting fullscreen', async () => {
3311
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
3312
+ ...defaultViewConfig,
3313
+ liveboardId: 'test-lb',
3314
+ });
3315
+ await liveboardEmbed.render();
3316
+ await executeAfterWait(() => {
3317
+ const iframe = getIFrameEl();
3318
+ expect(iframe).toBeTruthy();
3319
+ });
3320
+ mockProcessTrigger.mockResolvedValue({});
3321
+ liveboardEmbed['setupFullscreenChangeHandler']();
3322
+ Object.defineProperty(document, 'fullscreenElement', {
3323
+ value: null,
3324
+ writable: true,
3325
+ configurable: true,
3326
+ });
3327
+ const event = new Event('fullscreenchange');
3328
+ document.dispatchEvent(event);
3329
+ await executeAfterWait(() => {
3330
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.ExitPresentMode, expect.any(String), expect.any(Object));
3331
+ });
3332
+ });
3333
+ test('should not trigger ExitPresentMode when entering fullscreen', async () => {
3334
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
3335
+ ...defaultViewConfig,
3336
+ liveboardId: 'test-lb-fullscreen',
3337
+ });
3338
+ await liveboardEmbed.render();
3339
+ await executeAfterWait(() => {
3340
+ const iframe = getIFrameEl();
3341
+ expect(iframe).toBeTruthy();
3342
+ });
3343
+ mockProcessTrigger.mockClear();
3344
+ mockProcessTrigger.mockResolvedValue({});
3345
+ liveboardEmbed['setupFullscreenChangeHandler']();
3346
+ Object.defineProperty(document, 'fullscreenElement', {
3347
+ value: getIFrameEl(),
3348
+ writable: true,
3349
+ configurable: true,
3350
+ });
3351
+ const event = new Event('fullscreenchange');
3352
+ document.dispatchEvent(event);
3353
+ await executeAfterWait(() => {
3354
+ expect(mockProcessTrigger).not.toHaveBeenCalledWith(expect.any(Object), HostEvent.ExitPresentMode, expect.any(String), expect.any(Object));
3355
+ });
3356
+ });
3357
+ });
3358
+ describe('ShowPreRender with UpdateEmbedParams', () => {
3359
+ beforeAll(() => {
3360
+ init({
3361
+ thoughtSpotHost: 'tshost',
3362
+ authType: AuthType.None,
3363
+ });
3364
+ });
3365
+ afterEach(() => {
3366
+ const rootEle = document.getElementById('myRoot');
3367
+ rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
3368
+ });
3369
+ test('should trigger UpdateEmbedParams when showPreRender connects to existing prerendered component', async () => {
3370
+ createRootEleForEmbed();
3371
+ mockMessageChannel();
3372
+ window.ResizeObserver = window.ResizeObserver
3373
+ || jest.fn().mockImplementation(() => ({
3374
+ disconnect: jest.fn(),
3375
+ observe: jest.fn(),
3376
+ unobserve: jest.fn(),
3377
+ }));
3378
+ const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
3379
+ preRenderId: 'update-params-test',
3380
+ liveboardId: 'original-lb',
3381
+ });
3382
+ await embed1.preRender();
3383
+ await waitFor(() => !!getIFrameEl());
3384
+ embed1.isEmbedContainerLoaded = true;
3385
+ mockProcessTrigger.mockClear();
3386
+ mockProcessTrigger.mockResolvedValue({});
3387
+ const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
3388
+ preRenderId: 'update-params-test',
3389
+ liveboardId: 'updated-lb',
3390
+ });
3391
+ embed2.showPreRender();
3392
+ await executeAfterWait(() => {
3393
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
3394
+ liveboardId: 'updated-lb',
3395
+ }));
3396
+ });
3397
+ });
3398
+ });
3223
3399
  //# sourceMappingURL=ts-embed.spec.js.map