@thoughtspot/visual-embed-sdk 1.44.1 → 1.44.3

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 (246) hide show
  1. package/cjs/package.json +6 -5
  2. package/cjs/src/api-intercept.d.ts.map +1 -1
  3. package/cjs/src/api-intercept.js +8 -3
  4. package/cjs/src/api-intercept.js.map +1 -1
  5. package/cjs/src/api-intercept.spec.js +19 -3
  6. package/cjs/src/api-intercept.spec.js.map +1 -1
  7. package/cjs/src/auth.spec.js +43 -42
  8. package/cjs/src/auth.spec.js.map +1 -1
  9. package/cjs/src/authToken.spec.js +3 -3
  10. package/cjs/src/authToken.spec.js.map +1 -1
  11. package/cjs/src/embed/app.d.ts +17 -0
  12. package/cjs/src/embed/app.d.ts.map +1 -1
  13. package/cjs/src/embed/app.js +9 -5
  14. package/cjs/src/embed/app.js.map +1 -1
  15. package/cjs/src/embed/app.spec.js +96 -6
  16. package/cjs/src/embed/app.spec.js.map +1 -1
  17. package/cjs/src/embed/base.d.ts +1 -1
  18. package/cjs/src/embed/base.d.ts.map +1 -1
  19. package/cjs/src/embed/base.js +4 -0
  20. package/cjs/src/embed/base.js.map +1 -1
  21. package/cjs/src/embed/base.spec.js +71 -15
  22. package/cjs/src/embed/base.spec.js.map +1 -1
  23. package/cjs/src/embed/bodyless-conversation.spec.js +2 -2
  24. package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
  25. package/cjs/src/embed/conversation.d.ts.map +1 -1
  26. package/cjs/src/embed/conversation.js +6 -1
  27. package/cjs/src/embed/conversation.js.map +1 -1
  28. package/cjs/src/embed/conversation.spec.js +8 -3
  29. package/cjs/src/embed/conversation.spec.js.map +1 -1
  30. package/cjs/src/embed/embed.spec.js +101 -2
  31. package/cjs/src/embed/embed.spec.js.map +1 -1
  32. package/cjs/src/embed/events.spec.js +2 -2
  33. package/cjs/src/embed/events.spec.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +1 -1
  35. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  36. package/cjs/src/embed/liveboard.d.ts +18 -0
  37. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  38. package/cjs/src/embed/liveboard.js +13 -6
  39. package/cjs/src/embed/liveboard.js.map +1 -1
  40. package/cjs/src/embed/liveboard.spec.js +114 -26
  41. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  42. package/cjs/src/embed/pinboard.spec.js +1 -1
  43. package/cjs/src/embed/pinboard.spec.js.map +1 -1
  44. package/cjs/src/embed/sage.spec.js +2 -2
  45. package/cjs/src/embed/sage.spec.js.map +1 -1
  46. package/cjs/src/embed/search.spec.js +118 -2
  47. package/cjs/src/embed/search.spec.js.map +1 -1
  48. package/cjs/src/embed/ts-embed-trigger.spec.js +2 -3
  49. package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -1
  50. package/cjs/src/embed/ts-embed.d.ts +3 -2
  51. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  52. package/cjs/src/embed/ts-embed.js +51 -17
  53. package/cjs/src/embed/ts-embed.js.map +1 -1
  54. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  55. package/cjs/src/embed/ts-embed.spec.js +335 -71
  56. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  57. package/cjs/src/errors.d.ts +8 -0
  58. package/cjs/src/errors.d.ts.map +1 -1
  59. package/cjs/src/errors.js +8 -0
  60. package/cjs/src/errors.js.map +1 -1
  61. package/cjs/src/mixpanel-service.spec.js +1 -1
  62. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  63. package/cjs/src/react/index.spec.js +3 -4
  64. package/cjs/src/react/index.spec.js.map +1 -1
  65. package/cjs/src/test/test-utils.js +1 -1
  66. package/cjs/src/test/test-utils.js.map +1 -1
  67. package/cjs/src/types.d.ts +194 -1
  68. package/cjs/src/types.d.ts.map +1 -1
  69. package/cjs/src/types.js +94 -2
  70. package/cjs/src/types.js.map +1 -1
  71. package/cjs/src/utils/authService/authService.spec.js +8 -8
  72. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  73. package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  74. package/cjs/src/utils/graphql/answerService/answerService.spec.js +1 -1
  75. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  76. package/cjs/src/utils/graphql/graphql-request.spec.js +1 -1
  77. package/cjs/src/utils/graphql/graphql-request.spec.js.map +1 -1
  78. package/cjs/src/utils/graphql/sourceService.spec.js +1 -1
  79. package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -1
  80. package/cjs/src/utils/logger.spec.d.ts +5 -20
  81. package/cjs/src/utils/logger.spec.d.ts.map +1 -1
  82. package/cjs/src/utils/processData.spec.js +17 -17
  83. package/cjs/src/utils/processData.spec.js.map +1 -1
  84. package/cjs/src/utils/processTrigger.spec.js +8 -8
  85. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  86. package/cjs/src/utils.d.ts +16 -3
  87. package/cjs/src/utils.d.ts.map +1 -1
  88. package/cjs/src/utils.js +60 -5
  89. package/cjs/src/utils.js.map +1 -1
  90. package/cjs/src/utils.spec.js +72 -10
  91. package/cjs/src/utils.spec.js.map +1 -1
  92. package/dist/{index-BE9gGzRX.js → index-D0n5LIka.js} +1 -1
  93. package/dist/src/api-intercept.d.ts.map +1 -1
  94. package/dist/src/embed/app.d.ts +17 -0
  95. package/dist/src/embed/app.d.ts.map +1 -1
  96. package/dist/src/embed/base.d.ts +1 -1
  97. package/dist/src/embed/base.d.ts.map +1 -1
  98. package/dist/src/embed/conversation.d.ts.map +1 -1
  99. package/dist/src/embed/liveboard.d.ts +18 -0
  100. package/dist/src/embed/liveboard.d.ts.map +1 -1
  101. package/dist/src/embed/ts-embed.d.ts +3 -2
  102. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  103. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  104. package/dist/src/errors.d.ts +8 -0
  105. package/dist/src/errors.d.ts.map +1 -1
  106. package/dist/src/types.d.ts +194 -1
  107. package/dist/src/types.d.ts.map +1 -1
  108. package/dist/src/utils/logger.spec.d.ts +5 -20
  109. package/dist/src/utils/logger.spec.d.ts.map +1 -1
  110. package/dist/src/utils.d.ts +16 -3
  111. package/dist/src/utils.d.ts.map +1 -1
  112. package/dist/tsembed-react.es.js +282 -74
  113. package/dist/tsembed-react.js +281 -73
  114. package/dist/tsembed.es.js +282 -74
  115. package/dist/tsembed.js +281 -73
  116. package/dist/visual-embed-sdk-react-full.d.ts +185 -3
  117. package/dist/visual-embed-sdk-react.d.ts +184 -2
  118. package/dist/visual-embed-sdk.d.ts +185 -3
  119. package/lib/package.json +6 -5
  120. package/lib/src/api-intercept.d.ts.map +1 -1
  121. package/lib/src/api-intercept.js +9 -4
  122. package/lib/src/api-intercept.js.map +1 -1
  123. package/lib/src/api-intercept.spec.js +20 -4
  124. package/lib/src/api-intercept.spec.js.map +1 -1
  125. package/lib/src/auth.spec.js +43 -42
  126. package/lib/src/auth.spec.js.map +1 -1
  127. package/lib/src/authToken.spec.js +3 -3
  128. package/lib/src/authToken.spec.js.map +1 -1
  129. package/lib/src/embed/app.d.ts +17 -0
  130. package/lib/src/embed/app.d.ts.map +1 -1
  131. package/lib/src/embed/app.js +10 -6
  132. package/lib/src/embed/app.js.map +1 -1
  133. package/lib/src/embed/app.spec.js +96 -6
  134. package/lib/src/embed/app.spec.js.map +1 -1
  135. package/lib/src/embed/base.d.ts +1 -1
  136. package/lib/src/embed/base.d.ts.map +1 -1
  137. package/lib/src/embed/base.js +5 -1
  138. package/lib/src/embed/base.js.map +1 -1
  139. package/lib/src/embed/base.spec.js +72 -16
  140. package/lib/src/embed/base.spec.js.map +1 -1
  141. package/lib/src/embed/bodyless-conversation.spec.js +2 -2
  142. package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
  143. package/lib/src/embed/conversation.d.ts.map +1 -1
  144. package/lib/src/embed/conversation.js +7 -2
  145. package/lib/src/embed/conversation.js.map +1 -1
  146. package/lib/src/embed/conversation.spec.js +9 -4
  147. package/lib/src/embed/conversation.spec.js.map +1 -1
  148. package/lib/src/embed/embed.spec.js +103 -4
  149. package/lib/src/embed/embed.spec.js.map +1 -1
  150. package/lib/src/embed/events.spec.js +2 -2
  151. package/lib/src/embed/events.spec.js.map +1 -1
  152. package/lib/src/embed/hostEventClient/host-event-client.spec.js +2 -2
  153. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  154. package/lib/src/embed/liveboard.d.ts +18 -0
  155. package/lib/src/embed/liveboard.d.ts.map +1 -1
  156. package/lib/src/embed/liveboard.js +15 -8
  157. package/lib/src/embed/liveboard.js.map +1 -1
  158. package/lib/src/embed/liveboard.spec.js +114 -26
  159. package/lib/src/embed/liveboard.spec.js.map +1 -1
  160. package/lib/src/embed/pinboard.spec.js +1 -1
  161. package/lib/src/embed/pinboard.spec.js.map +1 -1
  162. package/lib/src/embed/sage.spec.js +2 -2
  163. package/lib/src/embed/sage.spec.js.map +1 -1
  164. package/lib/src/embed/search.spec.js +118 -2
  165. package/lib/src/embed/search.spec.js.map +1 -1
  166. package/lib/src/embed/ts-embed-trigger.spec.js +2 -3
  167. package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -1
  168. package/lib/src/embed/ts-embed.d.ts +3 -2
  169. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  170. package/lib/src/embed/ts-embed.js +52 -18
  171. package/lib/src/embed/ts-embed.js.map +1 -1
  172. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  173. package/lib/src/embed/ts-embed.spec.js +336 -72
  174. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  175. package/lib/src/errors.d.ts +8 -0
  176. package/lib/src/errors.d.ts.map +1 -1
  177. package/lib/src/errors.js +8 -0
  178. package/lib/src/errors.js.map +1 -1
  179. package/lib/src/mixpanel-service.spec.js +1 -1
  180. package/lib/src/mixpanel-service.spec.js.map +1 -1
  181. package/lib/src/react/index.spec.js +3 -4
  182. package/lib/src/react/index.spec.js.map +1 -1
  183. package/lib/src/test/test-utils.js +1 -1
  184. package/lib/src/test/test-utils.js.map +1 -1
  185. package/lib/src/types.d.ts +194 -1
  186. package/lib/src/types.d.ts.map +1 -1
  187. package/lib/src/types.js +93 -1
  188. package/lib/src/types.js.map +1 -1
  189. package/lib/src/utils/authService/authService.spec.js +8 -8
  190. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  191. package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  192. package/lib/src/utils/graphql/answerService/answerService.spec.js +1 -1
  193. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  194. package/lib/src/utils/graphql/graphql-request.spec.js +1 -1
  195. package/lib/src/utils/graphql/graphql-request.spec.js.map +1 -1
  196. package/lib/src/utils/graphql/sourceService.spec.js +1 -1
  197. package/lib/src/utils/graphql/sourceService.spec.js.map +1 -1
  198. package/lib/src/utils/logger.spec.d.ts +5 -20
  199. package/lib/src/utils/logger.spec.d.ts.map +1 -1
  200. package/lib/src/utils/processData.spec.js +17 -17
  201. package/lib/src/utils/processData.spec.js.map +1 -1
  202. package/lib/src/utils/processTrigger.spec.js +8 -8
  203. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  204. package/lib/src/utils.d.ts +16 -3
  205. package/lib/src/utils.d.ts.map +1 -1
  206. package/lib/src/utils.js +57 -4
  207. package/lib/src/utils.js.map +1 -1
  208. package/lib/src/utils.spec.js +73 -11
  209. package/lib/src/utils.spec.js.map +1 -1
  210. package/package.json +6 -5
  211. package/src/api-intercept.spec.ts +23 -10
  212. package/src/api-intercept.ts +9 -4
  213. package/src/auth.spec.ts +53 -51
  214. package/src/authToken.spec.ts +3 -3
  215. package/src/embed/app.spec.ts +128 -7
  216. package/src/embed/app.ts +30 -4
  217. package/src/embed/base.spec.ts +95 -21
  218. package/src/embed/base.ts +5 -2
  219. package/src/embed/bodyless-conversation.spec.ts +2 -2
  220. package/src/embed/conversation.spec.ts +9 -4
  221. package/src/embed/conversation.ts +7 -2
  222. package/src/embed/embed.spec.ts +122 -2
  223. package/src/embed/events.spec.ts +2 -2
  224. package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
  225. package/src/embed/liveboard.spec.ts +137 -29
  226. package/src/embed/liveboard.ts +36 -6
  227. package/src/embed/pinboard.spec.ts +1 -1
  228. package/src/embed/sage.spec.ts +2 -2
  229. package/src/embed/search.spec.ts +133 -2
  230. package/src/embed/ts-embed-trigger.spec.ts +2 -3
  231. package/src/embed/ts-embed.spec.ts +424 -91
  232. package/src/embed/ts-embed.ts +56 -19
  233. package/src/errors.ts +8 -0
  234. package/src/mixpanel-service.spec.ts +1 -1
  235. package/src/react/index.spec.tsx +4 -5
  236. package/src/test/test-utils.ts +2 -2
  237. package/src/types.ts +206 -1
  238. package/src/utils/authService/authService.spec.ts +17 -17
  239. package/src/utils/authService/tokenizedAuthService.spec.ts +4 -4
  240. package/src/utils/graphql/answerService/answerService.spec.ts +3 -3
  241. package/src/utils/graphql/graphql-request.spec.ts +2 -2
  242. package/src/utils/graphql/sourceService.spec.ts +1 -1
  243. package/src/utils/processData.spec.ts +26 -26
  244. package/src/utils/processTrigger.spec.ts +8 -8
  245. package/src/utils.spec.ts +100 -11
  246. package/src/utils.ts +59 -7
@@ -2,7 +2,7 @@ import { resetValueFromWindow } from '../utils';
2
2
  import { ERROR_MESSAGE } from '../errors';
3
3
  import { resetCachedAuthToken } from '../authToken';
4
4
  import { AuthType, init, EmbedEvent, SearchEmbed, PinboardEmbed, AppEmbed, LiveboardEmbed, SageEmbed, AnswerService, } from '../index';
5
- import { Action, HomeLeftNavItem, RuntimeFilterOp, HomepageModule, HostEvent, ContextMenuTriggerOptions, CustomActionTarget, CustomActionsPosition, } from '../types';
5
+ import { Action, HomeLeftNavItem, RuntimeFilterOp, HomepageModule, HostEvent, ContextMenuTriggerOptions, CustomActionTarget, CustomActionsPosition, ErrorDetailsTypes, EmbedErrorCodes, } from '../types';
6
6
  import { executeAfterWait, getDocumentBody, getIFrameEl, getIFrameSrc, getRootEl, postMessageToParent, defaultParamsForPinboardEmbed, waitFor, expectUrlMatchesWithParams, expectUrlToHaveParamsWithValues, mockMessageChannel, createRootEleForEmbed, expectUrlMatch, fixedEncodeURI, } from '../test/test-utils';
7
7
  import * as config from '../config';
8
8
  import * as embedConfig from './embedConfig';
@@ -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],
@@ -1330,7 +1320,12 @@ describe('Unit test case for ts embed', () => {
1330
1320
  });
1331
1321
  await pinboardEmbed.render();
1332
1322
  expect(pinboardEmbed['isError']).toBe(true);
1333
- expect(logger.error).toHaveBeenCalledWith('You cannot have both hidden actions and visible actions');
1323
+ expect(logger.error).toHaveBeenCalledWith({
1324
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
1325
+ message: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
1326
+ code: EmbedErrorCodes.CONFLICTING_ACTIONS_CONFIG,
1327
+ error: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
1328
+ });
1334
1329
  });
1335
1330
  test('should not throw error when there are only visible or hidden actions - pinboard', async () => {
1336
1331
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
@@ -1347,7 +1342,7 @@ describe('Unit test case for ts embed', () => {
1347
1342
  * @param visibleActions
1348
1343
  */
1349
1344
  async function testActionsForLiveboards(hiddenActions, visibleActions) {
1350
- spyOn(logger, 'error');
1345
+ jest.spyOn(logger, 'error');
1351
1346
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1352
1347
  hiddenActions,
1353
1348
  visibleActions,
@@ -1356,7 +1351,12 @@ describe('Unit test case for ts embed', () => {
1356
1351
  });
1357
1352
  await liveboardEmbed.render();
1358
1353
  expect(liveboardEmbed['isError']).toBe(true);
1359
- expect(logger.error).toHaveBeenCalledWith('You cannot have both hidden actions and visible actions');
1354
+ expect(logger.error).toHaveBeenCalledWith({
1355
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
1356
+ message: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
1357
+ code: EmbedErrorCodes.CONFLICTING_ACTIONS_CONFIG,
1358
+ error: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
1359
+ });
1360
1360
  }
1361
1361
  test('should throw error when there are both visible and hidden action arrays', async () => {
1362
1362
  await testActionsForLiveboards([Action.DownloadAsCsv], [Action.DownloadAsCsv]);
@@ -1388,7 +1388,7 @@ describe('Unit test case for ts embed', () => {
1388
1388
  });
1389
1389
  describe('when visible Tabs are set', () => {
1390
1390
  test('should throw error when there are both visible and hidden Tabs - pinboard', async () => {
1391
- spyOn(logger, 'error');
1391
+ jest.spyOn(logger, 'error');
1392
1392
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
1393
1393
  visibleTabs: [tabId1],
1394
1394
  hiddenTabs: [tabId2],
@@ -1397,7 +1397,12 @@ describe('Unit test case for ts embed', () => {
1397
1397
  });
1398
1398
  await pinboardEmbed.render();
1399
1399
  expect(pinboardEmbed['isError']).toBe(true);
1400
- expect(logger.error).toHaveBeenCalledWith('You cannot have both hidden Tabs and visible Tabs');
1400
+ expect(logger.error).toHaveBeenCalledWith({
1401
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
1402
+ message: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
1403
+ code: EmbedErrorCodes.CONFLICTING_TABS_CONFIG,
1404
+ error: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
1405
+ });
1401
1406
  });
1402
1407
  test('should not throw error when there are only visible or hidden Tabs - pinboard', async () => {
1403
1408
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
@@ -1414,7 +1419,7 @@ describe('Unit test case for ts embed', () => {
1414
1419
  * @param visibleTabs
1415
1420
  */
1416
1421
  async function testTabsForLiveboards(hiddenTabs, visibleTabs) {
1417
- spyOn(logger, 'error');
1422
+ jest.spyOn(logger, 'error');
1418
1423
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1419
1424
  hiddenTabs,
1420
1425
  visibleTabs,
@@ -1423,7 +1428,12 @@ describe('Unit test case for ts embed', () => {
1423
1428
  });
1424
1429
  await liveboardEmbed.render();
1425
1430
  expect(liveboardEmbed['isError']).toBe(true);
1426
- expect(logger.error).toHaveBeenCalledWith('You cannot have both hidden Tabs and visible Tabs');
1431
+ expect(logger.error).toHaveBeenCalledWith({
1432
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
1433
+ message: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
1434
+ code: EmbedErrorCodes.CONFLICTING_TABS_CONFIG,
1435
+ error: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
1436
+ });
1427
1437
  }
1428
1438
  test('should throw error when there are both visible and hidden Tab arrays', async () => {
1429
1439
  await testTabsForLiveboards([tabId1], [tabId2]);
@@ -1462,11 +1472,16 @@ describe('Unit test case for ts embed', () => {
1462
1472
  });
1463
1473
  });
1464
1474
  test('Error should be true', async () => {
1465
- spyOn(logger, 'error');
1475
+ jest.spyOn(logger, 'error');
1466
1476
  const tsEmbed = new SearchEmbed(getRootEl(), {});
1467
1477
  await tsEmbed.render();
1468
1478
  expect(tsEmbed['isError']).toBe(true);
1469
- expect(logger.error).toHaveBeenCalledWith('You need to init the ThoughtSpot SDK module first');
1479
+ expect(logger.error).toHaveBeenCalledWith({
1480
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
1481
+ message: ERROR_MESSAGE.INIT_SDK_REQUIRED,
1482
+ code: EmbedErrorCodes.INIT_ERROR,
1483
+ error: ERROR_MESSAGE.INIT_SDK_REQUIRED,
1484
+ });
1470
1485
  });
1471
1486
  });
1472
1487
  describe('V1Embed ', () => {
@@ -1474,7 +1489,7 @@ describe('Unit test case for ts embed', () => {
1474
1489
  jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(() => 'http://tshost');
1475
1490
  });
1476
1491
  test('when isRendered is true than isError will be true', async () => {
1477
- spyOn(logger, 'warn');
1492
+ jest.spyOn(logger, 'warn');
1478
1493
  const viEmbedIns = new tsEmbedInstance.V1Embed(getRootEl(), defaultViewConfig);
1479
1494
  expect(viEmbedIns['isError']).toBe(false);
1480
1495
  await viEmbedIns.render();
@@ -1518,7 +1533,7 @@ describe('Unit test case for ts embed', () => {
1518
1533
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}${defaultParamsPost}#/${path}`);
1519
1534
  });
1520
1535
  test('navigateToPage function use before render', async () => {
1521
- spyOn(logger, 'log');
1536
+ jest.spyOn(logger, 'log');
1522
1537
  const appEmbed = new AppEmbed(getRootEl(), {
1523
1538
  frameParams: {
1524
1539
  width: '100%',
@@ -1722,7 +1737,7 @@ describe('Unit test case for ts embed', () => {
1722
1737
  await appEmbed.render();
1723
1738
  expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&additionalPendoKey=1234${defaultParamsPost}#/home`);
1724
1739
  });
1725
- xit('Sets the forceSAMLAutoRedirect param', async (done) => {
1740
+ xit('Sets the forceSAMLAutoRedirect param', async () => {
1726
1741
  jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
1727
1742
  init({
1728
1743
  thoughtSpotHost: 'tshost',
@@ -1735,11 +1750,8 @@ describe('Unit test case for ts embed', () => {
1735
1750
  },
1736
1751
  });
1737
1752
  appEmbed.render();
1738
- await waitFor(() => !!getIFrameEl()).then(() => {
1739
- expect(getIFrameSrc()).toContain('authType=EmbeddedSSO');
1740
- expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
1741
- done();
1742
- });
1753
+ expect(getIFrameSrc()).toContain('authType=EmbeddedSSO');
1754
+ expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
1743
1755
  });
1744
1756
  it('Should set the override locale for number/date and currency format', async () => {
1745
1757
  jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
@@ -1889,8 +1901,7 @@ describe('Unit test case for ts embed', () => {
1889
1901
  beforeAll(() => {
1890
1902
  delete window.location;
1891
1903
  window.location = {
1892
- hash: '',
1893
- search: '',
1904
+ assign: jest.fn(),
1894
1905
  };
1895
1906
  });
1896
1907
  beforeEach(() => {
@@ -1960,7 +1971,7 @@ describe('Unit test case for ts embed', () => {
1960
1971
  });
1961
1972
  afterAll(() => {
1962
1973
  const rootEle = document.getElementById('myRoot');
1963
- rootEle.remove();
1974
+ rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
1964
1975
  jest.clearAllMocks();
1965
1976
  });
1966
1977
  it('should preRender and hide the iframe', async () => {
@@ -1994,9 +2005,9 @@ describe('Unit test case for ts embed', () => {
1994
2005
  };
1995
2006
  });
1996
2007
  // show preRender
1997
- const warnSpy = spyOn(logger, 'warn');
2008
+ const warnSpy = jest.spyOn(logger, 'warn');
1998
2009
  libEmbed.showPreRender();
1999
- expect(warnSpy).toHaveBeenCalledTimes(0);
2010
+ expect(warnSpy).toHaveBeenCalledTimes(1);
2000
2011
  resizeObserverCb([
2001
2012
  {
2002
2013
  target: tsEmbedDiv,
@@ -2017,7 +2028,7 @@ describe('Unit test case for ts embed', () => {
2017
2028
  });
2018
2029
  it('preRender called without preRenderId should log error ', () => {
2019
2030
  createRootEleForEmbed();
2020
- spyOn(logger, 'error');
2031
+ jest.spyOn(logger, 'error');
2021
2032
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2022
2033
  liveboardId: 'myLiveboardId',
2023
2034
  });
@@ -2044,7 +2055,7 @@ describe('Unit test case for ts embed', () => {
2044
2055
  preRenderId: 'i-am-preRendered',
2045
2056
  liveboardId: 'myLiveboardId',
2046
2057
  });
2047
- spyOn(libEmbed, 'preRender');
2058
+ jest.spyOn(libEmbed, 'preRender');
2048
2059
  libEmbed.hidePreRender();
2049
2060
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
2050
2061
  });
@@ -2078,8 +2089,8 @@ describe('Unit test case for ts embed', () => {
2078
2089
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2079
2090
  liveboardId: 'myLiveboardId',
2080
2091
  });
2081
- spyOn(libEmbed, 'preRender');
2082
- spyOn(logger, 'error');
2092
+ jest.spyOn(libEmbed, 'preRender');
2093
+ jest.spyOn(logger, 'error');
2083
2094
  libEmbed.showPreRender();
2084
2095
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
2085
2096
  expect(logger.error).toHaveBeenCalledTimes(1);
@@ -2109,7 +2120,7 @@ describe('Unit test case for ts embed', () => {
2109
2120
  preRenderId: 'test',
2110
2121
  });
2111
2122
  await libEmbed.syncPreRenderStyle();
2112
- expect(logger.error).toBeCalledWith('PreRender should be called before using syncPreRenderStyle');
2123
+ expect(logger.error).toHaveBeenCalledWith('PreRender should be called before using syncPreRenderStyle');
2113
2124
  logger.error.mockClear();
2114
2125
  });
2115
2126
  });
@@ -2142,7 +2153,7 @@ describe('Unit test case for ts embed', () => {
2142
2153
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2143
2154
  });
2144
2155
  await executeAfterWait(() => {
2145
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2156
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2146
2157
  expect(baseInstance.handleAuth).toHaveBeenCalled();
2147
2158
  expect(mockPort.postMessage).toHaveBeenCalledWith({
2148
2159
  type: EmbedEvent.IdleSessionTimeout,
@@ -2168,14 +2179,14 @@ describe('Unit test case for ts embed', () => {
2168
2179
  const mockPort = {
2169
2180
  postMessage: jest.fn(),
2170
2181
  };
2171
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
2182
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
2172
2183
  await executeAfterWait(() => {
2173
2184
  const iframe = getIFrameEl();
2174
2185
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2175
2186
  });
2176
2187
  await executeAfterWait(() => {
2177
2188
  expect(getRootEl().innerHTML).toContain('Not logged in');
2178
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2189
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2179
2190
  expect(loggerSpy).toHaveBeenCalledTimes(1);
2180
2191
  });
2181
2192
  jest.spyOn(authService, 'verifyTokenService').mockClear();
@@ -2200,13 +2211,13 @@ describe('Unit test case for ts embed', () => {
2200
2211
  const mockPort = {
2201
2212
  postMessage: jest.fn(),
2202
2213
  };
2203
- const loggerSpy = jest.spyOn(logger, 'error').mockResolvedValueOnce(true);
2214
+ const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
2204
2215
  await executeAfterWait(() => {
2205
2216
  const iframe = getIFrameEl();
2206
2217
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
2207
2218
  });
2208
2219
  await executeAfterWait(() => {
2209
- expect(baseInstance.notifyAuthFailure).toBeCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2220
+ expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
2210
2221
  expect(loggerSpy).toHaveBeenCalledTimes(0);
2211
2222
  });
2212
2223
  jest.spyOn(authService, 'verifyTokenService').mockClear();
@@ -2214,7 +2225,7 @@ describe('Unit test case for ts embed', () => {
2214
2225
  });
2215
2226
  });
2216
2227
  describe('Renders should wait for init to completed', () => {
2217
- const errorSpy = jest.spyOn(logger, 'error').mockResolvedValue(true);
2228
+ const errorSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
2218
2229
  beforeEach(() => {
2219
2230
  errorSpy.mockClear();
2220
2231
  resetValueFromWindow('initFlagKey');
@@ -2858,7 +2869,7 @@ describe('Unit test case for ts embed', () => {
2858
2869
  });
2859
2870
  test('should execute callbacks through executeEvent function', async () => {
2860
2871
  let capturedExecuteEvent;
2861
- mockHandleInterceptEvent.mockImplementation((params) => {
2872
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
2862
2873
  capturedExecuteEvent = params.executeEvent;
2863
2874
  });
2864
2875
  const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
@@ -2891,7 +2902,7 @@ describe('Unit test case for ts embed', () => {
2891
2902
  });
2892
2903
  test('should call triggerUIPassThrough through getUnsavedAnswerTml function', async () => {
2893
2904
  let capturedGetUnsavedAnswerTml;
2894
- mockHandleInterceptEvent.mockImplementation((params) => {
2905
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
2895
2906
  capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
2896
2907
  });
2897
2908
  const mockTmlResponse = { tml: 'test-tml-content' };
@@ -3041,7 +3052,7 @@ describe('Unit test case for ts embed', () => {
3041
3052
  });
3042
3053
  test('should pass eventPort to executeCallbacks', async () => {
3043
3054
  let capturedExecuteEvent;
3044
- mockHandleInterceptEvent.mockImplementation((params) => {
3055
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3045
3056
  capturedExecuteEvent = params.executeEvent;
3046
3057
  });
3047
3058
  const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
@@ -3074,7 +3085,7 @@ describe('Unit test case for ts embed', () => {
3074
3085
  });
3075
3086
  test('should handle getUnsavedAnswerTml with empty response', async () => {
3076
3087
  let capturedGetUnsavedAnswerTml;
3077
- mockHandleInterceptEvent.mockImplementation((params) => {
3088
+ mockHandleInterceptEvent.mockImplementation(async (params) => {
3078
3089
  capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
3079
3090
  });
3080
3091
  mockProcessTrigger.mockResolvedValue([]);
@@ -3132,4 +3143,257 @@ describe('Unit test case for ts embed', () => {
3132
3143
  });
3133
3144
  });
3134
3145
  });
3146
+ describe('Additional Coverage Tests', () => {
3147
+ beforeAll(() => {
3148
+ init({
3149
+ thoughtSpotHost: 'tshost',
3150
+ authType: AuthType.None,
3151
+ });
3152
+ });
3153
+ test('should handle getAuthTokenForCookielessInit with non-cookieless auth', async () => {
3154
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3155
+ const token = await searchEmbed['getAuthTokenForCookielessInit']();
3156
+ expect(token).toBe('');
3157
+ });
3158
+ test('should call setIFrameHeight', async () => {
3159
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3160
+ await searchEmbed.render();
3161
+ await executeAfterWait(() => {
3162
+ searchEmbed['setIFrameHeight'](500);
3163
+ expect(getIFrameEl().style.height).toBe('500px');
3164
+ });
3165
+ });
3166
+ test('should test getIframeCenter calculation', async () => {
3167
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3168
+ await searchEmbed.render();
3169
+ await executeAfterWait(() => {
3170
+ const center = searchEmbed['getIframeCenter']();
3171
+ expect(center).toHaveProperty('iframeCenter');
3172
+ expect(center).toHaveProperty('iframeHeight');
3173
+ expect(center).toHaveProperty('viewPortHeight');
3174
+ });
3175
+ });
3176
+ test('should handle preRender with replaceExistingPreRender=true', async () => {
3177
+ createRootEleForEmbed();
3178
+ const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
3179
+ preRenderId: 'test-replace',
3180
+ liveboardId: 'lb1',
3181
+ });
3182
+ await embed1.preRender();
3183
+ const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
3184
+ preRenderId: 'test-replace',
3185
+ liveboardId: 'lb2',
3186
+ });
3187
+ await embed2.preRender(false, true);
3188
+ expect(document.getElementById('tsEmbed-pre-render-wrapper-test-replace')).toBeTruthy();
3189
+ });
3190
+ test('should test getIframeSrc base implementation', () => {
3191
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3192
+ expect(searchEmbed.getIframeSrc()).toBe('');
3193
+ });
3194
+ test('should handle createEmbedEventResponder with OnBeforeGetVizDataIntercept', async () => {
3195
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3196
+ const mockPort = { postMessage: jest.fn() };
3197
+ const responder = searchEmbed['createEmbedEventResponder'](mockPort, EmbedEvent.OnBeforeGetVizDataIntercept);
3198
+ responder({ data: 'test' });
3199
+ expect(mockPort.postMessage).toHaveBeenCalled();
3200
+ });
3201
+ test('should clean up message event listeners', async () => {
3202
+ const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
3203
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3204
+ await searchEmbed.render();
3205
+ searchEmbed['unsubscribeToMessageEvents']();
3206
+ expect(removeEventListenerSpy).toHaveBeenCalledWith('message', expect.any(Function));
3207
+ });
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
+ });
3135
3399
  //# sourceMappingURL=ts-embed.spec.js.map