@thoughtspot/visual-embed-sdk 1.50.0 → 1.51.0

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 (222) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +95 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +136 -15
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +59 -37
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +419 -149
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/conversation.d.ts +230 -1
  11. package/cjs/src/embed/conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/conversation.js +30 -16
  13. package/cjs/src/embed/conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.spec.js +221 -17
  15. package/cjs/src/embed/conversation.spec.js.map +1 -1
  16. package/cjs/src/embed/events.spec.js +635 -0
  17. package/cjs/src/embed/events.spec.js.map +1 -1
  18. package/cjs/src/embed/host-events.spec.js +151 -0
  19. package/cjs/src/embed/host-events.spec.js.map +1 -1
  20. package/cjs/src/embed/hostEventClient/contracts.d.ts +51 -14
  21. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  22. package/cjs/src/embed/hostEventClient/contracts.js +11 -1
  23. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  24. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  25. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  26. package/cjs/src/embed/hostEventClient/host-event-client.js +9 -0
  27. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  28. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +218 -0
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/utils.d.ts +2 -0
  31. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/utils.js +32 -2
  33. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/utils.spec.js +178 -0
  35. package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
  36. package/cjs/src/embed/liveboard.d.ts +42 -1
  37. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  38. package/cjs/src/embed/liveboard.js +26 -6
  39. package/cjs/src/embed/liveboard.js.map +1 -1
  40. package/cjs/src/embed/liveboard.spec.js +83 -2
  41. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  42. package/cjs/src/embed/spotter-utils.d.ts +8 -1
  43. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  44. package/cjs/src/embed/spotter-utils.js +14 -1
  45. package/cjs/src/embed/spotter-utils.js.map +1 -1
  46. package/cjs/src/embed/spotter-utils.spec.js +61 -0
  47. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  48. package/cjs/src/embed/spotter-viz-utils.d.ts +34 -0
  49. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  50. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  51. package/cjs/src/embed/spotter-viz-utils.spec.js +17 -0
  52. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
  53. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  54. package/cjs/src/embed/ts-embed.js +29 -7
  55. package/cjs/src/embed/ts-embed.js.map +1 -1
  56. package/cjs/src/embed/ts-embed.spec.js +146 -0
  57. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  58. package/cjs/src/errors.d.ts +1 -0
  59. package/cjs/src/errors.d.ts.map +1 -1
  60. package/cjs/src/errors.js +1 -0
  61. package/cjs/src/errors.js.map +1 -1
  62. package/cjs/src/index.d.ts +2 -2
  63. package/cjs/src/index.d.ts.map +1 -1
  64. package/cjs/src/index.js +3 -2
  65. package/cjs/src/index.js.map +1 -1
  66. package/cjs/src/mixpanel-service.d.ts +4 -0
  67. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  68. package/cjs/src/mixpanel-service.js +4 -0
  69. package/cjs/src/mixpanel-service.js.map +1 -1
  70. package/cjs/src/react/util.spec.js +251 -0
  71. package/cjs/src/react/util.spec.js.map +1 -1
  72. package/cjs/src/types.d.ts +573 -11
  73. package/cjs/src/types.d.ts.map +1 -1
  74. package/cjs/src/types.js +519 -2
  75. package/cjs/src/types.js.map +1 -1
  76. package/cjs/src/utils/processData.spec.js +93 -0
  77. package/cjs/src/utils/processData.spec.js.map +1 -1
  78. package/cjs/src/utils/processTrigger.spec.js +61 -0
  79. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  80. package/dist/{index-B5xoN6Cp.js → index-aBzH5ZwF.js} +1 -1
  81. package/dist/src/css-variables.d.ts +95 -0
  82. package/dist/src/css-variables.d.ts.map +1 -1
  83. package/dist/src/embed/app.d.ts +136 -15
  84. package/dist/src/embed/app.d.ts.map +1 -1
  85. package/dist/src/embed/conversation.d.ts +230 -1
  86. package/dist/src/embed/conversation.d.ts.map +1 -1
  87. package/dist/src/embed/hostEventClient/contracts.d.ts +51 -14
  88. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  89. package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  90. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  91. package/dist/src/embed/hostEventClient/utils.d.ts +2 -0
  92. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  93. package/dist/src/embed/liveboard.d.ts +42 -1
  94. package/dist/src/embed/liveboard.d.ts.map +1 -1
  95. package/dist/src/embed/spotter-utils.d.ts +8 -1
  96. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  97. package/dist/src/embed/spotter-viz-utils.d.ts +34 -0
  98. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  99. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  100. package/dist/src/errors.d.ts +1 -0
  101. package/dist/src/errors.d.ts.map +1 -1
  102. package/dist/src/index.d.ts +2 -2
  103. package/dist/src/index.d.ts.map +1 -1
  104. package/dist/src/mixpanel-service.d.ts +4 -0
  105. package/dist/src/mixpanel-service.d.ts.map +1 -1
  106. package/dist/src/types.d.ts +573 -11
  107. package/dist/src/types.d.ts.map +1 -1
  108. package/dist/tsembed-react.es.js +936 -142
  109. package/dist/tsembed-react.js +935 -141
  110. package/dist/tsembed.es.js +935 -142
  111. package/dist/tsembed.js +933 -140
  112. package/dist/visual-embed-sdk-react-full.d.ts +1147 -44
  113. package/dist/visual-embed-sdk-react.d.ts +1153 -46
  114. package/dist/visual-embed-sdk.d.ts +1161 -46
  115. package/lib/package.json +1 -1
  116. package/lib/src/css-variables.d.ts +95 -0
  117. package/lib/src/css-variables.d.ts.map +1 -1
  118. package/lib/src/embed/app.d.ts +136 -15
  119. package/lib/src/embed/app.d.ts.map +1 -1
  120. package/lib/src/embed/app.js +60 -38
  121. package/lib/src/embed/app.js.map +1 -1
  122. package/lib/src/embed/app.spec.js +420 -150
  123. package/lib/src/embed/app.spec.js.map +1 -1
  124. package/lib/src/embed/conversation.d.ts +230 -1
  125. package/lib/src/embed/conversation.d.ts.map +1 -1
  126. package/lib/src/embed/conversation.js +31 -17
  127. package/lib/src/embed/conversation.js.map +1 -1
  128. package/lib/src/embed/conversation.spec.js +222 -18
  129. package/lib/src/embed/conversation.spec.js.map +1 -1
  130. package/lib/src/embed/events.spec.js +635 -0
  131. package/lib/src/embed/events.spec.js.map +1 -1
  132. package/lib/src/embed/host-events.spec.js +152 -1
  133. package/lib/src/embed/host-events.spec.js.map +1 -1
  134. package/lib/src/embed/hostEventClient/contracts.d.ts +51 -14
  135. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  136. package/lib/src/embed/hostEventClient/contracts.js +10 -0
  137. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  138. package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  139. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  140. package/lib/src/embed/hostEventClient/host-event-client.js +10 -1
  141. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  142. package/lib/src/embed/hostEventClient/host-event-client.spec.js +218 -0
  143. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  144. package/lib/src/embed/hostEventClient/utils.d.ts +2 -0
  145. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  146. package/lib/src/embed/hostEventClient/utils.js +28 -1
  147. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  148. package/lib/src/embed/hostEventClient/utils.spec.js +179 -1
  149. package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
  150. package/lib/src/embed/liveboard.d.ts +42 -1
  151. package/lib/src/embed/liveboard.d.ts.map +1 -1
  152. package/lib/src/embed/liveboard.js +26 -6
  153. package/lib/src/embed/liveboard.js.map +1 -1
  154. package/lib/src/embed/liveboard.spec.js +83 -2
  155. package/lib/src/embed/liveboard.spec.js.map +1 -1
  156. package/lib/src/embed/spotter-utils.d.ts +8 -1
  157. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  158. package/lib/src/embed/spotter-utils.js +12 -0
  159. package/lib/src/embed/spotter-utils.js.map +1 -1
  160. package/lib/src/embed/spotter-utils.spec.js +62 -1
  161. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  162. package/lib/src/embed/spotter-viz-utils.d.ts +34 -0
  163. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  164. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  165. package/lib/src/embed/spotter-viz-utils.spec.js +17 -0
  166. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
  167. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  168. package/lib/src/embed/ts-embed.js +29 -7
  169. package/lib/src/embed/ts-embed.js.map +1 -1
  170. package/lib/src/embed/ts-embed.spec.js +146 -0
  171. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  172. package/lib/src/errors.d.ts +1 -0
  173. package/lib/src/errors.d.ts.map +1 -1
  174. package/lib/src/errors.js +1 -0
  175. package/lib/src/errors.js.map +1 -1
  176. package/lib/src/index.d.ts +2 -2
  177. package/lib/src/index.d.ts.map +1 -1
  178. package/lib/src/index.js +2 -2
  179. package/lib/src/index.js.map +1 -1
  180. package/lib/src/mixpanel-service.d.ts +4 -0
  181. package/lib/src/mixpanel-service.d.ts.map +1 -1
  182. package/lib/src/mixpanel-service.js +4 -0
  183. package/lib/src/mixpanel-service.js.map +1 -1
  184. package/lib/src/react/util.spec.js +251 -0
  185. package/lib/src/react/util.spec.js.map +1 -1
  186. package/lib/src/types.d.ts +573 -11
  187. package/lib/src/types.d.ts.map +1 -1
  188. package/lib/src/types.js +519 -2
  189. package/lib/src/types.js.map +1 -1
  190. package/lib/src/utils/processData.spec.js +93 -0
  191. package/lib/src/utils/processData.spec.js.map +1 -1
  192. package/lib/src/utils/processTrigger.spec.js +61 -0
  193. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  194. package/lib/src/visual-embed-sdk.d.ts +1161 -46
  195. package/package.json +1 -1
  196. package/src/css-variables.ts +118 -0
  197. package/src/embed/app.spec.ts +530 -183
  198. package/src/embed/app.ts +209 -66
  199. package/src/embed/conversation.spec.ts +275 -21
  200. package/src/embed/conversation.ts +262 -17
  201. package/src/embed/events.spec.ts +757 -1
  202. package/src/embed/host-events.spec.ts +194 -0
  203. package/src/embed/hostEventClient/contracts.ts +57 -14
  204. package/src/embed/hostEventClient/host-event-client.spec.ts +338 -0
  205. package/src/embed/hostEventClient/host-event-client.ts +16 -0
  206. package/src/embed/hostEventClient/utils.spec.ts +204 -0
  207. package/src/embed/hostEventClient/utils.ts +37 -10
  208. package/src/embed/liveboard.spec.ts +108 -2
  209. package/src/embed/liveboard.ts +82 -14
  210. package/src/embed/spotter-utils.spec.ts +68 -1
  211. package/src/embed/spotter-utils.ts +16 -1
  212. package/src/embed/spotter-viz-utils.spec.ts +17 -0
  213. package/src/embed/spotter-viz-utils.ts +34 -0
  214. package/src/embed/ts-embed.spec.ts +186 -0
  215. package/src/embed/ts-embed.ts +30 -4
  216. package/src/errors.ts +1 -0
  217. package/src/index.ts +3 -1
  218. package/src/mixpanel-service.ts +4 -0
  219. package/src/react/util.spec.tsx +255 -0
  220. package/src/types.ts +575 -8
  221. package/src/utils/processData.spec.ts +97 -0
  222. package/src/utils/processTrigger.spec.ts +91 -0
@@ -1,4 +1,4 @@
1
- import { SpotterEmbed, SpotterEmbedViewConfig, ConversationEmbed } from './conversation';
1
+ import { SpotterEmbed, SpotterEmbedViewConfig, SpotterQueryMode, ConversationEmbed } from './conversation';
2
2
  import { TsEmbed } from './ts-embed';
3
3
  import * as authInstance from '../auth';
4
4
  import { Action, init } from '../index';
@@ -45,6 +45,40 @@ describe('ConversationEmbed', () => {
45
45
  );
46
46
  });
47
47
 
48
+ it('should deep-link to the shared-conversation reader view when sharedConversationId is set', async () => {
49
+ const viewConfig: SpotterEmbedViewConfig = {
50
+ worksheetId: 'worksheetId',
51
+ searchOptions: {
52
+ searchQuery: 'searchQuery',
53
+ },
54
+ sharedConversationId: 'conv-123',
55
+ };
56
+
57
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
58
+ await conversationEmbed.render();
59
+ expectUrlMatchesWithParams(
60
+ getIFrameSrc(),
61
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true#/embed/insights/conv-assist/s/conv-123?worksheet=worksheetId&query=searchQuery`,
62
+ );
63
+ });
64
+
65
+ it('should URL-encode the sharedConversationId in the reader-view path', async () => {
66
+ const viewConfig: SpotterEmbedViewConfig = {
67
+ worksheetId: 'worksheetId',
68
+ searchOptions: {
69
+ searchQuery: 'searchQuery',
70
+ },
71
+ sharedConversationId: 'conv/1',
72
+ };
73
+
74
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
75
+ await conversationEmbed.render();
76
+ expectUrlMatchesWithParams(
77
+ getIFrameSrc(),
78
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true#/embed/insights/conv-assist/s/conv%2F1?worksheet=worksheetId&query=searchQuery`,
79
+ );
80
+ });
81
+
48
82
  it('should render the conversation embed with worksheets disabled', async () => {
49
83
  const viewConfig: SpotterEmbedViewConfig = {
50
84
  worksheetId: 'worksheetId',
@@ -113,26 +147,6 @@ describe('ConversationEmbed', () => {
113
147
  );
114
148
  });
115
149
 
116
- it('should handle error when worksheetId is not provided', async () => {
117
- const viewConfig: SpotterEmbedViewConfig = {
118
- worksheetId: '',
119
- searchOptions: {
120
- searchQuery: 'searchQuery',
121
- },
122
- };
123
- const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
124
- (conversationEmbed as any).handleError = jest.fn();
125
- await conversationEmbed.render();
126
- expect((conversationEmbed as any).handleError).toHaveBeenCalledWith(
127
- {
128
- errorType: ErrorDetailsTypes.VALIDATION_ERROR,
129
- message: ERROR_MESSAGE.SPOTTER_EMBED_WORKSHEED_ID_NOT_FOUND,
130
- code: EmbedErrorCodes.WORKSHEET_ID_NOT_FOUND,
131
- error: ERROR_MESSAGE.SPOTTER_EMBED_WORKSHEED_ID_NOT_FOUND,
132
- },
133
- );
134
- });
135
-
136
150
  it('should render the conversation embed if data panel v2 flag is true', async () => {
137
151
  const viewConfig: SpotterEmbedViewConfig = {
138
152
  worksheetId: 'worksheetId',
@@ -460,6 +474,69 @@ describe('ConversationEmbed', () => {
460
474
  );
461
475
  });
462
476
 
477
+ it('should render the conversation embed with spotter radiance', async () => {
478
+ const viewConfig: SpotterEmbedViewConfig = {
479
+ worksheetId: 'worksheetId',
480
+ searchOptions: {
481
+ searchQuery: 'searchQuery',
482
+ },
483
+ showSpotterRadiance: true,
484
+ };
485
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
486
+ await conversationEmbed.render();
487
+ expectUrlMatchesWithParams(
488
+ getIFrameSrc(),
489
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&showSpotterRadiance=true#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
490
+ );
491
+ });
492
+
493
+ it('should render the conversation embed with spotter radiance disabled', async () => {
494
+ const viewConfig: SpotterEmbedViewConfig = {
495
+ worksheetId: 'worksheetId',
496
+ searchOptions: {
497
+ searchQuery: 'searchQuery',
498
+ },
499
+ showSpotterRadiance: false,
500
+ };
501
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
502
+ await conversationEmbed.render();
503
+ expectUrlMatchesWithParams(
504
+ getIFrameSrc(),
505
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&showSpotterRadiance=false#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
506
+ );
507
+ });
508
+
509
+ it('should render the conversation embed with default query mode set to research', async () => {
510
+ const viewConfig: SpotterEmbedViewConfig = {
511
+ worksheetId: 'worksheetId',
512
+ searchOptions: {
513
+ searchQuery: 'searchQuery',
514
+ },
515
+ defaultQueryMode: SpotterQueryMode.RESEARCH,
516
+ };
517
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
518
+ await conversationEmbed.render();
519
+ expectUrlMatchesWithParams(
520
+ getIFrameSrc(),
521
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&defaultQueryMode=research#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
522
+ );
523
+ });
524
+
525
+ it('should render the conversation embed without a default query mode param when unset', async () => {
526
+ const viewConfig: SpotterEmbedViewConfig = {
527
+ worksheetId: 'worksheetId',
528
+ searchOptions: {
529
+ searchQuery: 'searchQuery',
530
+ },
531
+ };
532
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
533
+ await conversationEmbed.render();
534
+ expectUrlMatchesWithParams(
535
+ getIFrameSrc(),
536
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
537
+ );
538
+ });
539
+
463
540
  describe('spotter chat hiddenActions', () => {
464
541
  it.each([
465
542
  ['SpotterChatConnectorResources', Action.SpotterChatConnectorResources],
@@ -584,6 +661,24 @@ describe('SpotterEmbed APP_INIT embedParams', () => {
584
661
  });
585
662
  });
586
663
 
664
+ it('should forward spotterChatPinConfig nested in spotterSidebarConfig', async () => {
665
+ const spotterChatPinConfig = {
666
+ enabled: true,
667
+ pinLabel: 'Pin to top',
668
+ unpinLabel: 'Unpin',
669
+ };
670
+ const response = await getAppInitResponse({
671
+ worksheetId: 'ws1',
672
+ spotterSidebarConfig: {
673
+ enablePastConversationsSidebar: true,
674
+ spotterChatPinConfig,
675
+ },
676
+ });
677
+ expect(
678
+ response.data.embedParams.spotterSidebarConfig.spotterChatPinConfig,
679
+ ).toEqual(spotterChatPinConfig);
680
+ });
681
+
587
682
  it('should populate enablePastConversationsSidebar from deprecated standalone flag', async () => {
588
683
  const response = await getAppInitResponse({
589
684
  worksheetId: 'ws1',
@@ -666,5 +761,164 @@ describe('SpotterEmbed APP_INIT embedParams', () => {
666
761
  expect(mockPort.postMessage.mock.calls[0]?.[0].data.embedParams?.spotterSidebarConfig?.spotterDocumentationUrl).toBeUndefined();
667
762
  });
668
763
 
764
+ it('should include spotterShareConversationConfig in embedParams when provided', async () => {
765
+ const response = await getAppInitResponse({
766
+ worksheetId: 'ws1',
767
+ spotterShareConversationConfig: { enableShareConversation: true },
768
+ });
769
+ expect(response.data.embedParams.spotterShareConversationConfig).toEqual({
770
+ enableShareConversation: true,
771
+ });
772
+ });
773
+
774
+ it('should pass spotterShareConversationConfig label overrides through embedParams', async () => {
775
+ const spotterShareConversationConfig = {
776
+ enableShareConversation: true,
777
+ spotterShareLabel: 'Share',
778
+ spotterShareModalTitle: 'Share conversation',
779
+ };
780
+ const response = await getAppInitResponse({
781
+ worksheetId: 'ws1',
782
+ spotterShareConversationConfig,
783
+ });
784
+ expect(response.data.embedParams.spotterShareConversationConfig).toEqual(spotterShareConversationConfig);
785
+ });
786
+
787
+ it('should include spotterShareConversationConfig alongside spotterSidebarConfig', async () => {
788
+ const response = await getAppInitResponse({
789
+ worksheetId: 'ws1',
790
+ spotterSidebarConfig: { enablePastConversationsSidebar: true },
791
+ spotterShareConversationConfig: { enableShareConversation: true },
792
+ });
793
+ expect(response.data.embedParams.spotterSidebarConfig.enablePastConversationsSidebar).toBe(true);
794
+ expect(response.data.embedParams.spotterShareConversationConfig.enableShareConversation).toBe(true);
795
+ });
796
+
797
+ it('should not handle error when neither worksheetId nor dataSources is provided', async () => {
798
+ const viewConfig: SpotterEmbedViewConfig = {
799
+ searchOptions: {
800
+ searchQuery: 'searchQuery',
801
+ },
802
+ };
803
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
804
+ (conversationEmbed as any).handleError = jest.fn();
805
+ await conversationEmbed.render();
806
+ expect((conversationEmbed as any).handleError).not.toHaveBeenCalled();
807
+ });
808
+
809
+ it('should not handle error when dataSources is an empty array and worksheetId is not provided', async () => {
810
+ const viewConfig: SpotterEmbedViewConfig = {
811
+ dataSources: [],
812
+ };
813
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
814
+ (conversationEmbed as any).handleError = jest.fn();
815
+ await conversationEmbed.render();
816
+ expect((conversationEmbed as any).handleError).not.toHaveBeenCalled();
817
+ });
818
+
819
+ it('should render without worksheet and dataSources params when neither is provided', async () => {
820
+ const viewConfig: SpotterEmbedViewConfig = {};
821
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
822
+ await conversationEmbed.render();
823
+ const src = getIFrameSrc();
824
+ expect(src).not.toContain('worksheet=');
825
+ expect(src).not.toContain('dataSources=');
826
+ });
827
+
828
+ it('should not append dataSources to the URL when it is an empty array', async () => {
829
+ const viewConfig: SpotterEmbedViewConfig = {
830
+ worksheetId: 'worksheetId',
831
+ dataSources: [],
832
+ };
833
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
834
+ await conversationEmbed.render();
835
+ expect(getIFrameSrc()).not.toContain('dataSources=');
836
+ });
837
+
838
+ it('should not handle error when dataSources is provided but worksheetId is not', async () => {
839
+ const viewConfig: SpotterEmbedViewConfig = {
840
+ worksheetId: '',
841
+ dataSources: ['ds-1', 'ds-2'],
842
+ };
843
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
844
+ (conversationEmbed as any).handleError = jest.fn();
845
+ await conversationEmbed.render();
846
+ expect((conversationEmbed as any).handleError).not.toHaveBeenCalled();
847
+ });
848
+
849
+ it('should render the conversation embed with dataSources and no worksheetId in the hash params', async () => {
850
+ const viewConfig: SpotterEmbedViewConfig = {
851
+ worksheetId: '',
852
+ dataSources: ['ds-1', 'ds-2'],
853
+ };
854
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
855
+ await conversationEmbed.render();
856
+ expectUrlMatchesWithParams(
857
+ getIFrameSrc(),
858
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true#/embed/insights/conv-assist?dataSources=${encodeURIComponent(JSON.stringify(['ds-1', 'ds-2']))}`,
859
+ );
860
+ });
861
+
862
+ it('should prefer dataSources over worksheetId when both are provided', async () => {
863
+ const viewConfig: SpotterEmbedViewConfig = {
864
+ worksheetId: 'worksheetId',
865
+ dataSources: ['ds-1', 'ds-2'],
866
+ searchOptions: {
867
+ searchQuery: 'searchQuery',
868
+ },
869
+ };
870
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
871
+ await conversationEmbed.render();
872
+ expectUrlMatchesWithParams(
873
+ getIFrameSrc(),
874
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true#/embed/insights/conv-assist?query=searchQuery&dataSources=${encodeURIComponent(JSON.stringify(['ds-1', 'ds-2']))}`,
875
+ );
876
+ });
877
+
878
+ it('should render the conversation embed without searchOptions and worksheetId when neither is set', async () => {
879
+ const viewConfig: SpotterEmbedViewConfig = {
880
+ worksheetId: '',
881
+ dataSources: ['ds-1'],
882
+ };
883
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
884
+ await conversationEmbed.render();
885
+ const src = getIFrameSrc();
886
+ expect(src).not.toContain('worksheet=');
887
+ expect(src).not.toContain('query=');
888
+ });
669
889
  });
670
890
 
891
+
892
+ describe('SpotterEmbed updatedSpotterExperience', () => {
893
+ it('should render the conversation embed with updated spotter experience', async () => {
894
+ const viewConfig: SpotterEmbedViewConfig = {
895
+ worksheetId: 'worksheetId',
896
+ searchOptions: {
897
+ searchQuery: 'searchQuery',
898
+ },
899
+ updatedSpotterExperience: true,
900
+ };
901
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
902
+ await conversationEmbed.render();
903
+ expectUrlMatchesWithParams(
904
+ getIFrameSrc(),
905
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&updatedSpotterExperience=true#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
906
+ );
907
+ });
908
+
909
+ it('should render the conversation embed with updated spotter experience disabled', async () => {
910
+ const viewConfig: SpotterEmbedViewConfig = {
911
+ worksheetId: 'worksheetId',
912
+ searchOptions: {
913
+ searchQuery: 'searchQuery',
914
+ },
915
+ updatedSpotterExperience: false,
916
+ };
917
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
918
+ await conversationEmbed.render();
919
+ expectUrlMatchesWithParams(
920
+ getIFrameSrc(),
921
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&updatedSpotterExperience=false#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
922
+ );
923
+ });
924
+ });