@thoughtspot/visual-embed-sdk 1.47.3 → 1.49.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.
- package/cjs/package.json +1 -1
- package/cjs/src/auth.d.ts.map +1 -1
- package/cjs/src/auth.js +11 -1
- package/cjs/src/auth.js.map +1 -1
- package/cjs/src/auth.spec.js +38 -0
- package/cjs/src/auth.spec.js.map +1 -1
- package/cjs/src/authToken.d.ts +2 -0
- package/cjs/src/authToken.d.ts.map +1 -1
- package/cjs/src/authToken.js +7 -5
- package/cjs/src/authToken.js.map +1 -1
- package/cjs/src/css-variables.d.ts +140 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +63 -2
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +57 -6
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +200 -1
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.js +7 -2
- package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.spec.js +385 -6
- package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts +1 -0
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +13 -1
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/base.spec.js +21 -0
- package/cjs/src/embed/base.spec.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.spec.js +86 -0
- package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +16 -1
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +5 -1
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +26 -0
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +48 -2
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +48 -7
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +139 -1
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.d.ts +85 -0
- package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -0
- package/cjs/src/embed/spotter-viz-utils.js +17 -0
- package/cjs/src/embed/spotter-viz-utils.js.map +1 -0
- package/cjs/src/embed/spotter-viz-utils.spec.d.ts +2 -0
- package/cjs/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
- package/cjs/src/embed/spotter-viz-utils.spec.js +31 -0
- package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -0
- package/cjs/src/embed/ts-embed.d.ts +58 -38
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +247 -151
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +397 -122
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +2 -1
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +3 -0
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/tokenizedFetch.d.ts.map +1 -1
- package/cjs/src/tokenizedFetch.js +12 -9
- package/cjs/src/tokenizedFetch.js.map +1 -1
- package/cjs/src/tokenizedFetch.spec.d.ts +2 -0
- package/cjs/src/tokenizedFetch.spec.d.ts.map +1 -0
- package/cjs/src/tokenizedFetch.spec.js +68 -0
- package/cjs/src/tokenizedFetch.spec.js.map +1 -0
- package/cjs/src/types.d.ts +309 -40
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +251 -23
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js +6 -7
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/cjs/src/utils/logger.js +2 -1
- package/cjs/src/utils/logger.js.map +1 -1
- package/cjs/src/utils/logger.spec.d.ts +1 -0
- package/cjs/src/utils/logger.spec.d.ts.map +1 -1
- package/cjs/src/utils/logger.spec.js +10 -9
- package/cjs/src/utils/logger.spec.js.map +1 -1
- package/cjs/src/utils.d.ts +4 -1
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +107 -10
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +163 -4
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-DZq20cR6.js → index-_UGCSSDR.js} +1 -1
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/authToken.d.ts +2 -0
- package/dist/src/authToken.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +140 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +63 -2
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +1 -0
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +16 -1
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +48 -2
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-viz-utils.d.ts +85 -0
- package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -0
- package/dist/src/embed/spotter-viz-utils.spec.d.ts +2 -0
- package/dist/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
- package/dist/src/embed/ts-embed.d.ts +58 -38
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/tokenizedFetch.d.ts.map +1 -1
- package/dist/src/tokenizedFetch.spec.d.ts +2 -0
- package/dist/src/tokenizedFetch.spec.d.ts.map +1 -0
- package/dist/src/types.d.ts +309 -40
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/logger.spec.d.ts +1 -0
- package/dist/src/utils/logger.spec.d.ts.map +1 -1
- package/dist/src/utils.d.ts +4 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +3418 -2899
- package/dist/tsembed-react.js +3420 -2901
- package/dist/tsembed.es.js +3426 -2905
- package/dist/tsembed.js +3419 -2898
- package/dist/visual-embed-sdk-react-full.d.ts +687 -78
- package/dist/visual-embed-sdk-react.d.ts +687 -78
- package/dist/visual-embed-sdk.d.ts +702 -80
- package/lib/package.json +1 -1
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +12 -2
- package/lib/src/auth.js.map +1 -1
- package/lib/src/auth.spec.js +38 -0
- package/lib/src/auth.spec.js.map +1 -1
- package/lib/src/authToken.d.ts +2 -0
- package/lib/src/authToken.d.ts.map +1 -1
- package/lib/src/authToken.js +2 -2
- package/lib/src/authToken.js.map +1 -1
- package/lib/src/css-variables.d.ts +140 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +63 -2
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +58 -7
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +201 -2
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.js +7 -2
- package/lib/src/embed/auto-frame-renderer.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.spec.js +387 -8
- package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +1 -0
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +11 -0
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/base.spec.js +22 -1
- package/lib/src/embed/base.spec.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.spec.js +86 -0
- package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +16 -1
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +5 -1
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +27 -1
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +48 -2
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +49 -8
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +139 -1
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.d.ts +85 -0
- package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -0
- package/lib/src/embed/spotter-viz-utils.js +13 -0
- package/lib/src/embed/spotter-viz-utils.js.map +1 -0
- package/lib/src/embed/spotter-viz-utils.spec.d.ts +2 -0
- package/lib/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
- package/lib/src/embed/spotter-viz-utils.spec.js +29 -0
- package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -0
- package/lib/src/embed/ts-embed.d.ts +58 -38
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +250 -154
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +397 -122
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +2 -1
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +3 -0
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/tokenizedFetch.d.ts.map +1 -1
- package/lib/src/tokenizedFetch.js +13 -10
- package/lib/src/tokenizedFetch.js.map +1 -1
- package/lib/src/tokenizedFetch.spec.d.ts +2 -0
- package/lib/src/tokenizedFetch.spec.d.ts.map +1 -0
- package/lib/src/tokenizedFetch.spec.js +65 -0
- package/lib/src/tokenizedFetch.spec.js.map +1 -0
- package/lib/src/types.d.ts +309 -40
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +251 -23
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js +6 -7
- package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/lib/src/utils/logger.js +2 -1
- package/lib/src/utils/logger.js.map +1 -1
- package/lib/src/utils/logger.spec.d.ts +1 -0
- package/lib/src/utils/logger.spec.d.ts.map +1 -1
- package/lib/src/utils/logger.spec.js +10 -9
- package/lib/src/utils/logger.spec.js.map +1 -1
- package/lib/src/utils.d.ts +4 -1
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +103 -9
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +164 -5
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +702 -80
- package/package.json +1 -1
- package/src/auth.spec.ts +55 -1
- package/src/auth.ts +11 -2
- package/src/authToken.ts +2 -2
- package/src/css-variables.ts +175 -1
- package/src/embed/app.spec.ts +260 -3
- package/src/embed/app.ts +127 -7
- package/src/embed/auto-frame-renderer.spec.ts +457 -58
- package/src/embed/auto-frame-renderer.ts +7 -2
- package/src/embed/base.spec.ts +25 -1
- package/src/embed/base.ts +19 -5
- package/src/embed/bodyless-conversation.spec.ts +93 -0
- package/src/embed/conversation.spec.ts +34 -0
- package/src/embed/conversation.ts +22 -1
- package/src/embed/liveboard.spec.ts +163 -1
- package/src/embed/liveboard.ts +106 -10
- package/src/embed/spotter-viz-utils.spec.ts +30 -0
- package/src/embed/spotter-viz-utils.ts +94 -0
- package/src/embed/ts-embed.spec.ts +564 -231
- package/src/embed/ts-embed.ts +384 -258
- package/src/index.ts +3 -0
- package/src/react/index.tsx +3 -0
- package/src/tokenizedFetch.spec.ts +81 -0
- package/src/tokenizedFetch.ts +14 -11
- package/src/types.ts +326 -36
- package/src/utils/authService/tokenizedAuthService.spec.ts +6 -6
- package/src/utils/logger.spec.ts +11 -9
- package/src/utils/logger.ts +2 -2
- package/src/utils.spec.ts +200 -4
- package/src/utils.ts +128 -9
|
@@ -50,6 +50,7 @@ beforeAll(() => {
|
|
|
50
50
|
const customisations = {
|
|
51
51
|
style: {
|
|
52
52
|
customCSS: {},
|
|
53
|
+
customCSSUrl: undefined,
|
|
53
54
|
},
|
|
54
55
|
content: {},
|
|
55
56
|
};
|
|
@@ -82,6 +83,9 @@ const getMockAppInitPayload = (data) => {
|
|
|
82
83
|
customVariablesForThirdPartyTools,
|
|
83
84
|
interceptTimeout: undefined,
|
|
84
85
|
interceptUrls: [],
|
|
86
|
+
shouldBypassPayloadValidation: undefined,
|
|
87
|
+
useHostEventsV2: undefined,
|
|
88
|
+
embedExpiryInAuthToken: true,
|
|
85
89
|
};
|
|
86
90
|
return {
|
|
87
91
|
type: index_1.EmbedEvent.APP_INIT,
|
|
@@ -370,7 +374,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
370
374
|
});
|
|
371
375
|
await (0, test_utils_1.executeAfterWait)(() => {
|
|
372
376
|
expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
|
|
373
|
-
reorderedHomepageModules: [
|
|
377
|
+
reorderedHomepageModules: [
|
|
378
|
+
types_1.HomepageModule.MyLibrary,
|
|
379
|
+
types_1.HomepageModule.Watchlist,
|
|
380
|
+
],
|
|
374
381
|
}));
|
|
375
382
|
});
|
|
376
383
|
});
|
|
@@ -516,10 +523,38 @@ describe('Unit test case for ts embed', () => {
|
|
|
516
523
|
});
|
|
517
524
|
await (0, test_utils_1.executeAfterWait)(() => {
|
|
518
525
|
expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
|
|
519
|
-
hiddenHomeLeftNavItems: [
|
|
526
|
+
hiddenHomeLeftNavItems: [
|
|
527
|
+
types_1.HomeLeftNavItem.Home,
|
|
528
|
+
types_1.HomeLeftNavItem.MonitorSubscription,
|
|
529
|
+
],
|
|
520
530
|
}));
|
|
521
531
|
});
|
|
522
532
|
});
|
|
533
|
+
test.each([
|
|
534
|
+
['not set', undefined, true],
|
|
535
|
+
['false', false, false],
|
|
536
|
+
['true', true, true],
|
|
537
|
+
])('embedExpiryInAuthToken is %s when refreshAuthTokenOnNearExpiry is %s', async (_label, refreshAuthTokenOnNearExpiry, expectedEmbedExpiry) => {
|
|
538
|
+
const mockEmbedEventPayload = {
|
|
539
|
+
type: index_1.EmbedEvent.APP_INIT,
|
|
540
|
+
data: {},
|
|
541
|
+
};
|
|
542
|
+
const searchEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
|
|
543
|
+
...defaultViewConfig,
|
|
544
|
+
refreshAuthTokenOnNearExpiry,
|
|
545
|
+
});
|
|
546
|
+
searchEmbed.render();
|
|
547
|
+
const mockPort = {
|
|
548
|
+
postMessage: jest.fn(),
|
|
549
|
+
};
|
|
550
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
551
|
+
const iframe = (0, test_utils_1.getIFrameEl)();
|
|
552
|
+
(0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
553
|
+
});
|
|
554
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
555
|
+
expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({ embedExpiryInAuthToken: expectedEmbedExpiry }));
|
|
556
|
+
});
|
|
557
|
+
});
|
|
523
558
|
test('when Embed event status have start status', (done) => {
|
|
524
559
|
const mockEmbedEventPayload = {
|
|
525
560
|
type: index_1.EmbedEvent.Save,
|
|
@@ -719,10 +754,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
719
754
|
customVariablesForThirdPartyTools: {},
|
|
720
755
|
}));
|
|
721
756
|
const customisationContent = mockPort.postMessage.mock.calls[0][0].data.customisations.content;
|
|
722
|
-
expect(customisationContent.stringIDsUrl)
|
|
723
|
-
|
|
724
|
-
expect(customisationContent.stringIDs)
|
|
725
|
-
.toEqual({
|
|
757
|
+
expect(customisationContent.stringIDsUrl).toBe('https://sample-string-ids-url.com');
|
|
758
|
+
expect(customisationContent.stringIDs).toEqual({
|
|
726
759
|
'liveboard.header.title': 'Dashboard name',
|
|
727
760
|
});
|
|
728
761
|
});
|
|
@@ -732,7 +765,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
732
765
|
type: index_1.EmbedEvent.APP_INIT,
|
|
733
766
|
data: {},
|
|
734
767
|
};
|
|
735
|
-
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
768
|
+
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
769
|
+
...defaultViewConfig,
|
|
770
|
+
exposeTranslationIDs: true,
|
|
771
|
+
});
|
|
736
772
|
searchEmbed.render();
|
|
737
773
|
const mockPort = {
|
|
738
774
|
postMessage: jest.fn(),
|
|
@@ -773,16 +809,16 @@ describe('Unit test case for ts embed', () => {
|
|
|
773
809
|
name: 'Valid Action',
|
|
774
810
|
target: types_1.CustomActionTarget.LIVEBOARD,
|
|
775
811
|
position: types_1.CustomActionsPosition.PRIMARY,
|
|
776
|
-
metadataIds: { liveboardIds: ['lb123'] }
|
|
812
|
+
metadataIds: { liveboardIds: ['lb123'] },
|
|
777
813
|
},
|
|
778
814
|
{
|
|
779
815
|
id: 'action2',
|
|
780
816
|
name: 'Another Valid Action',
|
|
781
817
|
target: types_1.CustomActionTarget.VIZ,
|
|
782
818
|
position: types_1.CustomActionsPosition.MENU,
|
|
783
|
-
metadataIds: { vizIds: ['viz456'] }
|
|
784
|
-
}
|
|
785
|
-
]
|
|
819
|
+
metadataIds: { vizIds: ['viz456'] },
|
|
820
|
+
},
|
|
821
|
+
],
|
|
786
822
|
});
|
|
787
823
|
searchEmbed.render();
|
|
788
824
|
const mockPort = {
|
|
@@ -808,15 +844,15 @@ describe('Unit test case for ts embed', () => {
|
|
|
808
844
|
name: 'Another Valid Action',
|
|
809
845
|
target: types_1.CustomActionTarget.VIZ,
|
|
810
846
|
position: types_1.CustomActionsPosition.MENU,
|
|
811
|
-
metadataIds: { vizIds: ['viz456'] }
|
|
847
|
+
metadataIds: { vizIds: ['viz456'] },
|
|
812
848
|
},
|
|
813
849
|
{
|
|
814
850
|
id: 'action1',
|
|
815
851
|
name: 'Valid Action',
|
|
816
852
|
target: types_1.CustomActionTarget.LIVEBOARD,
|
|
817
853
|
position: types_1.CustomActionsPosition.PRIMARY,
|
|
818
|
-
metadataIds: { liveboardIds: ['lb123'] }
|
|
819
|
-
}
|
|
854
|
+
metadataIds: { liveboardIds: ['lb123'] },
|
|
855
|
+
},
|
|
820
856
|
],
|
|
821
857
|
customVariablesForThirdPartyTools: {},
|
|
822
858
|
}));
|
|
@@ -829,14 +865,14 @@ describe('Unit test case for ts embed', () => {
|
|
|
829
865
|
id: 'action1',
|
|
830
866
|
name: 'Valid Action',
|
|
831
867
|
target: types_1.CustomActionTarget.LIVEBOARD,
|
|
832
|
-
position: types_1.CustomActionsPosition.PRIMARY
|
|
868
|
+
position: types_1.CustomActionsPosition.PRIMARY,
|
|
833
869
|
}),
|
|
834
870
|
expect.objectContaining({
|
|
835
871
|
id: 'action2',
|
|
836
872
|
name: 'Another Valid Action',
|
|
837
873
|
target: types_1.CustomActionTarget.VIZ,
|
|
838
|
-
position: types_1.CustomActionsPosition.MENU
|
|
839
|
-
})
|
|
874
|
+
position: types_1.CustomActionsPosition.MENU,
|
|
875
|
+
}),
|
|
840
876
|
]));
|
|
841
877
|
// Verify actions are sorted by name (alphabetically)
|
|
842
878
|
expect(appInitData.customActions[0].name).toBe('Another Valid Action');
|
|
@@ -890,7 +926,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
890
926
|
type: index_1.EmbedEvent.APP_INIT,
|
|
891
927
|
data: {},
|
|
892
928
|
};
|
|
893
|
-
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
929
|
+
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
930
|
+
...defaultViewConfig,
|
|
931
|
+
preRenderId: 'test',
|
|
932
|
+
});
|
|
894
933
|
searchEmbed.preRender();
|
|
895
934
|
const mockPort = {
|
|
896
935
|
postMessage: jest.fn(),
|
|
@@ -941,7 +980,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
941
980
|
type: index_1.EmbedEvent.AuthExpire,
|
|
942
981
|
data: {},
|
|
943
982
|
};
|
|
944
|
-
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
983
|
+
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
984
|
+
...defaultViewConfig,
|
|
985
|
+
preRenderId: 'test',
|
|
986
|
+
});
|
|
945
987
|
jest.spyOn(baseInstance, 'notifyAuthFailure');
|
|
946
988
|
searchEmbed.preRender();
|
|
947
989
|
const loggerSpy = jest.spyOn(logger_1.logger, 'error').mockImplementation(() => { });
|
|
@@ -1081,9 +1123,13 @@ describe('Unit test case for ts embed', () => {
|
|
|
1081
1123
|
// resetCachedPreauthInfo();
|
|
1082
1124
|
let mockGetPreauthInfo = null;
|
|
1083
1125
|
if (overrideOrgId) {
|
|
1084
|
-
mockGetPreauthInfo = jest
|
|
1126
|
+
mockGetPreauthInfo = jest
|
|
1127
|
+
.spyOn(sessionInfoService, 'getPreauthInfo')
|
|
1128
|
+
.mockImplementation(jest.fn());
|
|
1085
1129
|
}
|
|
1086
|
-
const mockPreauthInfoFetch = jest
|
|
1130
|
+
const mockPreauthInfoFetch = jest
|
|
1131
|
+
.spyOn(authService, 'fetchPreauthInfoService')
|
|
1132
|
+
.mockResolvedValueOnce({
|
|
1087
1133
|
ok: true,
|
|
1088
1134
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
1089
1135
|
json: async () => ({
|
|
@@ -1118,14 +1164,14 @@ describe('Unit test case for ts embed', () => {
|
|
|
1118
1164
|
};
|
|
1119
1165
|
};
|
|
1120
1166
|
test('should call InfoSuccess Event on preauth call success', async () => {
|
|
1121
|
-
const { mockPreauthInfoFetch, iFrame
|
|
1167
|
+
const { mockPreauthInfoFetch, iFrame } = await setup(true);
|
|
1122
1168
|
expect(mockPreauthInfoFetch).toHaveBeenCalledTimes(1);
|
|
1123
1169
|
await (0, test_utils_1.executeAfterWait)(() => {
|
|
1124
1170
|
expect(mockProcessTrigger).toHaveBeenCalledWith(iFrame, types_1.HostEvent.InfoSuccess, 'http://tshost', expect.objectContaining({ info: expect.any(Object) }), undefined);
|
|
1125
1171
|
});
|
|
1126
1172
|
});
|
|
1127
1173
|
test('should not call InfoSuccess Event if overrideOrgId is true', async () => {
|
|
1128
|
-
const { mockGetPreauthInfo
|
|
1174
|
+
const { mockGetPreauthInfo } = await setup(true, 123);
|
|
1129
1175
|
expect(mockGetPreauthInfo).toHaveBeenCalledTimes(0);
|
|
1130
1176
|
});
|
|
1131
1177
|
});
|
|
@@ -1158,14 +1204,17 @@ describe('Unit test case for ts embed', () => {
|
|
|
1158
1204
|
const isAppEmbedWithPrimaryNavbar = embedType === 'AppEmbed' && showPrimaryNavbar === true;
|
|
1159
1205
|
const shouldDisableCache = overrideOrgId || disablePreauthCache || isAppEmbedWithPrimaryNavbar;
|
|
1160
1206
|
if (shouldDisableCache) {
|
|
1161
|
-
mockGetPreauthInfo = jest
|
|
1207
|
+
mockGetPreauthInfo = jest
|
|
1208
|
+
.spyOn(sessionInfoService, 'getPreauthInfo')
|
|
1162
1209
|
.mockImplementation(jest.fn());
|
|
1163
1210
|
}
|
|
1164
1211
|
else {
|
|
1165
|
-
mockGetPreauthInfo = jest
|
|
1212
|
+
mockGetPreauthInfo = jest
|
|
1213
|
+
.spyOn(sessionInfoService, 'getPreauthInfo')
|
|
1166
1214
|
.mockResolvedValue({ info: { test: 'data' } });
|
|
1167
1215
|
}
|
|
1168
|
-
const mockPreauthInfoFetch = jest
|
|
1216
|
+
const mockPreauthInfoFetch = jest
|
|
1217
|
+
.spyOn(authService, 'fetchPreauthInfoService')
|
|
1169
1218
|
.mockResolvedValueOnce({
|
|
1170
1219
|
ok: true,
|
|
1171
1220
|
headers: new Headers({ 'content-type': 'application/json' }),
|
|
@@ -1637,8 +1686,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
1637
1686
|
},
|
|
1638
1687
|
});
|
|
1639
1688
|
await appEmbed.render();
|
|
1640
|
-
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
|
|
1641
|
-
|
|
1689
|
+
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
|
|
1690
|
+
`&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`);
|
|
1642
1691
|
});
|
|
1643
1692
|
it('should set the additional flags correctly on the iframe src from init and view config', async () => {
|
|
1644
1693
|
(0, index_1.init)({
|
|
@@ -1662,8 +1711,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
1662
1711
|
},
|
|
1663
1712
|
});
|
|
1664
1713
|
await appEmbed.render();
|
|
1665
|
-
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
|
|
1666
|
-
|
|
1714
|
+
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
|
|
1715
|
+
`&foo=bar&foo2=bar2&foo3=false&baz=1&bool=true${defaultParamsPost}#/home`);
|
|
1667
1716
|
});
|
|
1668
1717
|
it('Sets the showAlerts param', async () => {
|
|
1669
1718
|
const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
|
|
@@ -1674,8 +1723,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
1674
1723
|
showAlerts: true,
|
|
1675
1724
|
});
|
|
1676
1725
|
await appEmbed.render();
|
|
1677
|
-
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
|
|
1678
|
-
|
|
1726
|
+
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
|
|
1727
|
+
`&showAlerts=true${defaultParamsPost}#/home`);
|
|
1679
1728
|
});
|
|
1680
1729
|
it('Sets the locale param', async () => {
|
|
1681
1730
|
const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
|
|
@@ -1686,8 +1735,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
1686
1735
|
locale: 'ja-JP',
|
|
1687
1736
|
});
|
|
1688
1737
|
await appEmbed.render();
|
|
1689
|
-
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
|
|
1690
|
-
|
|
1738
|
+
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
|
|
1739
|
+
`&locale=ja-JP${defaultParamsPost}#/home`);
|
|
1691
1740
|
});
|
|
1692
1741
|
it('Sets both params when enableLinkOverridesV2 is set', async () => {
|
|
1693
1742
|
const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
@@ -1701,7 +1750,37 @@ describe('Unit test case for ts embed', () => {
|
|
|
1701
1750
|
await liveboardEmbed.render();
|
|
1702
1751
|
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&${test_utils_1.defaultParamsForPinboardEmbed}&enableLinkOverridesV2=true&linkOverride=true${defaultParamsPost}#/embed/viz/test-lb`);
|
|
1703
1752
|
});
|
|
1704
|
-
it('
|
|
1753
|
+
it('Auto-upgrades V1 linkOverride to V2 (sends both flags)', async () => {
|
|
1754
|
+
const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
1755
|
+
frameParams: {
|
|
1756
|
+
width: '100%',
|
|
1757
|
+
height: '100%',
|
|
1758
|
+
},
|
|
1759
|
+
liveboardId: 'test-lb',
|
|
1760
|
+
linkOverride: true,
|
|
1761
|
+
});
|
|
1762
|
+
await liveboardEmbed.render();
|
|
1763
|
+
const src = (0, test_utils_1.getIFrameSrc)();
|
|
1764
|
+
expect(src).toContain('linkOverride=true');
|
|
1765
|
+
expect(src).toContain('enableLinkOverridesV2=true');
|
|
1766
|
+
});
|
|
1767
|
+
it('Auto-disables V2 link overrides when disableRedirectionLinksInNewTab is true', async () => {
|
|
1768
|
+
const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
1769
|
+
frameParams: {
|
|
1770
|
+
width: '100%',
|
|
1771
|
+
height: '100%',
|
|
1772
|
+
},
|
|
1773
|
+
liveboardId: 'test-lb',
|
|
1774
|
+
enableLinkOverridesV2: true,
|
|
1775
|
+
disableRedirectionLinksInNewTab: true,
|
|
1776
|
+
});
|
|
1777
|
+
await liveboardEmbed.render();
|
|
1778
|
+
const src = (0, test_utils_1.getIFrameSrc)();
|
|
1779
|
+
expect(src).not.toContain('enableLinkOverridesV2=true');
|
|
1780
|
+
expect(src).not.toContain('linkOverride=true');
|
|
1781
|
+
expect(src).toContain('disableRedirectionLinksInNewTab=true');
|
|
1782
|
+
});
|
|
1783
|
+
it('Auto-disables V1 link override when disableRedirectionLinksInNewTab is true', async () => {
|
|
1705
1784
|
const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
1706
1785
|
frameParams: {
|
|
1707
1786
|
width: '100%',
|
|
@@ -1709,9 +1788,12 @@ describe('Unit test case for ts embed', () => {
|
|
|
1709
1788
|
},
|
|
1710
1789
|
liveboardId: 'test-lb',
|
|
1711
1790
|
linkOverride: true,
|
|
1791
|
+
disableRedirectionLinksInNewTab: true,
|
|
1712
1792
|
});
|
|
1713
1793
|
await liveboardEmbed.render();
|
|
1714
|
-
|
|
1794
|
+
const src = (0, test_utils_1.getIFrameSrc)();
|
|
1795
|
+
expect(src).not.toContain('linkOverride=true');
|
|
1796
|
+
expect(src).toContain('disableRedirectionLinksInNewTab=true');
|
|
1715
1797
|
});
|
|
1716
1798
|
it('Sets the iconSprite url', async () => {
|
|
1717
1799
|
const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
|
|
@@ -1724,8 +1806,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
1724
1806
|
},
|
|
1725
1807
|
});
|
|
1726
1808
|
await appEmbed.render();
|
|
1727
|
-
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
|
|
1728
|
-
|
|
1809
|
+
(0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
|
|
1810
|
+
`&iconSprite=iconSprite.com${defaultParamsPost}#/home`);
|
|
1729
1811
|
});
|
|
1730
1812
|
it('inserts as sibling of root node if configured', async () => {
|
|
1731
1813
|
const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
|
|
@@ -1958,22 +2040,26 @@ describe('Unit test case for ts embed', () => {
|
|
|
1958
2040
|
tsEmbedDiv.style.width = '100px';
|
|
1959
2041
|
tsEmbedDiv.style.height = '100px';
|
|
1960
2042
|
let resizeObserverCb;
|
|
1961
|
-
window.ResizeObserver =
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
2043
|
+
window.ResizeObserver =
|
|
2044
|
+
window.ResizeObserver ||
|
|
2045
|
+
jest.fn().mockImplementation((resizeObserverCbParam) => {
|
|
2046
|
+
resizeObserverCb = resizeObserverCbParam;
|
|
2047
|
+
return {
|
|
2048
|
+
disconnect: jest.fn(),
|
|
2049
|
+
observe: jest.fn(),
|
|
2050
|
+
unobserve: jest.fn(),
|
|
2051
|
+
};
|
|
2052
|
+
});
|
|
1970
2053
|
// show preRender
|
|
1971
2054
|
const warnSpy = jest.spyOn(logger_1.logger, 'warn');
|
|
1972
2055
|
libEmbed.showPreRender();
|
|
1973
2056
|
expect(warnSpy).toHaveBeenCalledTimes(1);
|
|
2057
|
+
// The ResizeObserver now tracks the placeholder inside this.el,
|
|
2058
|
+
// not this.el itself, so pass it as the target.
|
|
2059
|
+
const preRenderPlaceholder = tsEmbedDiv.firstElementChild;
|
|
1974
2060
|
resizeObserverCb([
|
|
1975
2061
|
{
|
|
1976
|
-
target:
|
|
2062
|
+
target: preRenderPlaceholder,
|
|
1977
2063
|
contentRect: { height: 297, width: 987 },
|
|
1978
2064
|
},
|
|
1979
2065
|
]);
|
|
@@ -2024,12 +2110,13 @@ describe('Unit test case for ts embed', () => {
|
|
|
2024
2110
|
});
|
|
2025
2111
|
it('should set overflow:hidden when hidePreRender and remove when showPreRender', async () => {
|
|
2026
2112
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
2027
|
-
window.ResizeObserver =
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2113
|
+
window.ResizeObserver =
|
|
2114
|
+
window.ResizeObserver ||
|
|
2115
|
+
jest.fn().mockImplementation(() => ({
|
|
2116
|
+
disconnect: jest.fn(),
|
|
2117
|
+
observe: jest.fn(),
|
|
2118
|
+
unobserve: jest.fn(),
|
|
2119
|
+
}));
|
|
2033
2120
|
const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
2034
2121
|
preRenderId: 'overflow-test',
|
|
2035
2122
|
liveboardId: 'myLiveboardId',
|
|
@@ -2055,27 +2142,28 @@ describe('Unit test case for ts embed', () => {
|
|
|
2055
2142
|
it('it should connect with another object', async () => {
|
|
2056
2143
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
2057
2144
|
(0, test_utils_1.mockMessageChannel)();
|
|
2058
|
-
window.ResizeObserver =
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2145
|
+
window.ResizeObserver =
|
|
2146
|
+
window.ResizeObserver ||
|
|
2147
|
+
jest.fn().mockImplementation(() => ({
|
|
2148
|
+
disconnect: jest.fn(),
|
|
2149
|
+
observe: jest.fn(),
|
|
2150
|
+
unobserve: jest.fn(),
|
|
2151
|
+
}));
|
|
2064
2152
|
const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
2065
2153
|
preRenderId: 'i-am-preRendered',
|
|
2066
2154
|
liveboardId: 'myLiveboardId',
|
|
2067
2155
|
});
|
|
2068
2156
|
libEmbed.preRender();
|
|
2069
2157
|
await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
|
|
2070
|
-
const warnSpy = jest.spyOn(logger_1.logger, 'warn');
|
|
2071
2158
|
const newEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
2072
2159
|
preRenderId: 'i-am-preRendered',
|
|
2073
2160
|
liveboardId: 'awdawda',
|
|
2074
2161
|
hiddenActions: [types_1.Action.AddFilter],
|
|
2075
2162
|
frameParams: { height: 90 },
|
|
2076
2163
|
});
|
|
2077
|
-
newEmbed.showPreRender();
|
|
2078
|
-
|
|
2164
|
+
await newEmbed.showPreRender();
|
|
2165
|
+
// Verify newEmbed successfully connected to the existing preRender
|
|
2166
|
+
expect(newEmbed.isPreRenderConnected()).toBe(true);
|
|
2079
2167
|
});
|
|
2080
2168
|
it('showPreRender should not preRender if not available', async () => {
|
|
2081
2169
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
@@ -2226,7 +2314,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
2226
2314
|
document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
|
|
2227
2315
|
});
|
|
2228
2316
|
test('Pre-render should wait for init to complete', async () => {
|
|
2229
|
-
const lib = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
2317
|
+
const lib = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
2318
|
+
preRenderId: 'test',
|
|
2319
|
+
liveboardId: 'test',
|
|
2320
|
+
});
|
|
2230
2321
|
lib.preRender();
|
|
2231
2322
|
await (0, test_utils_1.executeAfterWait)(() => {
|
|
2232
2323
|
expect(errorSpy).toHaveBeenCalledWith(errors_1.ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
|
|
@@ -2456,7 +2547,11 @@ describe('Unit test case for ts embed', () => {
|
|
|
2456
2547
|
expect(authToken.getAuthenticationToken).toHaveBeenCalledWith(expect.any(Object), true);
|
|
2457
2548
|
// Check that logger.error was called with the token refresh
|
|
2458
2549
|
// error
|
|
2459
|
-
const errorCalls = logger_1.logger.error.mock.calls.filter((call) => {
|
|
2550
|
+
const errorCalls = logger_1.logger.error.mock.calls.filter((call) => {
|
|
2551
|
+
var _a, _b;
|
|
2552
|
+
return ((_a = call[0]) === null || _a === void 0 ? void 0 : _a.includes(errors_1.ERROR_MESSAGE.INVALID_TOKEN_ERROR)) &&
|
|
2553
|
+
((_b = call[0]) === null || _b === void 0 ? void 0 : _b.includes('Token fetch failed'));
|
|
2554
|
+
});
|
|
2460
2555
|
expect(errorCalls.length).toBeGreaterThan(0);
|
|
2461
2556
|
expect(processData.processAuthFailure).toHaveBeenCalledWith(error, expect.any(Element));
|
|
2462
2557
|
expect(mockPort.postMessage).not.toHaveBeenCalled();
|
|
@@ -2618,8 +2713,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2618
2713
|
test('should return getPreRenderObj and log if same object', () => {
|
|
2619
2714
|
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
2620
2715
|
const loggerSpy = jest.spyOn(logger_1.logger, 'info');
|
|
2621
|
-
//
|
|
2622
|
-
searchEmbed.
|
|
2716
|
+
// getPreRenderObj reads the embed reference from preRenderWrapper
|
|
2717
|
+
searchEmbed.preRenderWrapper = {
|
|
2623
2718
|
[searchEmbed['embedNodeKey']]: searchEmbed,
|
|
2624
2719
|
};
|
|
2625
2720
|
const result = searchEmbed['getPreRenderObj']();
|
|
@@ -2668,7 +2763,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2668
2763
|
test('should return context when embed container is already loaded', async () => {
|
|
2669
2764
|
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
2670
2765
|
searchEmbed.isEmbedContainerLoaded = true;
|
|
2671
|
-
const triggerSpy = jest
|
|
2766
|
+
const triggerSpy = jest
|
|
2767
|
+
.spyOn(searchEmbed, 'trigger')
|
|
2672
2768
|
.mockResolvedValue(mockContext);
|
|
2673
2769
|
const context = await searchEmbed.getCurrentContext();
|
|
2674
2770
|
expect(context).toEqual(mockContext);
|
|
@@ -2677,7 +2773,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2677
2773
|
test('should wait for embed container to load before returning context', async () => {
|
|
2678
2774
|
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
2679
2775
|
searchEmbed.isEmbedContainerLoaded = false;
|
|
2680
|
-
const triggerSpy = jest
|
|
2776
|
+
const triggerSpy = jest
|
|
2777
|
+
.spyOn(searchEmbed, 'trigger')
|
|
2681
2778
|
.mockResolvedValue(mockContext);
|
|
2682
2779
|
const contextPromise = searchEmbed.getCurrentContext();
|
|
2683
2780
|
// Context should not be resolved yet
|
|
@@ -2863,9 +2960,11 @@ describe('Unit test case for ts embed', () => {
|
|
|
2863
2960
|
});
|
|
2864
2961
|
await appEmbed.render();
|
|
2865
2962
|
jest.spyOn(appEmbed, 'trigger').mockRejectedValue(new Error('trigger failed'));
|
|
2866
|
-
const removeChildSpy = jest
|
|
2963
|
+
const removeChildSpy = jest
|
|
2964
|
+
.spyOn(Node.prototype, 'removeChild')
|
|
2965
|
+
.mockImplementation(() => (0, test_utils_1.getRootEl)());
|
|
2867
2966
|
appEmbed.destroy();
|
|
2868
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
2967
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2869
2968
|
expect(removeChildSpy).toHaveBeenCalled();
|
|
2870
2969
|
embedConfig.setEmbedConfig(originalEmbedConfig);
|
|
2871
2970
|
});
|
|
@@ -2890,7 +2989,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
2890
2989
|
});
|
|
2891
2990
|
await appEmbed.render();
|
|
2892
2991
|
const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockResolvedValue(null);
|
|
2893
|
-
const removeChildSpy = jest
|
|
2992
|
+
const removeChildSpy = jest
|
|
2993
|
+
.spyOn(Node.prototype, 'removeChild')
|
|
2994
|
+
.mockImplementation(() => (0, test_utils_1.getRootEl)());
|
|
2894
2995
|
appEmbed.destroy();
|
|
2895
2996
|
expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
|
|
2896
2997
|
expect(removeChildSpy).toHaveBeenCalled();
|
|
@@ -2909,12 +3010,14 @@ describe('Unit test case for ts embed', () => {
|
|
|
2909
3010
|
});
|
|
2910
3011
|
await appEmbed.render();
|
|
2911
3012
|
const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockResolvedValue(null);
|
|
2912
|
-
const removeChildSpy = jest
|
|
3013
|
+
const removeChildSpy = jest
|
|
3014
|
+
.spyOn(Node.prototype, 'removeChild')
|
|
3015
|
+
.mockImplementation(() => (0, test_utils_1.getRootEl)());
|
|
2913
3016
|
appEmbed.destroy();
|
|
2914
3017
|
// Should be called immediately when config is enabled
|
|
2915
3018
|
expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
|
|
2916
3019
|
// Wait for the timeout to complete
|
|
2917
|
-
await new Promise(resolve => setTimeout(resolve, 1100));
|
|
3020
|
+
await new Promise((resolve) => setTimeout(resolve, 1100));
|
|
2918
3021
|
expect(removeChildSpy).toHaveBeenCalled();
|
|
2919
3022
|
});
|
|
2920
3023
|
it('should handle Promise.race with successful cleanup completion', async () => {
|
|
@@ -2931,11 +3034,15 @@ describe('Unit test case for ts embed', () => {
|
|
|
2931
3034
|
});
|
|
2932
3035
|
await appEmbed.render();
|
|
2933
3036
|
// Mock trigger to resolve quickly (before timeout)
|
|
2934
|
-
const triggerSpy = jest
|
|
2935
|
-
|
|
3037
|
+
const triggerSpy = jest
|
|
3038
|
+
.spyOn(appEmbed, 'trigger')
|
|
3039
|
+
.mockImplementation(() => new Promise((resolve) => setTimeout(() => resolve(null), 100)));
|
|
3040
|
+
const removeChildSpy = jest
|
|
3041
|
+
.spyOn(Node.prototype, 'removeChild')
|
|
3042
|
+
.mockImplementation(() => (0, test_utils_1.getRootEl)());
|
|
2936
3043
|
appEmbed.destroy();
|
|
2937
3044
|
// Wait for the trigger to complete
|
|
2938
|
-
await new Promise(resolve => setTimeout(resolve, 200));
|
|
3045
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
2939
3046
|
expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
|
|
2940
3047
|
expect(removeChildSpy).toHaveBeenCalled();
|
|
2941
3048
|
});
|
|
@@ -2953,11 +3060,15 @@ describe('Unit test case for ts embed', () => {
|
|
|
2953
3060
|
});
|
|
2954
3061
|
await appEmbed.render();
|
|
2955
3062
|
// Mock trigger to take longer than timeout
|
|
2956
|
-
const triggerSpy = jest
|
|
2957
|
-
|
|
3063
|
+
const triggerSpy = jest
|
|
3064
|
+
.spyOn(appEmbed, 'trigger')
|
|
3065
|
+
.mockImplementation(() => new Promise((resolve) => setTimeout(() => resolve(null), 500)));
|
|
3066
|
+
const removeChildSpy = jest
|
|
3067
|
+
.spyOn(Node.prototype, 'removeChild')
|
|
3068
|
+
.mockImplementation(() => (0, test_utils_1.getRootEl)());
|
|
2958
3069
|
appEmbed.destroy();
|
|
2959
3070
|
// Wait for the timeout to complete
|
|
2960
|
-
await new Promise(resolve => setTimeout(resolve, 200));
|
|
3071
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
2961
3072
|
expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
|
|
2962
3073
|
expect(removeChildSpy).toHaveBeenCalled();
|
|
2963
3074
|
});
|
|
@@ -2985,11 +3096,11 @@ describe('Unit test case for ts embed', () => {
|
|
|
2985
3096
|
body: JSON.stringify({
|
|
2986
3097
|
variables: {
|
|
2987
3098
|
session: { sessionId: 'session-123' },
|
|
2988
|
-
contextBookId: 'viz-456'
|
|
2989
|
-
}
|
|
2990
|
-
})
|
|
2991
|
-
}
|
|
2992
|
-
})
|
|
3099
|
+
contextBookId: 'viz-456',
|
|
3100
|
+
},
|
|
3101
|
+
}),
|
|
3102
|
+
},
|
|
3103
|
+
}),
|
|
2993
3104
|
};
|
|
2994
3105
|
const mockPort = {
|
|
2995
3106
|
postMessage: jest.fn(),
|
|
@@ -3020,8 +3131,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3020
3131
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3021
3132
|
data: JSON.stringify({
|
|
3022
3133
|
input: '/prism/?op=GetChartWithData',
|
|
3023
|
-
init: {}
|
|
3024
|
-
})
|
|
3134
|
+
init: {},
|
|
3135
|
+
}),
|
|
3025
3136
|
};
|
|
3026
3137
|
const mockPort = {
|
|
3027
3138
|
postMessage: jest.fn(),
|
|
@@ -3053,8 +3164,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3053
3164
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3054
3165
|
data: JSON.stringify({
|
|
3055
3166
|
input: '/prism/?op=GetChartWithData',
|
|
3056
|
-
init: {}
|
|
3057
|
-
})
|
|
3167
|
+
init: {},
|
|
3168
|
+
}),
|
|
3058
3169
|
};
|
|
3059
3170
|
const mockPort = {
|
|
3060
3171
|
postMessage: jest.fn(),
|
|
@@ -3071,7 +3182,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
3071
3182
|
// handleInterceptEvent
|
|
3072
3183
|
const result = await capturedGetUnsavedAnswerTml({
|
|
3073
3184
|
sessionId: 'session-123',
|
|
3074
|
-
vizId: 'viz-456'
|
|
3185
|
+
vizId: 'viz-456',
|
|
3075
3186
|
});
|
|
3076
3187
|
expect(mockProcessTrigger).toHaveBeenCalled();
|
|
3077
3188
|
const callArgs = mockProcessTrigger.mock.calls[0];
|
|
@@ -3081,8 +3192,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3081
3192
|
type: 'getUnsavedAnswerTML',
|
|
3082
3193
|
parameters: {
|
|
3083
3194
|
sessionId: 'session-123',
|
|
3084
|
-
vizId: 'viz-456'
|
|
3085
|
-
}
|
|
3195
|
+
vizId: 'viz-456',
|
|
3196
|
+
},
|
|
3086
3197
|
});
|
|
3087
3198
|
expect(result).toEqual(mockTmlResponse);
|
|
3088
3199
|
});
|
|
@@ -3099,8 +3210,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3099
3210
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3100
3211
|
data: JSON.stringify({
|
|
3101
3212
|
input: '/api/test',
|
|
3102
|
-
init: {}
|
|
3103
|
-
})
|
|
3213
|
+
init: {},
|
|
3214
|
+
}),
|
|
3104
3215
|
};
|
|
3105
3216
|
const mockPort = {
|
|
3106
3217
|
postMessage: jest.fn(),
|
|
@@ -3124,8 +3235,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3124
3235
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3125
3236
|
data: JSON.stringify({
|
|
3126
3237
|
input: '/prism/?op=GetChartWithData',
|
|
3127
|
-
init: {}
|
|
3128
|
-
})
|
|
3238
|
+
init: {},
|
|
3239
|
+
}),
|
|
3129
3240
|
};
|
|
3130
3241
|
const mockPort = {
|
|
3131
3242
|
postMessage: jest.fn(),
|
|
@@ -3166,15 +3277,15 @@ describe('Unit test case for ts embed', () => {
|
|
|
3166
3277
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3167
3278
|
data: JSON.stringify({
|
|
3168
3279
|
input: '/prism/?op=GetChartWithData',
|
|
3169
|
-
init: {}
|
|
3170
|
-
})
|
|
3280
|
+
init: {},
|
|
3281
|
+
}),
|
|
3171
3282
|
};
|
|
3172
3283
|
const mockEventData2 = {
|
|
3173
3284
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3174
3285
|
data: JSON.stringify({
|
|
3175
3286
|
input: '/prism/?op=LoadContextBook',
|
|
3176
|
-
init: {}
|
|
3177
|
-
})
|
|
3287
|
+
init: {},
|
|
3288
|
+
}),
|
|
3178
3289
|
};
|
|
3179
3290
|
const mockPort = {
|
|
3180
3291
|
postMessage: jest.fn(),
|
|
@@ -3203,8 +3314,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3203
3314
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3204
3315
|
data: JSON.stringify({
|
|
3205
3316
|
input: '/prism/?op=GetChartWithData',
|
|
3206
|
-
init: {}
|
|
3207
|
-
})
|
|
3317
|
+
init: {},
|
|
3318
|
+
}),
|
|
3208
3319
|
};
|
|
3209
3320
|
const mockPort = {
|
|
3210
3321
|
postMessage: jest.fn(),
|
|
@@ -3235,8 +3346,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3235
3346
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3236
3347
|
data: JSON.stringify({
|
|
3237
3348
|
input: '/prism/?op=GetChartWithData',
|
|
3238
|
-
init: {}
|
|
3239
|
-
})
|
|
3349
|
+
init: {},
|
|
3350
|
+
}),
|
|
3240
3351
|
};
|
|
3241
3352
|
const mockPort = {
|
|
3242
3353
|
postMessage: jest.fn(),
|
|
@@ -3249,7 +3360,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
3249
3360
|
expect(capturedGetUnsavedAnswerTml).toBeDefined();
|
|
3250
3361
|
const result = await capturedGetUnsavedAnswerTml({
|
|
3251
3362
|
sessionId: 'session-123',
|
|
3252
|
-
vizId: 'viz-456'
|
|
3363
|
+
vizId: 'viz-456',
|
|
3253
3364
|
});
|
|
3254
3365
|
expect(result).toBeUndefined();
|
|
3255
3366
|
});
|
|
@@ -3264,8 +3375,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3264
3375
|
type: index_1.EmbedEvent.ApiIntercept,
|
|
3265
3376
|
data: JSON.stringify({
|
|
3266
3377
|
input: '/prism/?op=LoadContextBook',
|
|
3267
|
-
init: {}
|
|
3268
|
-
})
|
|
3378
|
+
init: {},
|
|
3379
|
+
}),
|
|
3269
3380
|
};
|
|
3270
3381
|
const mockPort = {
|
|
3271
3382
|
postMessage: jest.fn(),
|
|
@@ -3499,12 +3610,13 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3499
3610
|
const setupPreRenderTest = async (preRenderId, initialConfig) => {
|
|
3500
3611
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
3501
3612
|
(0, test_utils_1.mockMessageChannel)();
|
|
3502
|
-
window.ResizeObserver =
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3613
|
+
window.ResizeObserver =
|
|
3614
|
+
window.ResizeObserver ||
|
|
3615
|
+
jest.fn().mockImplementation(() => ({
|
|
3616
|
+
disconnect: jest.fn(),
|
|
3617
|
+
observe: jest.fn(),
|
|
3618
|
+
unobserve: jest.fn(),
|
|
3619
|
+
}));
|
|
3508
3620
|
const embed1 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
3509
3621
|
preRenderId,
|
|
3510
3622
|
...initialConfig,
|
|
@@ -3655,7 +3767,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3655
3767
|
authType: index_1.AuthType.None,
|
|
3656
3768
|
});
|
|
3657
3769
|
});
|
|
3658
|
-
// Matches the structure produced by createValidationError /
|
|
3770
|
+
// Matches the structure produced by createValidationError /
|
|
3771
|
+
// embedErrorDetails
|
|
3659
3772
|
const makeNestedValidationData = (message = 'invalid payload') => ({
|
|
3660
3773
|
type: index_1.EmbedEvent.Error,
|
|
3661
3774
|
data: {
|
|
@@ -3665,7 +3778,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3665
3778
|
error: message,
|
|
3666
3779
|
},
|
|
3667
3780
|
});
|
|
3668
|
-
// Matches the flat structure where errorType sits at the top level of
|
|
3781
|
+
// Matches the flat structure where errorType sits at the top level of
|
|
3782
|
+
// data
|
|
3669
3783
|
const makeFlatValidationData = (message = 'invalid payload') => ({
|
|
3670
3784
|
errorType: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
|
|
3671
3785
|
message,
|
|
@@ -3706,14 +3820,20 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3706
3820
|
});
|
|
3707
3821
|
test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is undefined', () => {
|
|
3708
3822
|
const errorHandler = jest.fn();
|
|
3709
|
-
const embed = makeEmbed({
|
|
3823
|
+
const embed = makeEmbed({
|
|
3824
|
+
useHostEventsV2: true,
|
|
3825
|
+
shouldBypassPayloadValidation: undefined,
|
|
3826
|
+
});
|
|
3710
3827
|
embed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
3711
3828
|
embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
|
|
3712
3829
|
expect(errorHandler).toHaveBeenCalled();
|
|
3713
3830
|
});
|
|
3714
3831
|
test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is false', () => {
|
|
3715
3832
|
const errorHandler = jest.fn();
|
|
3716
|
-
const embed = makeEmbed({
|
|
3833
|
+
const embed = makeEmbed({
|
|
3834
|
+
useHostEventsV2: true,
|
|
3835
|
+
shouldBypassPayloadValidation: false,
|
|
3836
|
+
});
|
|
3717
3837
|
embed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
3718
3838
|
embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
|
|
3719
3839
|
expect(errorHandler).toHaveBeenCalled();
|
|
@@ -3721,7 +3841,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3721
3841
|
test('skips Error event when useHostEventsV2 is false regardless of shouldBypassPayloadValidation', () => {
|
|
3722
3842
|
jest.spyOn(logger_1.logger, 'warn');
|
|
3723
3843
|
const errorHandler = jest.fn();
|
|
3724
|
-
const embed = makeEmbed({
|
|
3844
|
+
const embed = makeEmbed({
|
|
3845
|
+
useHostEventsV2: false,
|
|
3846
|
+
shouldBypassPayloadValidation: undefined,
|
|
3847
|
+
});
|
|
3725
3848
|
embed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
3726
3849
|
embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
|
|
3727
3850
|
expect(errorHandler).not.toHaveBeenCalled();
|
|
@@ -3737,7 +3860,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3737
3860
|
test('skips Error event when useHostEventsV2 is false and shouldBypassPayloadValidation is true', () => {
|
|
3738
3861
|
jest.spyOn(logger_1.logger, 'warn');
|
|
3739
3862
|
const errorHandler = jest.fn();
|
|
3740
|
-
const embed = makeEmbed({
|
|
3863
|
+
const embed = makeEmbed({
|
|
3864
|
+
useHostEventsV2: false,
|
|
3865
|
+
shouldBypassPayloadValidation: true,
|
|
3866
|
+
});
|
|
3741
3867
|
embed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
3742
3868
|
embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
|
|
3743
3869
|
expect(errorHandler).not.toHaveBeenCalled();
|
|
@@ -3762,14 +3888,20 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3762
3888
|
});
|
|
3763
3889
|
test('delivers Error event to EmbedEvent.ALL handler when not skipped', () => {
|
|
3764
3890
|
const allHandler = jest.fn();
|
|
3765
|
-
const embed = makeEmbed({
|
|
3891
|
+
const embed = makeEmbed({
|
|
3892
|
+
useHostEventsV2: true,
|
|
3893
|
+
shouldBypassPayloadValidation: false,
|
|
3894
|
+
});
|
|
3766
3895
|
embed.on(index_1.EmbedEvent.ALL, allHandler);
|
|
3767
3896
|
embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
|
|
3768
3897
|
expect(allHandler).toHaveBeenCalled();
|
|
3769
3898
|
});
|
|
3770
3899
|
test('does not skip non-Error events even with HOST_EVENT_VALIDATION error code', () => {
|
|
3771
3900
|
const customActionHandler = jest.fn();
|
|
3772
|
-
const embed = makeEmbed({
|
|
3901
|
+
const embed = makeEmbed({
|
|
3902
|
+
useHostEventsV2: true,
|
|
3903
|
+
shouldBypassPayloadValidation: false,
|
|
3904
|
+
});
|
|
3773
3905
|
embed.on(index_1.EmbedEvent.CustomAction, customActionHandler);
|
|
3774
3906
|
embed.executeCallbacks(index_1.EmbedEvent.CustomAction, {
|
|
3775
3907
|
data: { code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION },
|
|
@@ -3778,7 +3910,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3778
3910
|
});
|
|
3779
3911
|
test('does not skip Error events with unrelated error codes', () => {
|
|
3780
3912
|
const errorHandler = jest.fn();
|
|
3781
|
-
const embed = makeEmbed({
|
|
3913
|
+
const embed = makeEmbed({
|
|
3914
|
+
useHostEventsV2: true,
|
|
3915
|
+
shouldBypassPayloadValidation: false,
|
|
3916
|
+
});
|
|
3782
3917
|
embed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
3783
3918
|
embed.executeCallbacks(index_1.EmbedEvent.Error, {
|
|
3784
3919
|
errorType: 'SOME_OTHER_ERROR',
|
|
@@ -3787,5 +3922,145 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
3787
3922
|
expect(errorHandler).toHaveBeenCalled();
|
|
3788
3923
|
});
|
|
3789
3924
|
});
|
|
3925
|
+
describe('constructor init-path branching (SCAL-315058)', () => {
|
|
3926
|
+
beforeEach(() => {
|
|
3927
|
+
(0, index_1.init)({
|
|
3928
|
+
thoughtSpotHost: 'tshost',
|
|
3929
|
+
authType: index_1.AuthType.None,
|
|
3930
|
+
});
|
|
3931
|
+
});
|
|
3932
|
+
it('sets hostElement from domSelector', () => {
|
|
3933
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3934
|
+
expect(embed.hostElement).toBe((0, test_utils_1.getRootEl)());
|
|
3935
|
+
});
|
|
3936
|
+
it('skips isReadyForRenderPromise when init already completed', () => {
|
|
3937
|
+
jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(true);
|
|
3938
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3939
|
+
expect(embed.shouldWaitForRenderPromise).toBe(false);
|
|
3940
|
+
expect(embed.isReadyForRenderPromise).toBeUndefined();
|
|
3941
|
+
});
|
|
3942
|
+
it('sets isReadyForRenderPromise when init not yet completed', () => {
|
|
3943
|
+
jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
|
|
3944
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3945
|
+
expect(embed.shouldWaitForRenderPromise).toBe(true);
|
|
3946
|
+
expect(embed.isReadyForRenderPromise).toBeInstanceOf(Promise);
|
|
3947
|
+
});
|
|
3948
|
+
it('afterInit runs synchronously when init already completed', () => {
|
|
3949
|
+
jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(true);
|
|
3950
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3951
|
+
// thoughtSpotHost is set by afterInit;
|
|
3952
|
+
// must be non-empty after constructor
|
|
3953
|
+
expect(embed.thoughtSpotHost).toBeTruthy();
|
|
3954
|
+
});
|
|
3955
|
+
it('does not set isReadyForRenderPromise when shouldWaitForRenderPromise is false', () => {
|
|
3956
|
+
jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(true);
|
|
3957
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3958
|
+
expect(embed.shouldWaitForRenderPromise).toBe(false);
|
|
3959
|
+
// isReadyForRenderPromise must be undefined
|
|
3960
|
+
// so no unnecessary await occurs
|
|
3961
|
+
expect(embed.isReadyForRenderPromise).toBeUndefined();
|
|
3962
|
+
});
|
|
3963
|
+
it('shouldWaitForRenderPromise flips to false after promise settles', async () => {
|
|
3964
|
+
jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
|
|
3965
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3966
|
+
expect(embed.shouldWaitForRenderPromise).toBe(true);
|
|
3967
|
+
await embed.isReadyForRenderPromise;
|
|
3968
|
+
expect(embed.shouldWaitForRenderPromise).toBe(false);
|
|
3969
|
+
});
|
|
3970
|
+
it('calls throwInitError when getInitPromise rejects', async () => {
|
|
3971
|
+
jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
|
|
3972
|
+
jest.spyOn(baseInstance, 'getInitPromise').mockReturnValue(Promise.reject(new Error('init failed')));
|
|
3973
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3974
|
+
const throwInitErrorSpy = jest.spyOn(embed, 'throwInitError');
|
|
3975
|
+
await embed.isReadyForRenderPromise;
|
|
3976
|
+
expect(throwInitErrorSpy).toHaveBeenCalled();
|
|
3977
|
+
});
|
|
3978
|
+
it('shouldWaitForRenderPromise flips to false even when getInitPromise rejects', async () => {
|
|
3979
|
+
jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
|
|
3980
|
+
jest.spyOn(baseInstance, 'getInitPromise').mockReturnValue(Promise.reject(new Error('init failed')));
|
|
3981
|
+
const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3982
|
+
await embed.isReadyForRenderPromise;
|
|
3983
|
+
expect(embed.shouldWaitForRenderPromise).toBe(false);
|
|
3984
|
+
});
|
|
3985
|
+
});
|
|
3986
|
+
describe('preRender ID object includes placeHolder (SCAL-315058)', () => {
|
|
3987
|
+
beforeAll(() => {
|
|
3988
|
+
(0, index_1.init)({
|
|
3989
|
+
thoughtSpotHost: 'tshost',
|
|
3990
|
+
authType: index_1.AuthType.None,
|
|
3991
|
+
});
|
|
3992
|
+
});
|
|
3993
|
+
it('getPreRenderIds returns placeHolder key', () => {
|
|
3994
|
+
(0, test_utils_1.createRootEleForEmbed)();
|
|
3995
|
+
const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
3996
|
+
preRenderId: 'ph-test',
|
|
3997
|
+
liveboardId: 'lb-id',
|
|
3998
|
+
});
|
|
3999
|
+
const ids = embed.getPreRenderIds();
|
|
4000
|
+
expect(ids.placeHolder).toBe('tsEmbed-pre-render-placeholder-ph-test');
|
|
4001
|
+
});
|
|
4002
|
+
});
|
|
4003
|
+
describe('isPreRenderConnected logic (SCAL-315058)', () => {
|
|
4004
|
+
beforeAll(() => {
|
|
4005
|
+
(0, index_1.init)({
|
|
4006
|
+
thoughtSpotHost: 'tshost',
|
|
4007
|
+
authType: index_1.AuthType.None,
|
|
4008
|
+
});
|
|
4009
|
+
});
|
|
4010
|
+
it('returns false when preRenderWrapper is absent', () => {
|
|
4011
|
+
(0, test_utils_1.createRootEleForEmbed)();
|
|
4012
|
+
const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4013
|
+
preRenderId: 'conn-test',
|
|
4014
|
+
liveboardId: 'lb-id',
|
|
4015
|
+
});
|
|
4016
|
+
expect(embed.isPreRenderConnected()).toBe(false);
|
|
4017
|
+
});
|
|
4018
|
+
it('returns true once preRenderWrapper and preRenderChild are set', () => {
|
|
4019
|
+
(0, test_utils_1.createRootEleForEmbed)();
|
|
4020
|
+
const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4021
|
+
preRenderId: 'conn-test-2',
|
|
4022
|
+
liveboardId: 'lb-id',
|
|
4023
|
+
});
|
|
4024
|
+
embed.preRenderWrapper = document.createElement('div');
|
|
4025
|
+
embed.preRenderChild = document.createElement('div');
|
|
4026
|
+
expect(embed.isPreRenderConnected()).toBe(true);
|
|
4027
|
+
});
|
|
4028
|
+
});
|
|
4029
|
+
describe('showPreRender inserts placeholder into hostElement (SCAL-315058)', () => {
|
|
4030
|
+
beforeAll(() => {
|
|
4031
|
+
// Clear spy implementations that may have leaked from prior
|
|
4032
|
+
// describe blocks (e.g. getIsInitCompleted/getInitPromise mocks set
|
|
4033
|
+
// in 'constructor init-path branching' persist across describes
|
|
4034
|
+
// because clearAllMocks only clears call history, not
|
|
4035
|
+
// implementations).
|
|
4036
|
+
jest.restoreAllMocks();
|
|
4037
|
+
jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(undefined);
|
|
4038
|
+
(0, index_1.init)({
|
|
4039
|
+
thoughtSpotHost: 'tshost',
|
|
4040
|
+
authType: index_1.AuthType.None,
|
|
4041
|
+
});
|
|
4042
|
+
window.ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
4043
|
+
disconnect: jest.fn(),
|
|
4044
|
+
observe: jest.fn(),
|
|
4045
|
+
unobserve: jest.fn(),
|
|
4046
|
+
}));
|
|
4047
|
+
});
|
|
4048
|
+
it('showPreRender creates a placeholder element with the correct id', async () => {
|
|
4049
|
+
(0, test_utils_1.createRootEleForEmbed)();
|
|
4050
|
+
const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4051
|
+
preRenderId: 'ph-lifecycle-test',
|
|
4052
|
+
liveboardId: 'lb-id',
|
|
4053
|
+
});
|
|
4054
|
+
await embed.preRender();
|
|
4055
|
+
await (0, test_utils_1.waitFor)(() => !!document.querySelector('#tsEmbed-pre-render-child-ph-lifecycle-test'));
|
|
4056
|
+
await embed.showPreRender();
|
|
4057
|
+
const placeholderEle = embed.getPreRenderPlaceHolderElement();
|
|
4058
|
+
expect(placeholderEle).not.toBeNull();
|
|
4059
|
+
expect(placeholderEle.id).toBe('tsEmbed-pre-render-placeholder-ph-lifecycle-test');
|
|
4060
|
+
// placeholder is attached to a parent element (inside hostElement)
|
|
4061
|
+
expect(placeholderEle.parentElement).not.toBeNull();
|
|
4062
|
+
embed.destroy();
|
|
4063
|
+
});
|
|
4064
|
+
});
|
|
3790
4065
|
});
|
|
3791
4066
|
//# sourceMappingURL=ts-embed.spec.js.map
|