@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
@@ -89,7 +89,7 @@ const hideBydefault = `&hideAction=${fixedEncodeURI(
89
89
  const defaultParamsWithHiddenActions = defaultParamsWithoutHiddenActions + hideBydefault;
90
90
 
91
91
  beforeAll(() => {
92
- spyOn(window, 'alert');
92
+ jest.spyOn(window, 'alert').mockImplementation(() => {});
93
93
  });
94
94
 
95
95
  const customisations = {
@@ -152,7 +152,7 @@ describe('Unit test case for ts embed', () => {
152
152
  });
153
153
 
154
154
  beforeAll(() => {
155
- jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(true);
155
+ jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(undefined);
156
156
  });
157
157
 
158
158
  describe('Vaidate iframe properties', () => {
@@ -293,7 +293,7 @@ describe('Unit test case for ts embed', () => {
293
293
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
294
294
  });
295
295
  await executeAfterWait(() => {
296
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
296
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
297
297
  authInstance.AuthFailureType.EXPIRY,
298
298
  );
299
299
  expect(baseInstance.handleAuth).not.toHaveBeenCalled();
@@ -330,7 +330,7 @@ describe('Unit test case for ts embed', () => {
330
330
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
331
331
  });
332
332
  await executeAfterWait(() => {
333
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
333
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
334
334
  authInstance.AuthFailureType.EXPIRY,
335
335
  );
336
336
  expect(mockPort.postMessage).not.toHaveBeenCalledWith({
@@ -725,7 +725,7 @@ describe('Unit test case for ts embed', () => {
725
725
  }, 1000);
726
726
  });
727
727
 
728
- test('should remove event listener when called off method', async (done) => {
728
+ test('should remove event listener when called off method', async () => {
729
729
  const mockEmbedEventPayload = {
730
730
  type: EmbedEvent.Save,
731
731
  data: { answerId: '123' },
@@ -745,10 +745,7 @@ describe('Unit test case for ts embed', () => {
745
745
  const iframe = getIFrameEl();
746
746
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
747
747
  });
748
- await executeAfterWait(() => {
749
- expect(mockFn).toHaveBeenCalledTimes(1);
750
- done();
751
- }, 100);
748
+ expect(mockFn).toHaveBeenCalledTimes(1);
752
749
  });
753
750
  });
754
751
 
@@ -1013,7 +1010,7 @@ describe('Unit test case for ts embed', () => {
1013
1010
  authType: AuthType.TrustedAuthTokenCookieless,
1014
1011
  getAuthToken: () => Promise.reject(),
1015
1012
  });
1016
- jest.spyOn(logger, 'error').mockResolvedValue(true);
1013
+ jest.spyOn(logger, 'error').mockImplementation(() => {});
1017
1014
  });
1018
1015
 
1019
1016
  afterEach(() => {
@@ -1089,14 +1086,14 @@ describe('Unit test case for ts embed', () => {
1089
1086
  const mockPort: any = {
1090
1087
  postMessage: jest.fn(),
1091
1088
  };
1092
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
1089
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => {});
1093
1090
  await executeAfterWait(() => {
1094
1091
  const iframe = getIFrameEl();
1095
1092
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
1096
1093
  });
1097
1094
  await executeAfterWait(() => {
1098
1095
  expect(getRootEl().innerHTML).toContain('Not logged in');
1099
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
1096
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
1100
1097
  authInstance.AuthFailureType.EXPIRY,
1101
1098
  );
1102
1099
  expect(loggerSpy).toHaveBeenCalledTimes(1);
@@ -1118,7 +1115,7 @@ describe('Unit test case for ts embed', () => {
1118
1115
  const searchEmbed = new SearchEmbed(getRootEl(), { ...defaultViewConfig, preRenderId: 'test' });
1119
1116
  jest.spyOn(baseInstance, 'notifyAuthFailure');
1120
1117
  searchEmbed.preRender();
1121
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
1118
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => {});
1122
1119
  const mockPort: any = {
1123
1120
  postMessage: jest.fn(),
1124
1121
  };
@@ -1129,7 +1126,7 @@ describe('Unit test case for ts embed', () => {
1129
1126
  const preRenderWrapper = document.getElementById('tsEmbed-pre-render-wrapper-test');
1130
1127
  await executeAfterWait(() => {
1131
1128
  expect(preRenderWrapper.innerHTML).toContain('Not logged in');
1132
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
1129
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
1133
1130
  authInstance.AuthFailureType.EXPIRY,
1134
1131
  );
1135
1132
  expect(loggerSpy).toHaveBeenCalledTimes(1);
@@ -1163,7 +1160,7 @@ describe('Unit test case for ts embed', () => {
1163
1160
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
1164
1161
  });
1165
1162
  await executeAfterWait(() => {
1166
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
1163
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
1167
1164
  authInstance.AuthFailureType.EXPIRY,
1168
1165
  );
1169
1166
  expect(baseInstance.handleAuth).toHaveBeenCalled();
@@ -1190,7 +1187,7 @@ describe('Unit test case for ts embed', () => {
1190
1187
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
1191
1188
  });
1192
1189
  await executeAfterWait(() => {
1193
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
1190
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
1194
1191
  authInstance.AuthFailureType.EXPIRY,
1195
1192
  );
1196
1193
  expect(baseInstance.handleAuth).not.toHaveBeenCalled();
@@ -1210,13 +1207,11 @@ describe('Unit test case for ts embed', () => {
1210
1207
  const setup = async (isLoggedIn = false) => {
1211
1208
  jest.spyOn(window, 'addEventListener').mockImplementationOnce(
1212
1209
  (event, handler, options) => {
1213
- handler({
1214
- data: {
1215
- type: 'xyz',
1216
- },
1210
+ (handler as EventListener)({
1211
+ data: { type: 'xyz' },
1217
1212
  ports: [3000],
1218
1213
  source: null,
1219
- });
1214
+ } as any);
1220
1215
  },
1221
1216
  );
1222
1217
  const iFrame: any = document.createElement('div');
@@ -1226,7 +1221,7 @@ describe('Unit test case for ts embed', () => {
1226
1221
  tsEmbed.on(EmbedEvent.CustomAction, jest.fn());
1227
1222
  jest.spyOn(iFrame, 'addEventListener').mockImplementationOnce(
1228
1223
  (event, handler, options) => {
1229
- handler({});
1224
+ (handler as EventListener)({} as Event);
1230
1225
  },
1231
1226
  );
1232
1227
  jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
@@ -1235,8 +1230,8 @@ describe('Unit test case for ts embed', () => {
1235
1230
 
1236
1231
  test('mixpanel should call with VISUAL_SDK_RENDER_COMPLETE', async () => {
1237
1232
  await setup(true);
1238
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1239
- expect(mockMixPanelEvent).toBeCalledWith(
1233
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1234
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(
1240
1235
  MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE,
1241
1236
  expect.objectContaining({
1242
1237
  elWidth: 0,
@@ -1251,12 +1246,9 @@ describe('Unit test case for ts embed', () => {
1251
1246
  expect(prefetchIframe.length).toBe(0);
1252
1247
  });
1253
1248
 
1254
- test('Should render failure when login fails', async (done) => {
1255
- setup(false);
1256
- executeAfterWait(() => {
1257
- expect(getRootEl().innerHTML).toContain('Failed to Login');
1258
- done();
1259
- });
1249
+ test('Should render failure when login fails', async () => {
1250
+ await setup(false);
1251
+ expect(getRootEl().innerHTML).toContain('Failed to Login');
1260
1252
  });
1261
1253
  });
1262
1254
 
@@ -1273,13 +1265,11 @@ describe('Unit test case for ts embed', () => {
1273
1265
  const setup = async (isLoggedIn = false, overrideOrgId: number | undefined = undefined) => {
1274
1266
  jest.spyOn(window, 'addEventListener').mockImplementationOnce(
1275
1267
  (event, handler, options) => {
1276
- handler({
1277
- data: {
1278
- type: 'xyz',
1279
- },
1268
+ (handler as EventListener)({
1269
+ data: { type: 'xyz' },
1280
1270
  ports: [3000],
1281
1271
  source: null,
1282
- });
1272
+ } as any);
1283
1273
  },
1284
1274
  );
1285
1275
  mockProcessTrigger.mockResolvedValueOnce({ session: 'test' });
@@ -1315,7 +1305,7 @@ describe('Unit test case for ts embed', () => {
1315
1305
  tsEmbed.on(EmbedEvent.CustomAction, jest.fn());
1316
1306
  jest.spyOn(iFrame, 'addEventListener').mockImplementationOnce(
1317
1307
  (event, handler, options) => {
1318
- handler({});
1308
+ (handler as EventListener)({} as Event);
1319
1309
  },
1320
1310
  );
1321
1311
  jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
@@ -1377,11 +1367,11 @@ describe('Unit test case for ts embed', () => {
1377
1367
  ) => {
1378
1368
  jest.spyOn(window, 'addEventListener').mockImplementationOnce(
1379
1369
  (event, handler, options) => {
1380
- handler({
1370
+ (handler as EventListener)({
1381
1371
  data: { type: 'xyz' },
1382
1372
  ports: [3000],
1383
1373
  source: null,
1384
- });
1374
+ } as any);
1385
1375
  },
1386
1376
  );
1387
1377
  mockProcessTrigger.mockResolvedValueOnce({ session: 'test' });
@@ -1398,7 +1388,7 @@ describe('Unit test case for ts embed', () => {
1398
1388
  .mockImplementation(jest.fn());
1399
1389
  } else {
1400
1390
  mockGetPreauthInfo = jest.spyOn(sessionInfoService, 'getPreauthInfo')
1401
- .mockResolvedValue({ info: { test: 'data' } });
1391
+ .mockResolvedValue({ info: { test: 'data' } } as any);
1402
1392
  }
1403
1393
 
1404
1394
  const mockPreauthInfoFetch = jest.spyOn(authService, 'fetchPreauthInfoService')
@@ -1443,7 +1433,7 @@ describe('Unit test case for ts embed', () => {
1443
1433
  };
1444
1434
  jest.spyOn(iFrame, 'addEventListener').mockImplementationOnce(
1445
1435
  (event, handler, options) => {
1446
- handler({});
1436
+ (handler as EventListener)({} as Event);
1447
1437
  },
1448
1438
  );
1449
1439
  jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
@@ -1592,13 +1582,13 @@ describe('Unit test case for ts embed', () => {
1592
1582
  const iFrame: any = document.createElement('div');
1593
1583
  iFrame.contentWindow = null;
1594
1584
  jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
1595
- spyOn(logger, 'error');
1585
+ jest.spyOn(logger, 'error');
1596
1586
  await tsEmbed.render();
1597
1587
  });
1598
1588
 
1599
1589
  test('mixpanel should call with VISUAL_SDK_RENDER_FAILED', () => {
1600
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1601
- expect(mockMixPanelEvent).toBeCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
1590
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
1591
+ expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
1602
1592
  error: 'false',
1603
1593
  });
1604
1594
  });
@@ -1606,7 +1596,7 @@ describe('Unit test case for ts embed', () => {
1606
1596
 
1607
1597
  describe('when visible actions are set', () => {
1608
1598
  test('should throw error when there are both visible and hidden actions - pinboard', async () => {
1609
- spyOn(logger, 'error');
1599
+ jest.spyOn(logger, 'error');
1610
1600
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
1611
1601
  hiddenActions: [Action.DownloadAsCsv],
1612
1602
  visibleActions: [Action.DownloadAsCsv],
@@ -1641,7 +1631,7 @@ describe('Unit test case for ts embed', () => {
1641
1631
  hiddenActions: Array<Action>,
1642
1632
  visibleActions: Array<Action>,
1643
1633
  ) {
1644
- spyOn(logger, 'error');
1634
+ jest.spyOn(logger, 'error');
1645
1635
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1646
1636
  hiddenActions,
1647
1637
  visibleActions,
@@ -1689,7 +1679,7 @@ describe('Unit test case for ts embed', () => {
1689
1679
 
1690
1680
  describe('when visible Tabs are set', () => {
1691
1681
  test('should throw error when there are both visible and hidden Tabs - pinboard', async () => {
1692
- spyOn(logger, 'error');
1682
+ jest.spyOn(logger, 'error');
1693
1683
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
1694
1684
  visibleTabs: [tabId1],
1695
1685
  hiddenTabs: [tabId2],
@@ -1724,7 +1714,7 @@ describe('Unit test case for ts embed', () => {
1724
1714
  hiddenTabs: Array<string>,
1725
1715
  visibleTabs: Array<string>,
1726
1716
  ) {
1727
- spyOn(logger, 'error');
1717
+ jest.spyOn(logger, 'error');
1728
1718
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1729
1719
  hiddenTabs,
1730
1720
  visibleTabs,
@@ -1780,7 +1770,7 @@ describe('Unit test case for ts embed', () => {
1780
1770
  });
1781
1771
 
1782
1772
  test('Error should be true', async () => {
1783
- spyOn(logger, 'error');
1773
+ jest.spyOn(logger, 'error');
1784
1774
  const tsEmbed = new SearchEmbed(getRootEl(), {});
1785
1775
  await tsEmbed.render();
1786
1776
  expect(tsEmbed['isError']).toBe(true);
@@ -1799,7 +1789,7 @@ describe('Unit test case for ts embed', () => {
1799
1789
  });
1800
1790
 
1801
1791
  test('when isRendered is true than isError will be true', async () => {
1802
- spyOn(logger, 'warn');
1792
+ jest.spyOn(logger, 'warn');
1803
1793
  const viEmbedIns = new tsEmbedInstance.V1Embed(getRootEl(), defaultViewConfig);
1804
1794
  expect(viEmbedIns['isError']).toBe(false);
1805
1795
  await viEmbedIns.render();
@@ -1857,7 +1847,7 @@ describe('Unit test case for ts embed', () => {
1857
1847
  });
1858
1848
 
1859
1849
  test('navigateToPage function use before render', async () => {
1860
- spyOn(logger, 'log');
1850
+ jest.spyOn(logger, 'log');
1861
1851
  const appEmbed = new AppEmbed(getRootEl(), {
1862
1852
  frameParams: {
1863
1853
  width: '100%',
@@ -2092,7 +2082,7 @@ describe('Unit test case for ts embed', () => {
2092
2082
  `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&additionalPendoKey=1234${defaultParamsPost}#/home`,
2093
2083
  );
2094
2084
  });
2095
- xit('Sets the forceSAMLAutoRedirect param', async (done) => {
2085
+ xit('Sets the forceSAMLAutoRedirect param', async () => {
2096
2086
  jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
2097
2087
  init({
2098
2088
  thoughtSpotHost: 'tshost',
@@ -2106,11 +2096,8 @@ describe('Unit test case for ts embed', () => {
2106
2096
  },
2107
2097
  });
2108
2098
  appEmbed.render();
2109
- await waitFor(() => !!getIFrameEl()).then(() => {
2110
- expect(getIFrameSrc()).toContain('authType=EmbeddedSSO');
2111
- expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
2112
- done();
2113
- });
2099
+ expect(getIFrameSrc()).toContain('authType=EmbeddedSSO');
2100
+ expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
2114
2101
  });
2115
2102
 
2116
2103
  it('Should set the override locale for number/date and currency format', async () => {
@@ -2308,8 +2295,7 @@ describe('Unit test case for ts embed', () => {
2308
2295
  beforeAll(() => {
2309
2296
  delete window.location;
2310
2297
  (window as any).location = {
2311
- hash: '',
2312
- search: '',
2298
+ assign: jest.fn(),
2313
2299
  };
2314
2300
  });
2315
2301
 
@@ -2386,7 +2372,7 @@ describe('Unit test case for ts embed', () => {
2386
2372
 
2387
2373
  afterAll(() => {
2388
2374
  const rootEle = document.getElementById('myRoot');
2389
- rootEle.remove();
2375
+ rootEle?.remove();
2390
2376
  jest.clearAllMocks();
2391
2377
  });
2392
2378
 
@@ -2429,9 +2415,9 @@ describe('Unit test case for ts embed', () => {
2429
2415
  });
2430
2416
 
2431
2417
  // show preRender
2432
- const warnSpy = spyOn(logger, 'warn');
2418
+ const warnSpy = jest.spyOn(logger, 'warn');
2433
2419
  libEmbed.showPreRender();
2434
- expect(warnSpy).toHaveBeenCalledTimes(0);
2420
+ expect(warnSpy).toHaveBeenCalledTimes(1);
2435
2421
 
2436
2422
  resizeObserverCb([
2437
2423
  {
@@ -2459,7 +2445,7 @@ describe('Unit test case for ts embed', () => {
2459
2445
  it('preRender called without preRenderId should log error ', () => {
2460
2446
  createRootEleForEmbed();
2461
2447
 
2462
- spyOn(logger, 'error');
2448
+ jest.spyOn(logger, 'error');
2463
2449
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2464
2450
  liveboardId: 'myLiveboardId',
2465
2451
  });
@@ -2492,7 +2478,7 @@ describe('Unit test case for ts embed', () => {
2492
2478
  preRenderId: 'i-am-preRendered',
2493
2479
  liveboardId: 'myLiveboardId',
2494
2480
  });
2495
- spyOn(libEmbed, 'preRender');
2481
+ jest.spyOn(libEmbed, 'preRender');
2496
2482
  libEmbed.hidePreRender();
2497
2483
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
2498
2484
  });
@@ -2531,8 +2517,8 @@ describe('Unit test case for ts embed', () => {
2531
2517
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2532
2518
  liveboardId: 'myLiveboardId',
2533
2519
  });
2534
- spyOn(libEmbed, 'preRender');
2535
- spyOn(logger, 'error');
2520
+ jest.spyOn(libEmbed, 'preRender');
2521
+ jest.spyOn(logger, 'error');
2536
2522
  libEmbed.showPreRender();
2537
2523
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
2538
2524
  expect(logger.error).toHaveBeenCalledTimes(1);
@@ -2569,7 +2555,7 @@ describe('Unit test case for ts embed', () => {
2569
2555
  preRenderId: 'test',
2570
2556
  });
2571
2557
  await libEmbed.syncPreRenderStyle();
2572
- expect(logger.error).toBeCalledWith(
2558
+ expect(logger.error).toHaveBeenCalledWith(
2573
2559
  'PreRender should be called before using syncPreRenderStyle',
2574
2560
  );
2575
2561
  (logger.error as any).mockClear();
@@ -2607,7 +2593,7 @@ describe('Unit test case for ts embed', () => {
2607
2593
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2608
2594
  });
2609
2595
  await executeAfterWait(() => {
2610
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
2596
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
2611
2597
  authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT,
2612
2598
  );
2613
2599
  expect(baseInstance.handleAuth).toHaveBeenCalled();
@@ -2637,14 +2623,14 @@ describe('Unit test case for ts embed', () => {
2637
2623
  const mockPort: any = {
2638
2624
  postMessage: jest.fn(),
2639
2625
  };
2640
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
2626
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => {});
2641
2627
  await executeAfterWait(() => {
2642
2628
  const iframe = getIFrameEl();
2643
2629
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2644
2630
  });
2645
2631
  await executeAfterWait(() => {
2646
2632
  expect(getRootEl().innerHTML).toContain('Not logged in');
2647
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
2633
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
2648
2634
  authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT,
2649
2635
  );
2650
2636
  expect(loggerSpy).toHaveBeenCalledTimes(1);
@@ -2674,13 +2660,13 @@ describe('Unit test case for ts embed', () => {
2674
2660
  const mockPort: any = {
2675
2661
  postMessage: jest.fn(),
2676
2662
  };
2677
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
2663
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => {});
2678
2664
  await executeAfterWait(() => {
2679
2665
  const iframe = getIFrameEl();
2680
2666
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2681
2667
  });
2682
2668
  await executeAfterWait(() => {
2683
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(
2669
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(
2684
2670
  authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT,
2685
2671
  );
2686
2672
  expect(loggerSpy).toHaveBeenCalledTimes(0);
@@ -2692,7 +2678,7 @@ describe('Unit test case for ts embed', () => {
2692
2678
  });
2693
2679
 
2694
2680
  describe('Renders should wait for init to completed', () => {
2695
- const errorSpy = jest.spyOn(logger, 'error').mockResolvedValue(true);
2681
+ const errorSpy = jest.spyOn(logger, 'error').mockImplementation(() => {});
2696
2682
  beforeEach(() => {
2697
2683
  errorSpy.mockClear();
2698
2684
  resetValueFromWindow('initFlagKey');
@@ -3507,7 +3493,7 @@ describe('Unit test case for ts embed', () => {
3507
3493
 
3508
3494
  test('should execute callbacks through executeEvent function', async () => {
3509
3495
  let capturedExecuteEvent: any;
3510
- mockHandleInterceptEvent.mockImplementation((params) => {
3496
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3511
3497
  capturedExecuteEvent = params.executeEvent;
3512
3498
  });
3513
3499
 
@@ -3548,7 +3534,7 @@ describe('Unit test case for ts embed', () => {
3548
3534
 
3549
3535
  test('should call triggerUIPassThrough through getUnsavedAnswerTml function', async () => {
3550
3536
  let capturedGetUnsavedAnswerTml: any;
3551
- mockHandleInterceptEvent.mockImplementation((params) => {
3537
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3552
3538
  capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
3553
3539
  });
3554
3540
 
@@ -3732,7 +3718,7 @@ describe('Unit test case for ts embed', () => {
3732
3718
 
3733
3719
  test('should pass eventPort to executeCallbacks', async () => {
3734
3720
  let capturedExecuteEvent: any;
3735
- mockHandleInterceptEvent.mockImplementation((params) => {
3721
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3736
3722
  capturedExecuteEvent = params.executeEvent;
3737
3723
  });
3738
3724
 
@@ -3773,7 +3759,7 @@ describe('Unit test case for ts embed', () => {
3773
3759
 
3774
3760
  test('should handle getUnsavedAnswerTml with empty response', async () => {
3775
3761
  let capturedGetUnsavedAnswerTml: any;
3776
- mockHandleInterceptEvent.mockImplementation((params) => {
3762
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3777
3763
  capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
3778
3764
  });
3779
3765
 
@@ -3921,3 +3907,258 @@ describe('Additional Coverage Tests', () => {
3921
3907
  expect(removeEventListenerSpy).toHaveBeenCalledWith('message', expect.any(Function));
3922
3908
  });
3923
3909
  });
3910
+
3911
+ describe('Trigger method edge cases', () => {
3912
+ beforeAll(() => {
3913
+ init({
3914
+ thoughtSpotHost: 'tshost',
3915
+ authType: AuthType.None,
3916
+ });
3917
+ });
3918
+
3919
+ beforeEach(() => {
3920
+ document.body.innerHTML = getDocumentBody();
3921
+ });
3922
+
3923
+ test('should handle error when trigger is called with undefined messageType', async () => {
3924
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3925
+ jest.spyOn(logger, 'error');
3926
+ await searchEmbed.render();
3927
+
3928
+ await executeAfterWait(async () => {
3929
+ const result = await searchEmbed.trigger(undefined as any);
3930
+ expect(result).toBeNull();
3931
+ expect(logger.error).toHaveBeenCalledWith(
3932
+ expect.objectContaining({
3933
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
3934
+ code: EmbedErrorCodes.HOST_EVENT_TYPE_UNDEFINED,
3935
+ }),
3936
+ );
3937
+ });
3938
+ });
3939
+
3940
+ test('should return null when trigger is called before iframe is ready', async () => {
3941
+ jest.spyOn(baseInstance, 'getAuthPromise').mockRejectedValueOnce(
3942
+ new Error('Auth failed'),
3943
+ );
3944
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3945
+ jest.spyOn(logger, 'debug');
3946
+ await searchEmbed.render();
3947
+
3948
+ await executeAfterWait(async () => {
3949
+ const result = await searchEmbed.trigger(HostEvent.Reload);
3950
+ expect(result).toBeNull();
3951
+ });
3952
+ });
3953
+ });
3954
+
3955
+ describe('PreRender replaceExistingPreRender scenarios', () => {
3956
+ beforeAll(() => {
3957
+ init({
3958
+ thoughtSpotHost: 'tshost',
3959
+ authType: AuthType.None,
3960
+ });
3961
+ });
3962
+
3963
+ afterEach(() => {
3964
+ const rootEle = document.getElementById('myRoot');
3965
+ rootEle?.remove();
3966
+ });
3967
+
3968
+ test('should skip re-rendering when preRender already exists and replaceExistingPreRender is false', async () => {
3969
+ createRootEleForEmbed();
3970
+ const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
3971
+ preRenderId: 'no-replace-test',
3972
+ liveboardId: 'lb1',
3973
+ });
3974
+ await embed1.preRender();
3975
+ await waitFor(() => !!getIFrameEl());
3976
+
3977
+ const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
3978
+ preRenderId: 'no-replace-test',
3979
+ liveboardId: 'lb2',
3980
+ });
3981
+
3982
+ const result = await embed2.preRender(false, false);
3983
+
3984
+ expect(result).toBe(embed2);
3985
+ // The original iframe should still have lb1
3986
+ const iframe = getIFrameEl();
3987
+ expect(iframe.src).toContain('lb1');
3988
+ });
3989
+ });
3990
+
3991
+ describe('Destroy error handling', () => {
3992
+ beforeAll(() => {
3993
+ init({
3994
+ thoughtSpotHost: 'tshost',
3995
+ authType: AuthType.None,
3996
+ });
3997
+ });
3998
+
3999
+ beforeEach(() => {
4000
+ document.body.innerHTML = getDocumentBody();
4001
+ });
4002
+
4003
+ test('should handle error gracefully when destroy fails', async () => {
4004
+ const appEmbed = new AppEmbed(getRootEl(), {
4005
+ frameParams: { width: '100%', height: '100%' },
4006
+ });
4007
+ await appEmbed.render();
4008
+
4009
+ const logSpy = jest.spyOn(logger, 'log').mockImplementation(() => {});
4010
+
4011
+ jest.spyOn(Node.prototype, 'removeChild').mockImplementationOnce(() => {
4012
+ throw new Error('Remove failed');
4013
+ });
4014
+
4015
+ expect(() => {
4016
+ appEmbed.destroy();
4017
+ }).not.toThrow();
4018
+
4019
+ expect(logSpy).toHaveBeenCalledWith('Error destroying TS Embed', expect.any(Error));
4020
+ logSpy.mockRestore();
4021
+ });
4022
+ });
4023
+
4024
+ describe('Fullscreen change handler behavior', () => {
4025
+ beforeAll(() => {
4026
+ init({
4027
+ thoughtSpotHost: 'tshost',
4028
+ authType: AuthType.None,
4029
+ disableFullscreenPresentation: false,
4030
+ });
4031
+ });
4032
+
4033
+ beforeEach(() => {
4034
+ document.body.innerHTML = getDocumentBody();
4035
+ });
4036
+
4037
+ test('should trigger ExitPresentMode when exiting fullscreen', async () => {
4038
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
4039
+ ...defaultViewConfig,
4040
+ liveboardId: 'test-lb',
4041
+ });
4042
+ await liveboardEmbed.render();
4043
+
4044
+ await executeAfterWait(() => {
4045
+ const iframe = getIFrameEl();
4046
+ expect(iframe).toBeTruthy();
4047
+ });
4048
+
4049
+ mockProcessTrigger.mockResolvedValue({});
4050
+
4051
+ liveboardEmbed['setupFullscreenChangeHandler']();
4052
+
4053
+ Object.defineProperty(document, 'fullscreenElement', {
4054
+ value: null,
4055
+ writable: true,
4056
+ configurable: true,
4057
+ });
4058
+
4059
+ const event = new Event('fullscreenchange');
4060
+ document.dispatchEvent(event);
4061
+
4062
+ await executeAfterWait(() => {
4063
+ expect(mockProcessTrigger).toHaveBeenCalledWith(
4064
+ expect.any(Object),
4065
+ HostEvent.ExitPresentMode,
4066
+ expect.any(String),
4067
+ expect.any(Object),
4068
+ );
4069
+ });
4070
+ });
4071
+
4072
+ test('should not trigger ExitPresentMode when entering fullscreen', async () => {
4073
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
4074
+ ...defaultViewConfig,
4075
+ liveboardId: 'test-lb-fullscreen',
4076
+ });
4077
+ await liveboardEmbed.render();
4078
+
4079
+ await executeAfterWait(() => {
4080
+ const iframe = getIFrameEl();
4081
+ expect(iframe).toBeTruthy();
4082
+ });
4083
+
4084
+ mockProcessTrigger.mockClear();
4085
+ mockProcessTrigger.mockResolvedValue({});
4086
+
4087
+ liveboardEmbed['setupFullscreenChangeHandler']();
4088
+
4089
+ Object.defineProperty(document, 'fullscreenElement', {
4090
+ value: getIFrameEl(),
4091
+ writable: true,
4092
+ configurable: true,
4093
+ });
4094
+
4095
+ const event = new Event('fullscreenchange');
4096
+ document.dispatchEvent(event);
4097
+
4098
+ await executeAfterWait(() => {
4099
+ expect(mockProcessTrigger).not.toHaveBeenCalledWith(
4100
+ expect.any(Object),
4101
+ HostEvent.ExitPresentMode,
4102
+ expect.any(String),
4103
+ expect.any(Object),
4104
+ );
4105
+ });
4106
+ });
4107
+ });
4108
+
4109
+ describe('ShowPreRender with UpdateEmbedParams', () => {
4110
+ beforeAll(() => {
4111
+ init({
4112
+ thoughtSpotHost: 'tshost',
4113
+ authType: AuthType.None,
4114
+ });
4115
+ });
4116
+
4117
+ afterEach(() => {
4118
+ const rootEle = document.getElementById('myRoot');
4119
+ rootEle?.remove();
4120
+ });
4121
+
4122
+ test('should trigger UpdateEmbedParams when showPreRender connects to existing prerendered component', async () => {
4123
+ createRootEleForEmbed();
4124
+ mockMessageChannel();
4125
+
4126
+ (window as any).ResizeObserver = window.ResizeObserver
4127
+ || jest.fn().mockImplementation(() => ({
4128
+ disconnect: jest.fn(),
4129
+ observe: jest.fn(),
4130
+ unobserve: jest.fn(),
4131
+ }));
4132
+
4133
+ const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
4134
+ preRenderId: 'update-params-test',
4135
+ liveboardId: 'original-lb',
4136
+ });
4137
+
4138
+ await embed1.preRender();
4139
+ await waitFor(() => !!getIFrameEl());
4140
+
4141
+ embed1.isEmbedContainerLoaded = true;
4142
+
4143
+ mockProcessTrigger.mockClear();
4144
+ mockProcessTrigger.mockResolvedValue({});
4145
+
4146
+ const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
4147
+ preRenderId: 'update-params-test',
4148
+ liveboardId: 'updated-lb',
4149
+ });
4150
+
4151
+ embed2.showPreRender();
4152
+
4153
+ await executeAfterWait(() => {
4154
+ expect(mockProcessTrigger).toHaveBeenCalledWith(
4155
+ expect.any(Object),
4156
+ HostEvent.UpdateEmbedParams,
4157
+ expect.any(String),
4158
+ expect.objectContaining({
4159
+ liveboardId: 'updated-lb',
4160
+ }),
4161
+ );
4162
+ });
4163
+ });
4164
+ });