@thoughtspot/visual-embed-sdk 1.52.2-beta.2 → 1.53.1
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/contracts/contracts.spec.js +4 -0
- package/cjs/src/contracts/contracts.spec.js.map +1 -1
- package/cjs/src/contracts/host-event-contracts.d.ts +10 -0
- package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -1
- package/cjs/src/css-variables.d.ts +373 -5
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +15 -0
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +6 -3
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +28 -0
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.d.ts.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.js +244 -4
- package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.spec.js +389 -0
- package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.js +1 -1
- package/cjs/src/embed/bodyless-conversation.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +29 -0
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +7 -3
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +88 -0
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/host-events.spec.js +32 -0
- package/cjs/src/embed/host-events.spec.js.map +1 -1
- package/cjs/src/embed/liveboard-override-utils.d.ts +59 -0
- package/cjs/src/embed/liveboard-override-utils.d.ts.map +1 -0
- package/cjs/src/embed/liveboard-override-utils.js +19 -0
- package/cjs/src/embed/liveboard-override-utils.js.map +1 -0
- package/cjs/src/embed/liveboard-override-utils.spec.d.ts +2 -0
- package/cjs/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
- package/cjs/src/embed/liveboard-override-utils.spec.js +34 -0
- package/cjs/src/embed/liveboard-override-utils.spec.js.map +1 -0
- package/cjs/src/embed/liveboard.d.ts +44 -13
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +19 -23
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +122 -0
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/search-bar.js +1 -1
- package/cjs/src/embed/search-bar.js.map +1 -1
- package/cjs/src/embed/search.js +1 -1
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +20 -0
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/spotter-utils.d.ts +12 -0
- package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-utils.js +20 -2
- package/cjs/src/embed/spotter-utils.js.map +1 -1
- package/cjs/src/embed/spotter-utils.spec.js +19 -0
- package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.d.ts +15 -0
- package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.spec.js +11 -0
- package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +18 -20
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +181 -45
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +610 -0
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +5 -3
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +4 -2
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/mixpanel-service.d.ts +1 -0
- package/cjs/src/mixpanel-service.d.ts.map +1 -1
- package/cjs/src/mixpanel-service.js +1 -0
- package/cjs/src/mixpanel-service.js.map +1 -1
- package/cjs/src/react/all-types-export.d.ts +1 -1
- package/cjs/src/react/all-types-export.d.ts.map +1 -1
- package/cjs/src/react/all-types-export.js +2 -1
- package/cjs/src/react/all-types-export.js.map +1 -1
- package/cjs/src/types.d.ts +251 -4
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +176 -0
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.js +8 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.d.ts +28 -4
- package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.js +39 -4
- package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js +124 -0
- package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/cjs/src/utils/runtimeTelemetry.d.ts +11 -0
- package/cjs/src/utils/runtimeTelemetry.d.ts.map +1 -0
- package/cjs/src/utils/runtimeTelemetry.js +34 -0
- package/cjs/src/utils/runtimeTelemetry.js.map +1 -0
- package/cjs/src/utils/runtimeTelemetry.spec.d.ts +2 -0
- package/cjs/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
- package/cjs/src/utils/runtimeTelemetry.spec.js +124 -0
- package/cjs/src/utils/runtimeTelemetry.spec.js.map +1 -0
- package/dist/{index-CnHREfvN.js → index-CrBnZBZv.js} +1 -1
- package/dist/src/contracts/host-event-contracts.d.ts +10 -0
- package/dist/src/contracts/host-event-contracts.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +373 -5
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +15 -0
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/auto-frame-renderer.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +29 -0
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/liveboard-override-utils.d.ts +59 -0
- package/dist/src/embed/liveboard-override-utils.d.ts.map +1 -0
- package/dist/src/embed/liveboard-override-utils.spec.d.ts +2 -0
- package/dist/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
- package/dist/src/embed/liveboard.d.ts +44 -13
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-utils.d.ts +12 -0
- package/dist/src/embed/spotter-utils.d.ts.map +1 -1
- package/dist/src/embed/spotter-viz-utils.d.ts +15 -0
- package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +18 -20
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/mixpanel-service.d.ts +1 -0
- package/dist/src/mixpanel-service.d.ts.map +1 -1
- package/dist/src/react/all-types-export.d.ts +1 -1
- package/dist/src/react/all-types-export.d.ts.map +1 -1
- package/dist/src/types.d.ts +251 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/dist/src/utils/graphql/answerService/answerService.d.ts +28 -4
- package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/dist/src/utils/runtimeTelemetry.d.ts +11 -0
- package/dist/src/utils/runtimeTelemetry.d.ts.map +1 -0
- package/dist/src/utils/runtimeTelemetry.spec.d.ts +2 -0
- package/dist/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
- package/dist/tsembed-react.es.js +500 -85
- package/dist/tsembed-react.js +499 -84
- package/dist/tsembed.es.js +743 -90
- package/dist/tsembed.js +741 -88
- package/dist/visual-embed-sdk-react-full.d.ts +788 -44
- package/dist/visual-embed-sdk-react.d.ts +783 -44
- package/dist/visual-embed-sdk.d.ts +815 -45
- package/lib/package.json +1 -1
- package/lib/src/contracts/contracts.spec.js +4 -0
- package/lib/src/contracts/contracts.spec.js.map +1 -1
- package/lib/src/contracts/host-event-contracts.d.ts +10 -0
- package/lib/src/contracts/host-event-contracts.d.ts.map +1 -1
- package/lib/src/css-variables.d.ts +373 -5
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +15 -0
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +7 -4
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +28 -0
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.d.ts.map +1 -1
- package/lib/src/embed/auto-frame-renderer.js +244 -4
- package/lib/src/embed/auto-frame-renderer.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.spec.js +389 -0
- package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.js +1 -1
- package/lib/src/embed/bodyless-conversation.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +29 -0
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +8 -4
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +89 -1
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/host-events.spec.js +32 -0
- package/lib/src/embed/host-events.spec.js.map +1 -1
- package/lib/src/embed/liveboard-override-utils.d.ts +59 -0
- package/lib/src/embed/liveboard-override-utils.d.ts.map +1 -0
- package/lib/src/embed/liveboard-override-utils.js +15 -0
- package/lib/src/embed/liveboard-override-utils.js.map +1 -0
- package/lib/src/embed/liveboard-override-utils.spec.d.ts +2 -0
- package/lib/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
- package/lib/src/embed/liveboard-override-utils.spec.js +32 -0
- package/lib/src/embed/liveboard-override-utils.spec.js.map +1 -0
- package/lib/src/embed/liveboard.d.ts +44 -13
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +19 -23
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +122 -0
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/search-bar.js +1 -1
- package/lib/src/embed/search-bar.js.map +1 -1
- package/lib/src/embed/search.js +1 -1
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +20 -0
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/spotter-utils.d.ts +12 -0
- package/lib/src/embed/spotter-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-utils.js +19 -1
- package/lib/src/embed/spotter-utils.js.map +1 -1
- package/lib/src/embed/spotter-utils.spec.js +19 -0
- package/lib/src/embed/spotter-utils.spec.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.d.ts +15 -0
- package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-viz-utils.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.spec.js +11 -0
- package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +18 -20
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +181 -45
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +611 -1
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +5 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +3 -2
- package/lib/src/index.js.map +1 -1
- package/lib/src/mixpanel-service.d.ts +1 -0
- package/lib/src/mixpanel-service.d.ts.map +1 -1
- package/lib/src/mixpanel-service.js +1 -0
- package/lib/src/mixpanel-service.js.map +1 -1
- package/lib/src/react/all-types-export.d.ts +1 -1
- package/lib/src/react/all-types-export.d.ts.map +1 -1
- package/lib/src/react/all-types-export.js +1 -1
- package/lib/src/react/all-types-export.js.map +1 -1
- package/lib/src/types.d.ts +251 -4
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +176 -0
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/lib/src/utils/graphql/answerService/answer-queries.js +7 -0
- package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.d.ts +28 -4
- package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.js +39 -4
- package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js +125 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/lib/src/utils/runtimeTelemetry.d.ts +11 -0
- package/lib/src/utils/runtimeTelemetry.d.ts.map +1 -0
- package/lib/src/utils/runtimeTelemetry.js +28 -0
- package/lib/src/utils/runtimeTelemetry.js.map +1 -0
- package/lib/src/utils/runtimeTelemetry.spec.d.ts +2 -0
- package/lib/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
- package/lib/src/utils/runtimeTelemetry.spec.js +122 -0
- package/lib/src/utils/runtimeTelemetry.spec.js.map +1 -0
- package/lib/src/visual-embed-sdk.d.ts +815 -45
- package/package.json +1 -1
- package/src/contracts/contracts.spec.ts +4 -0
- package/src/contracts/host-event-contracts.ts +13 -0
- package/src/css-variables.ts +475 -26
- package/src/embed/app.spec.ts +32 -0
- package/src/embed/app.ts +29 -4
- package/src/embed/auto-frame-renderer.spec.ts +464 -0
- package/src/embed/auto-frame-renderer.ts +305 -6
- package/src/embed/bodyless-conversation.ts +1 -1
- package/src/embed/conversation.spec.ts +118 -1
- package/src/embed/conversation.ts +42 -3
- package/src/embed/host-events.spec.ts +44 -0
- package/src/embed/liveboard-override-utils.spec.ts +38 -0
- package/src/embed/liveboard-override-utils.ts +71 -0
- package/src/embed/liveboard.spec.ts +138 -0
- package/src/embed/liveboard.ts +64 -24
- package/src/embed/search-bar.tsx +1 -1
- package/src/embed/search.spec.ts +23 -0
- package/src/embed/search.ts +1 -1
- package/src/embed/spotter-utils.spec.ts +20 -0
- package/src/embed/spotter-utils.ts +24 -1
- package/src/embed/spotter-viz-utils.spec.ts +11 -0
- package/src/embed/spotter-viz-utils.ts +15 -0
- package/src/embed/ts-embed.spec.ts +767 -0
- package/src/embed/ts-embed.ts +186 -41
- package/src/index.ts +18 -1
- package/src/mixpanel-service.ts +1 -0
- package/src/react/all-types-export.ts +7 -0
- package/src/types.ts +254 -5
- package/src/utils/graphql/answerService/answer-queries.ts +8 -0
- package/src/utils/graphql/answerService/answerService.spec.ts +145 -1
- package/src/utils/graphql/answerService/answerService.ts +65 -3
- package/src/utils/runtimeTelemetry.spec.ts +148 -0
- package/src/utils/runtimeTelemetry.ts +50 -0
|
@@ -11,6 +11,7 @@ const test_utils_1 = require("../test/test-utils");
|
|
|
11
11
|
const config = tslib_1.__importStar(require("../config"));
|
|
12
12
|
const embedConfig = tslib_1.__importStar(require("./embedConfig"));
|
|
13
13
|
const tsEmbedInstance = tslib_1.__importStar(require("./ts-embed"));
|
|
14
|
+
const ts_embed_1 = require("./ts-embed");
|
|
14
15
|
const mixpanelInstance = tslib_1.__importStar(require("../mixpanel-service"));
|
|
15
16
|
const authInstance = tslib_1.__importStar(require("../auth"));
|
|
16
17
|
const baseInstance = tslib_1.__importStar(require("./base"));
|
|
@@ -1095,6 +1096,26 @@ describe('Unit test case for ts embed', () => {
|
|
|
1095
1096
|
elHeight: 0,
|
|
1096
1097
|
}));
|
|
1097
1098
|
});
|
|
1099
|
+
test('should send visual-sdk-init-actions with configured actions, [] when unused', async () => {
|
|
1100
|
+
await new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
1101
|
+
hiddenActions: [types_1.Action.Download],
|
|
1102
|
+
disabledActions: [types_1.Action.Edit],
|
|
1103
|
+
}).render();
|
|
1104
|
+
expect(mockMixPanelEvent).toHaveBeenCalledWith(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_INIT_ACTIONS, expect.objectContaining({
|
|
1105
|
+
hiddenActions: [types_1.Action.Download],
|
|
1106
|
+
visibleActions: [],
|
|
1107
|
+
disabledActions: [types_1.Action.Edit],
|
|
1108
|
+
}));
|
|
1109
|
+
mockMixPanelEvent.mockClear();
|
|
1110
|
+
await new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
|
|
1111
|
+
visibleActions: [types_1.Action.Save],
|
|
1112
|
+
}).render();
|
|
1113
|
+
expect(mockMixPanelEvent).toHaveBeenCalledWith(mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_INIT_ACTIONS, expect.objectContaining({
|
|
1114
|
+
hiddenActions: [],
|
|
1115
|
+
visibleActions: [types_1.Action.Save],
|
|
1116
|
+
disabledActions: [],
|
|
1117
|
+
}));
|
|
1118
|
+
});
|
|
1098
1119
|
test('Should remove prefetch iframe', async () => {
|
|
1099
1120
|
await setup(true);
|
|
1100
1121
|
const prefetchIframe = document.querySelectorAll('.prefetchIframe');
|
|
@@ -2112,6 +2133,71 @@ describe('Unit test case for ts embed', () => {
|
|
|
2112
2133
|
});
|
|
2113
2134
|
});
|
|
2114
2135
|
});
|
|
2136
|
+
describe('isDarkMode', () => {
|
|
2137
|
+
const renderAppEmbed = async (viewConfig = {}) => {
|
|
2138
|
+
const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
|
|
2139
|
+
frameParams: {
|
|
2140
|
+
width: '100%',
|
|
2141
|
+
height: '100%',
|
|
2142
|
+
},
|
|
2143
|
+
...viewConfig,
|
|
2144
|
+
});
|
|
2145
|
+
appEmbed.render();
|
|
2146
|
+
await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
|
|
2147
|
+
return (0, test_utils_1.getIFrameSrc)();
|
|
2148
|
+
};
|
|
2149
|
+
it('sends the appearance the host asked for in init, with the radiant theme', async () => {
|
|
2150
|
+
(0, index_1.init)({
|
|
2151
|
+
thoughtSpotHost: 'tshost',
|
|
2152
|
+
authType: index_1.AuthType.None,
|
|
2153
|
+
isDarkMode: true,
|
|
2154
|
+
});
|
|
2155
|
+
(0, test_utils_1.expectUrlToHaveParamsWithValues)(await renderAppEmbed(), {
|
|
2156
|
+
isDarkMode: true,
|
|
2157
|
+
radiantThemeEnabled: true,
|
|
2158
|
+
});
|
|
2159
|
+
});
|
|
2160
|
+
it('sends an explicit false', async () => {
|
|
2161
|
+
(0, index_1.init)({
|
|
2162
|
+
thoughtSpotHost: 'tshost',
|
|
2163
|
+
authType: index_1.AuthType.None,
|
|
2164
|
+
isDarkMode: false,
|
|
2165
|
+
});
|
|
2166
|
+
const src = await renderAppEmbed();
|
|
2167
|
+
(0, test_utils_1.expectUrlToHaveParamsWithValues)(src, { isDarkMode: false });
|
|
2168
|
+
// `false` leaves the radiant theme to the cluster.
|
|
2169
|
+
expect(src).not.toContain('radiantThemeEnabled=');
|
|
2170
|
+
});
|
|
2171
|
+
it('omits the param when the host says nothing', async () => {
|
|
2172
|
+
(0, index_1.init)({
|
|
2173
|
+
thoughtSpotHost: 'tshost',
|
|
2174
|
+
authType: index_1.AuthType.None,
|
|
2175
|
+
});
|
|
2176
|
+
// Absent rather than `isDarkMode=false`: an omitted param keeps the
|
|
2177
|
+
// URL short, and the app treats a missing param like `false`.
|
|
2178
|
+
const src = await renderAppEmbed();
|
|
2179
|
+
expect(src).not.toContain('isDarkMode=');
|
|
2180
|
+
expect(src).not.toContain('radiantThemeEnabled=');
|
|
2181
|
+
});
|
|
2182
|
+
it('lets the view config override the value set in init', async () => {
|
|
2183
|
+
(0, index_1.init)({
|
|
2184
|
+
thoughtSpotHost: 'tshost',
|
|
2185
|
+
authType: index_1.AuthType.None,
|
|
2186
|
+
isDarkMode: true,
|
|
2187
|
+
});
|
|
2188
|
+
const src = await renderAppEmbed({ isDarkMode: false });
|
|
2189
|
+
(0, test_utils_1.expectUrlToHaveParamsWithValues)(src, { isDarkMode: false });
|
|
2190
|
+
expect(src).not.toContain('radiantThemeEnabled=');
|
|
2191
|
+
});
|
|
2192
|
+
it('lets additionalFlags override the radiant theme it turns on', async () => {
|
|
2193
|
+
(0, index_1.init)({
|
|
2194
|
+
thoughtSpotHost: 'tshost',
|
|
2195
|
+
authType: index_1.AuthType.None,
|
|
2196
|
+
isDarkMode: true,
|
|
2197
|
+
});
|
|
2198
|
+
(0, test_utils_1.expectUrlToHaveParamsWithValues)(await renderAppEmbed({ additionalFlags: { radiantThemeEnabled: false } }), { isDarkMode: true, radiantThemeEnabled: false });
|
|
2199
|
+
});
|
|
2200
|
+
});
|
|
2115
2201
|
describe('validate preRender flow', () => {
|
|
2116
2202
|
beforeAll(() => {
|
|
2117
2203
|
(0, index_1.init)({
|
|
@@ -2468,7 +2554,12 @@ describe('Unit test case for ts embed', () => {
|
|
|
2468
2554
|
const wrapper = document.getElementById(libEmbed.getPreRenderIds().wrapper);
|
|
2469
2555
|
expect(wrapper.style.transform).toBe('');
|
|
2470
2556
|
libEmbed.hidePreRender();
|
|
2557
|
+
// Detached from every scroll container (fixed, resolves to the
|
|
2558
|
+
// viewport), parked for the captured-fixed case, size
|
|
2559
|
+
// preserved.
|
|
2560
|
+
expect(wrapper.style.position).toBe('fixed');
|
|
2471
2561
|
expect(wrapper.style.transform).toBe('translateY(-100%)');
|
|
2562
|
+
expect(wrapper.style.height).not.toBe('');
|
|
2472
2563
|
await libEmbed.showPreRender();
|
|
2473
2564
|
expect(wrapper.style.transform).toBe('');
|
|
2474
2565
|
libEmbed.destroy();
|
|
@@ -5495,4 +5586,523 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
5495
5586
|
});
|
|
5496
5587
|
});
|
|
5497
5588
|
});
|
|
5589
|
+
describe('excludeConfigFromURL', () => {
|
|
5590
|
+
const lbConfig = {
|
|
5591
|
+
liveboardId,
|
|
5592
|
+
hiddenActions: [types_1.Action.Download],
|
|
5593
|
+
additionalFlags: { internalBlinkFlag: true },
|
|
5594
|
+
liveboardV2: true,
|
|
5595
|
+
};
|
|
5596
|
+
const withPostMessage = (viewConfig) => ({
|
|
5597
|
+
...viewConfig,
|
|
5598
|
+
additionalFlags: { ...viewConfig.additionalFlags, excludeConfigFromURL: true },
|
|
5599
|
+
});
|
|
5600
|
+
const renderAndGetSrc = async (viewConfig) => {
|
|
5601
|
+
const embed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), { ...defaultViewConfig, ...viewConfig });
|
|
5602
|
+
await embed.render();
|
|
5603
|
+
await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
|
|
5604
|
+
return { embed, src: (0, test_utils_1.getIFrameSrc)() };
|
|
5605
|
+
};
|
|
5606
|
+
const signalFrameReady = () => {
|
|
5607
|
+
(0, test_utils_1.postMessageToParent)((0, test_utils_1.getIFrameEl)().contentWindow, {
|
|
5608
|
+
type: index_1.EmbedEvent.EmbedListenerReady,
|
|
5609
|
+
});
|
|
5610
|
+
};
|
|
5611
|
+
beforeEach(() => {
|
|
5612
|
+
document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
|
|
5613
|
+
mockProcessTrigger.mockReset();
|
|
5614
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
5615
|
+
(0, index_1.init)({
|
|
5616
|
+
thoughtSpotHost,
|
|
5617
|
+
authType: index_1.AuthType.None,
|
|
5618
|
+
});
|
|
5619
|
+
});
|
|
5620
|
+
test('leaves the URL untouched when the flag is not set', async () => {
|
|
5621
|
+
const { src } = await renderAndGetSrc(lbConfig);
|
|
5622
|
+
expect(src).toContain('hideAction=');
|
|
5623
|
+
expect(src).toContain('internalBlinkFlag=true');
|
|
5624
|
+
expect(src).toContain('isPinboardV2Enabled=true');
|
|
5625
|
+
});
|
|
5626
|
+
test('keeps only the bootstrap params on the URL when the flag is set', async () => {
|
|
5627
|
+
const { src } = await renderAndGetSrc(withPostMessage(lbConfig));
|
|
5628
|
+
// Boot and auth handshake stays on the URL.
|
|
5629
|
+
expect(src).toContain('hostAppUrl=');
|
|
5630
|
+
expect(src).toContain(`authType=${index_1.AuthType.None}`);
|
|
5631
|
+
expect(src).toContain(`sdkVersion=${package_json_1.version}`);
|
|
5632
|
+
expect(src).toContain('blockNonEmbedFullAppAccess=true');
|
|
5633
|
+
expect(src).toContain('viewPortHeight=');
|
|
5634
|
+
// View configuration and internal flags do not.
|
|
5635
|
+
expect(src).not.toContain('hideAction=');
|
|
5636
|
+
expect(src).not.toContain('internalBlinkFlag');
|
|
5637
|
+
});
|
|
5638
|
+
describe('BOOTSTRAP_URL_PARAMS', () => {
|
|
5639
|
+
test('keeps the auth and origin params', () => {
|
|
5640
|
+
[types_1.Param.EmbedApp, types_1.Param.HostAppUrl, types_1.Param.Version, types_1.Param.AuthType].forEach((param) => {
|
|
5641
|
+
expect(ts_embed_1.BOOTSTRAP_URL_PARAMS.has(param)).toBe(true);
|
|
5642
|
+
});
|
|
5643
|
+
});
|
|
5644
|
+
test('leaves the layout flags to the APP_INIT payload', () => {
|
|
5645
|
+
[
|
|
5646
|
+
types_1.Param.LiveboardV2Enabled,
|
|
5647
|
+
types_1.Param.PrimaryNavHidden,
|
|
5648
|
+
types_1.Param.HideSearchBar,
|
|
5649
|
+
types_1.Param.SpotterExperienceVersion,
|
|
5650
|
+
].forEach((param) => {
|
|
5651
|
+
expect(ts_embed_1.BOOTSTRAP_URL_PARAMS.has(param)).toBe(false);
|
|
5652
|
+
});
|
|
5653
|
+
});
|
|
5654
|
+
});
|
|
5655
|
+
describe('params held back from the URL go in the APP_INIT payload', () => {
|
|
5656
|
+
const renderEmbed = async (EmbedClass, viewConfig, excludeConfig = true) => {
|
|
5657
|
+
const embed = new EmbedClass((0, test_utils_1.getRootEl)(), {
|
|
5658
|
+
...defaultViewConfig,
|
|
5659
|
+
...viewConfig,
|
|
5660
|
+
additionalFlags: {
|
|
5661
|
+
...viewConfig.additionalFlags,
|
|
5662
|
+
...(excludeConfig && { excludeConfigFromURL: true }),
|
|
5663
|
+
},
|
|
5664
|
+
});
|
|
5665
|
+
await embed.render();
|
|
5666
|
+
await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
|
|
5667
|
+
return embed;
|
|
5668
|
+
};
|
|
5669
|
+
const requestAppInit = async () => {
|
|
5670
|
+
const mockPort = { postMessage: jest.fn() };
|
|
5671
|
+
(0, test_utils_1.postMessageToParent)((0, test_utils_1.getIFrameEl)().contentWindow, { type: index_1.EmbedEvent.APP_INIT, data: {} }, mockPort);
|
|
5672
|
+
await (0, test_utils_1.waitFor)(() => mockPort.postMessage.mock.calls.length > 0);
|
|
5673
|
+
return mockPort.postMessage.mock.calls[0][0].data;
|
|
5674
|
+
};
|
|
5675
|
+
const getAppInitFor = async (EmbedClass, viewConfig) => {
|
|
5676
|
+
await renderEmbed(EmbedClass, viewConfig);
|
|
5677
|
+
return requestAppInit();
|
|
5678
|
+
};
|
|
5679
|
+
test('sends the app navigation and page version flags', async () => {
|
|
5680
|
+
const { embedParams } = await getAppInitFor(index_1.AppEmbed, {
|
|
5681
|
+
showPrimaryNavbar: false,
|
|
5682
|
+
hideHamburger: true,
|
|
5683
|
+
hideNotification: true,
|
|
5684
|
+
hideObjectSearch: true,
|
|
5685
|
+
hideOrgSwitcher: true,
|
|
5686
|
+
hideApplicationSwitcher: true,
|
|
5687
|
+
disableProfileAndHelp: true,
|
|
5688
|
+
hideHomepageLeftNav: true,
|
|
5689
|
+
hideTagFilterChips: true,
|
|
5690
|
+
modularHomeExperience: true,
|
|
5691
|
+
liveboardV2: true,
|
|
5692
|
+
});
|
|
5693
|
+
expect(embedParams).toEqual(expect.objectContaining({
|
|
5694
|
+
[types_1.Param.PrimaryNavHidden]: true,
|
|
5695
|
+
[types_1.Param.HideHamburger]: true,
|
|
5696
|
+
[types_1.Param.HideNotification]: true,
|
|
5697
|
+
[types_1.Param.HideObjectSearch]: true,
|
|
5698
|
+
[types_1.Param.HideOrgSwitcher]: true,
|
|
5699
|
+
[types_1.Param.HideApplicationSwitcher]: true,
|
|
5700
|
+
[types_1.Param.HideProfleAndHelp]: true,
|
|
5701
|
+
[types_1.Param.HideHomepageLeftNav]: true,
|
|
5702
|
+
[types_1.Param.HideTagFilterChips]: true,
|
|
5703
|
+
[types_1.Param.ModularHomeExperienceEnabled]: true,
|
|
5704
|
+
[types_1.Param.LiveboardV2Enabled]: true,
|
|
5705
|
+
[types_1.Param.NavigationVersion]: expect.any(String),
|
|
5706
|
+
[types_1.Param.HomepageVersion]: expect.any(String),
|
|
5707
|
+
}));
|
|
5708
|
+
});
|
|
5709
|
+
test('sends the Liveboard layout flags', async () => {
|
|
5710
|
+
const { embedParams } = await getAppInitFor(index_1.LiveboardEmbed, {
|
|
5711
|
+
liveboardId,
|
|
5712
|
+
visibleVizs: ['viz-1'],
|
|
5713
|
+
hideLiveboardHeader: true,
|
|
5714
|
+
showLiveboardTitle: true,
|
|
5715
|
+
showLiveboardDescription: true,
|
|
5716
|
+
hideTabPanel: true,
|
|
5717
|
+
enable2ColumnLayout: true,
|
|
5718
|
+
isLiveboardHeaderSticky: true,
|
|
5719
|
+
showLiveboardVerifiedBadge: true,
|
|
5720
|
+
});
|
|
5721
|
+
expect(embedParams).toEqual(expect.objectContaining({
|
|
5722
|
+
[types_1.Param.visibleVizs]: ['viz-1'],
|
|
5723
|
+
[types_1.Param.HideLiveboardHeader]: true,
|
|
5724
|
+
[types_1.Param.ShowLiveboardTitle]: true,
|
|
5725
|
+
[types_1.Param.ShowLiveboardDescription]: true,
|
|
5726
|
+
[types_1.Param.HideTabPanel]: true,
|
|
5727
|
+
[types_1.Param.Enable2ColumnLayout]: true,
|
|
5728
|
+
[types_1.Param.LiveboardHeaderSticky]: true,
|
|
5729
|
+
[types_1.Param.ShowLiveboardVerifiedBadge]: true,
|
|
5730
|
+
}));
|
|
5731
|
+
});
|
|
5732
|
+
test('sends the search layout flags and the initial query', async () => {
|
|
5733
|
+
const { embedParams } = await getAppInitFor(index_1.SearchEmbed, {
|
|
5734
|
+
dataSource: 'ds-1',
|
|
5735
|
+
searchOptions: {
|
|
5736
|
+
searchTokenString: '[revenue]',
|
|
5737
|
+
executeSearch: true,
|
|
5738
|
+
},
|
|
5739
|
+
hideResults: true,
|
|
5740
|
+
hideSearchBar: true,
|
|
5741
|
+
collapseSearchBarInitially: true,
|
|
5742
|
+
enableSearchAssist: true,
|
|
5743
|
+
});
|
|
5744
|
+
expect(embedParams).toEqual(expect.objectContaining({
|
|
5745
|
+
[types_1.Param.HideResult]: true,
|
|
5746
|
+
[types_1.Param.HideSearchBar]: true,
|
|
5747
|
+
[types_1.Param.CollapseSearchBarInitially]: true,
|
|
5748
|
+
[types_1.Param.EnableSearchAssist]: true,
|
|
5749
|
+
[types_1.Param.executeSearch]: true,
|
|
5750
|
+
[types_1.Param.DataSourceMode]: expect.anything(),
|
|
5751
|
+
}));
|
|
5752
|
+
expect(embedParams).not.toHaveProperty(types_1.Param.searchTokenString);
|
|
5753
|
+
});
|
|
5754
|
+
test('sends the Spotter empty-screen flags', async () => {
|
|
5755
|
+
const { embedParams } = await getAppInitFor(index_1.SpotterEmbed, {
|
|
5756
|
+
worksheetId: 'worksheet-1',
|
|
5757
|
+
hideSampleQuestions: true,
|
|
5758
|
+
hideSourceSelection: true,
|
|
5759
|
+
disableSourceSelection: true,
|
|
5760
|
+
showSpotterLimitations: true,
|
|
5761
|
+
showSpotterRadiance: true,
|
|
5762
|
+
updatedSpotterChatPrompt: true,
|
|
5763
|
+
spotterChatConfig: { enableStarterPrompts: true },
|
|
5764
|
+
});
|
|
5765
|
+
expect(embedParams).toEqual(expect.objectContaining({
|
|
5766
|
+
[types_1.Param.HideSampleQuestions]: true,
|
|
5767
|
+
[types_1.Param.HideSourceSelection]: true,
|
|
5768
|
+
[types_1.Param.DisableSourceSelection]: true,
|
|
5769
|
+
[types_1.Param.ShowSpotterLimitations]: true,
|
|
5770
|
+
[types_1.Param.ShowSpotterRadiance]: true,
|
|
5771
|
+
[types_1.Param.UpdatedSpotterChatPrompt]: true,
|
|
5772
|
+
[types_1.Param.IsStarterPromptsEnabled]: true,
|
|
5773
|
+
}));
|
|
5774
|
+
});
|
|
5775
|
+
test('sends the action and tab lists and the additionalFlags', async () => {
|
|
5776
|
+
await renderEmbed(index_1.LiveboardEmbed, {
|
|
5777
|
+
liveboardId,
|
|
5778
|
+
visibleActions: [types_1.Action.Download],
|
|
5779
|
+
visibleTabs: ['tab-1'],
|
|
5780
|
+
additionalFlags: { internalBlinkFlag: true },
|
|
5781
|
+
});
|
|
5782
|
+
const src = (0, test_utils_1.getIFrameSrc)();
|
|
5783
|
+
const { embedParams } = await requestAppInit();
|
|
5784
|
+
expect(src).not.toContain(`${types_1.Param.VisibleActions}=`);
|
|
5785
|
+
expect(src).not.toContain(`${types_1.Param.VisibleTabs}=`);
|
|
5786
|
+
expect(embedParams).toEqual(expect.objectContaining({
|
|
5787
|
+
[types_1.Param.VisibleActions]: [types_1.Action.Download],
|
|
5788
|
+
[types_1.Param.VisibleTabs]: ['tab-1'],
|
|
5789
|
+
internalBlinkFlag: true,
|
|
5790
|
+
}));
|
|
5791
|
+
});
|
|
5792
|
+
test('sends the feature flags only in embedParams', async () => {
|
|
5793
|
+
const appInitData = await getAppInitFor(index_1.AppEmbed, {
|
|
5794
|
+
showPrimaryNavbar: false,
|
|
5795
|
+
liveboardV2: true,
|
|
5796
|
+
dataPanelV2: true,
|
|
5797
|
+
});
|
|
5798
|
+
const featureFlags = {
|
|
5799
|
+
[types_1.Param.PrimaryNavHidden]: true,
|
|
5800
|
+
[types_1.Param.LiveboardV2Enabled]: true,
|
|
5801
|
+
[types_1.Param.DataPanelV2Enabled]: true,
|
|
5802
|
+
};
|
|
5803
|
+
// The app overrides its feature flags from embedParams.
|
|
5804
|
+
expect(appInitData.embedParams).toEqual(expect.objectContaining(featureFlags));
|
|
5805
|
+
Object.keys(featureFlags).forEach((flag) => {
|
|
5806
|
+
expect(appInitData).not.toHaveProperty(flag);
|
|
5807
|
+
});
|
|
5808
|
+
});
|
|
5809
|
+
test("lets the embed's own embedParams win over a param of the same name", async () => {
|
|
5810
|
+
const { embedParams } = await getAppInitFor(index_1.SpotterEmbed, {
|
|
5811
|
+
worksheetId: 'worksheet-1',
|
|
5812
|
+
spotterSidebarConfig: { enablePastConversationsSidebar: true },
|
|
5813
|
+
additionalFlags: { spotterSidebarConfig: 'from-flags' },
|
|
5814
|
+
});
|
|
5815
|
+
expect(embedParams.spotterSidebarConfig).toEqual(expect.objectContaining({ enablePastConversationsSidebar: true }));
|
|
5816
|
+
});
|
|
5817
|
+
test("keeps the embed's own embedParams alongside the params", async () => {
|
|
5818
|
+
const { embedParams } = await getAppInitFor(index_1.SpotterEmbed, {
|
|
5819
|
+
worksheetId: 'worksheet-1',
|
|
5820
|
+
hideSampleQuestions: true,
|
|
5821
|
+
spotterSidebarConfig: { enablePastConversationsSidebar: true },
|
|
5822
|
+
});
|
|
5823
|
+
expect(embedParams).toEqual(expect.objectContaining({
|
|
5824
|
+
[types_1.Param.HideSampleQuestions]: true,
|
|
5825
|
+
spotterSidebarConfig: expect.objectContaining({
|
|
5826
|
+
enablePastConversationsSidebar: true,
|
|
5827
|
+
}),
|
|
5828
|
+
}));
|
|
5829
|
+
});
|
|
5830
|
+
test('keeps the search token on the URL', async () => {
|
|
5831
|
+
const { embedParams } = await getAppInitFor(index_1.SearchEmbed, {
|
|
5832
|
+
dataSource: 'ds-1',
|
|
5833
|
+
searchOptions: { searchTokenString: '[revenue] [region]' },
|
|
5834
|
+
});
|
|
5835
|
+
expect(new URL((0, test_utils_1.getIFrameSrc)()).searchParams.get(types_1.Param.searchTokenString)).toBe('[revenue] [region]');
|
|
5836
|
+
expect(embedParams).not.toHaveProperty(types_1.Param.searchTokenString);
|
|
5837
|
+
});
|
|
5838
|
+
test('sends the token in searchOptions when it is excluded from the URL', async () => {
|
|
5839
|
+
const appInitData = await getAppInitFor(index_1.SearchEmbed, {
|
|
5840
|
+
dataSource: 'ds-1',
|
|
5841
|
+
excludeSearchTokenStringFromURL: true,
|
|
5842
|
+
searchOptions: { searchTokenString: '[revenue]' },
|
|
5843
|
+
});
|
|
5844
|
+
expect((0, test_utils_1.getIFrameSrc)()).not.toContain(types_1.Param.searchTokenString);
|
|
5845
|
+
// The app merges searchOptions.searchTokenString into embedParams.
|
|
5846
|
+
expect(appInitData.searchOptions).toEqual({ searchTokenString: '[revenue]' });
|
|
5847
|
+
expect(appInitData.embedParams).not.toHaveProperty(types_1.Param.searchTokenString);
|
|
5848
|
+
});
|
|
5849
|
+
test('sends a flag the caller set to false', async () => {
|
|
5850
|
+
const { embedParams } = await getAppInitFor(index_1.AppEmbed, {
|
|
5851
|
+
showPrimaryNavbar: true,
|
|
5852
|
+
liveboardV2: false,
|
|
5853
|
+
modularHomeExperience: false,
|
|
5854
|
+
});
|
|
5855
|
+
expect(embedParams).toEqual(expect.objectContaining({
|
|
5856
|
+
[types_1.Param.PrimaryNavHidden]: false,
|
|
5857
|
+
[types_1.Param.LiveboardV2Enabled]: false,
|
|
5858
|
+
[types_1.Param.ModularHomeExperienceEnabled]: false,
|
|
5859
|
+
}));
|
|
5860
|
+
});
|
|
5861
|
+
test('sends a flag only when the caller sets it', async () => {
|
|
5862
|
+
const { embedParams } = await getAppInitFor(index_1.AppEmbed, {});
|
|
5863
|
+
expect(embedParams).not.toHaveProperty(types_1.Param.HideHamburger);
|
|
5864
|
+
expect(embedParams).not.toHaveProperty(types_1.Param.HideNotification);
|
|
5865
|
+
expect(embedParams).not.toHaveProperty(types_1.Param.ModularHomeExperienceEnabled);
|
|
5866
|
+
});
|
|
5867
|
+
test('does not repeat the params that stay on the URL', async () => {
|
|
5868
|
+
const { embedParams } = await getAppInitFor(index_1.LiveboardEmbed, { liveboardId });
|
|
5869
|
+
Object.keys(embedParams).forEach((key) => {
|
|
5870
|
+
expect(ts_embed_1.BOOTSTRAP_URL_PARAMS.has(key)).toBe(false);
|
|
5871
|
+
});
|
|
5872
|
+
});
|
|
5873
|
+
test('leaves the APP_INIT payload unchanged when the flag is not set', async () => {
|
|
5874
|
+
await renderEmbed(index_1.LiveboardEmbed, { liveboardId, hideLiveboardHeader: true }, false);
|
|
5875
|
+
const appInitData = await requestAppInit();
|
|
5876
|
+
expect(appInitData).not.toHaveProperty('embedParams');
|
|
5877
|
+
expect(appInitData).not.toHaveProperty(types_1.Param.HideLiveboardHeader);
|
|
5878
|
+
});
|
|
5879
|
+
test('sends no embedParams when every param stays on the URL', async () => {
|
|
5880
|
+
const getParams = jest
|
|
5881
|
+
.spyOn(index_1.LiveboardEmbed.prototype, 'getEmbedParamsObject')
|
|
5882
|
+
.mockReturnValue({
|
|
5883
|
+
[types_1.Param.EmbedApp]: true,
|
|
5884
|
+
[types_1.Param.AuthType]: index_1.AuthType.None,
|
|
5885
|
+
});
|
|
5886
|
+
await renderEmbed(index_1.LiveboardEmbed, { liveboardId });
|
|
5887
|
+
const appInitData = await requestAppInit();
|
|
5888
|
+
getParams.mockRestore();
|
|
5889
|
+
expect(appInitData).not.toHaveProperty('embedParams');
|
|
5890
|
+
});
|
|
5891
|
+
test('sends the params when excludeConfigFromURL is set in init', async () => {
|
|
5892
|
+
(0, index_1.init)({
|
|
5893
|
+
thoughtSpotHost,
|
|
5894
|
+
authType: index_1.AuthType.None,
|
|
5895
|
+
additionalFlags: { excludeConfigFromURL: true },
|
|
5896
|
+
});
|
|
5897
|
+
await renderEmbed(index_1.LiveboardEmbed, { liveboardId, hideLiveboardHeader: true }, false);
|
|
5898
|
+
const { embedParams } = await requestAppInit();
|
|
5899
|
+
expect((0, test_utils_1.getIFrameSrc)()).not.toContain(`${types_1.Param.HideLiveboardHeader}=`);
|
|
5900
|
+
expect(embedParams).toEqual(expect.objectContaining({ [types_1.Param.HideLiveboardHeader]: true }));
|
|
5901
|
+
});
|
|
5902
|
+
test('sends the params for a pre-rendered embed', async () => {
|
|
5903
|
+
window.ResizeObserver =
|
|
5904
|
+
window.ResizeObserver ||
|
|
5905
|
+
jest.fn().mockImplementation(() => ({
|
|
5906
|
+
disconnect: jest.fn(),
|
|
5907
|
+
observe: jest.fn(),
|
|
5908
|
+
unobserve: jest.fn(),
|
|
5909
|
+
}));
|
|
5910
|
+
const embed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
5911
|
+
...defaultViewConfig,
|
|
5912
|
+
...withPostMessage({ liveboardId, hideLiveboardHeader: true }),
|
|
5913
|
+
preRenderId: 'app-init-pre-render',
|
|
5914
|
+
});
|
|
5915
|
+
await embed.preRender();
|
|
5916
|
+
await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
|
|
5917
|
+
const { embedParams } = await requestAppInit();
|
|
5918
|
+
expect(embedParams).toEqual(expect.objectContaining({ [types_1.Param.HideLiveboardHeader]: true }));
|
|
5919
|
+
});
|
|
5920
|
+
test('does not add the APP_INIT copy to UpdateEmbedParams', async () => {
|
|
5921
|
+
(0, test_utils_1.mockMessageChannel)();
|
|
5922
|
+
window.ResizeObserver =
|
|
5923
|
+
window.ResizeObserver ||
|
|
5924
|
+
jest.fn().mockImplementation(() => ({
|
|
5925
|
+
disconnect: jest.fn(),
|
|
5926
|
+
observe: jest.fn(),
|
|
5927
|
+
unobserve: jest.fn(),
|
|
5928
|
+
}));
|
|
5929
|
+
const embed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
5930
|
+
...defaultViewConfig,
|
|
5931
|
+
...withPostMessage({ liveboardId, hideLiveboardHeader: true }),
|
|
5932
|
+
preRenderId: 'app-init-copy-pre-render',
|
|
5933
|
+
});
|
|
5934
|
+
await embed.preRender();
|
|
5935
|
+
await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
|
|
5936
|
+
signalFrameReady();
|
|
5937
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
5938
|
+
expect(embed.isEmbedContainerLoaded).toBe(true);
|
|
5939
|
+
});
|
|
5940
|
+
// The show cycle is what sends UpdateEmbedParams.
|
|
5941
|
+
await embed.showPreRender();
|
|
5942
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
5943
|
+
const updateCall = mockProcessTrigger.mock.calls.find((call) => call[1] === types_1.HostEvent.UpdateEmbedParams);
|
|
5944
|
+
expect(updateCall[3]).toEqual(expect.objectContaining({ [types_1.Param.HideLiveboardHeader]: true }));
|
|
5945
|
+
expect(updateCall[3]).not.toHaveProperty('embedParams');
|
|
5946
|
+
});
|
|
5947
|
+
});
|
|
5948
|
+
// BOOTSTRAP_URL_PARAMS is the source of truth. Each param goes
|
|
5949
|
+
// through additionalFlags so it is checked on its own.
|
|
5950
|
+
test.each([...ts_embed_1.BOOTSTRAP_URL_PARAMS])('keeps %s on the URL', async (param) => {
|
|
5951
|
+
await renderEmbed(index_1.LiveboardEmbed, {
|
|
5952
|
+
liveboardId,
|
|
5953
|
+
additionalFlags: { [param]: 'bootstrap-value' },
|
|
5954
|
+
});
|
|
5955
|
+
expect(new URL((0, test_utils_1.getIFrameSrc)()).searchParams.has(param)).toBe(true);
|
|
5956
|
+
});
|
|
5957
|
+
});
|
|
5958
|
+
test('strips a non-bootstrap additionalFlag from the URL when the flag is set', async () => {
|
|
5959
|
+
const { src } = await renderAndGetSrc({
|
|
5960
|
+
...lbConfig,
|
|
5961
|
+
additionalFlags: {
|
|
5962
|
+
internalBlinkFlag: true,
|
|
5963
|
+
someCustomFlag: 'abc',
|
|
5964
|
+
excludeConfigFromURL: true,
|
|
5965
|
+
},
|
|
5966
|
+
});
|
|
5967
|
+
expect(src).not.toContain('internalBlinkFlag');
|
|
5968
|
+
expect(src).not.toContain('someCustomFlag');
|
|
5969
|
+
});
|
|
5970
|
+
test('keeps an additionalFlag that overrides a bootstrap param on the URL', async () => {
|
|
5971
|
+
const { src } = await renderAndGetSrc({
|
|
5972
|
+
...lbConfig,
|
|
5973
|
+
additionalFlags: { [types_1.Param.OverrideOrgId]: 42, excludeConfigFromURL: true },
|
|
5974
|
+
});
|
|
5975
|
+
expect(src).toContain(`${types_1.Param.OverrideOrgId}=42`);
|
|
5976
|
+
});
|
|
5977
|
+
test('keeps the dark mode params on the URL when the flag is set', async () => {
|
|
5978
|
+
const { src } = await renderAndGetSrc(withPostMessage({ ...lbConfig, isDarkMode: true }));
|
|
5979
|
+
expect(src).toContain(`${types_1.Param.IsDarkMode}=true`);
|
|
5980
|
+
expect(src).toContain(`${types_1.Param.RadiantThemeEnabled}=true`);
|
|
5981
|
+
});
|
|
5982
|
+
test('keeps the deep-link route on the URL when the flag is set', async () => {
|
|
5983
|
+
const { src } = await renderAndGetSrc(withPostMessage(lbConfig));
|
|
5984
|
+
expect(src).toContain(`/embed/viz/${liveboardId}`);
|
|
5985
|
+
});
|
|
5986
|
+
test('sends the config in APP_INIT, not UpdateEmbedParams, on the first load', async () => {
|
|
5987
|
+
await renderAndGetSrc(withPostMessage(lbConfig));
|
|
5988
|
+
const mockPort = { postMessage: jest.fn() };
|
|
5989
|
+
(0, test_utils_1.postMessageToParent)((0, test_utils_1.getIFrameEl)().contentWindow, { type: index_1.EmbedEvent.APP_INIT, data: {} }, mockPort);
|
|
5990
|
+
await (0, test_utils_1.waitFor)(() => mockPort.postMessage.mock.calls.length > 0);
|
|
5991
|
+
signalFrameReady();
|
|
5992
|
+
expect(mockPort.postMessage.mock.calls[0][0].data.embedParams).toEqual(expect.objectContaining({
|
|
5993
|
+
internalBlinkFlag: true,
|
|
5994
|
+
[types_1.Param.HideActions]: expect.arrayContaining([types_1.Action.Download]),
|
|
5995
|
+
}));
|
|
5996
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
5997
|
+
const updateCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateEmbedParams);
|
|
5998
|
+
expect(updateCalls).toHaveLength(0);
|
|
5999
|
+
});
|
|
6000
|
+
});
|
|
6001
|
+
test('does not send UpdateEmbedParams when the flag is not set', async () => {
|
|
6002
|
+
await renderAndGetSrc(lbConfig);
|
|
6003
|
+
signalFrameReady();
|
|
6004
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
6005
|
+
const updateCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateEmbedParams);
|
|
6006
|
+
expect(updateCalls).toHaveLength(0);
|
|
6007
|
+
});
|
|
6008
|
+
});
|
|
6009
|
+
test('does not double-send for a pre-rendered embed that is shown', async () => {
|
|
6010
|
+
(0, test_utils_1.mockMessageChannel)();
|
|
6011
|
+
window.ResizeObserver =
|
|
6012
|
+
window.ResizeObserver ||
|
|
6013
|
+
jest.fn().mockImplementation(() => ({
|
|
6014
|
+
disconnect: jest.fn(),
|
|
6015
|
+
observe: jest.fn(),
|
|
6016
|
+
unobserve: jest.fn(),
|
|
6017
|
+
}));
|
|
6018
|
+
const embed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
6019
|
+
...defaultViewConfig,
|
|
6020
|
+
...withPostMessage(lbConfig),
|
|
6021
|
+
preRenderId: 'send-config-post-message',
|
|
6022
|
+
});
|
|
6023
|
+
await embed.preRender();
|
|
6024
|
+
await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
|
|
6025
|
+
signalFrameReady();
|
|
6026
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
6027
|
+
expect(embed.isEmbedContainerLoaded).toBe(true);
|
|
6028
|
+
});
|
|
6029
|
+
// The frame being ready sends nothing; the config went in APP_INIT.
|
|
6030
|
+
expect(mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateEmbedParams)).toHaveLength(0);
|
|
6031
|
+
mockProcessTrigger.mockClear();
|
|
6032
|
+
await embed.showPreRender();
|
|
6033
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
6034
|
+
const updateCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateEmbedParams);
|
|
6035
|
+
expect(updateCalls).toHaveLength(1);
|
|
6036
|
+
});
|
|
6037
|
+
});
|
|
6038
|
+
});
|
|
6039
|
+
describe('visual-sdk-embed-create does not upload runtime filter or parameter data', () => {
|
|
6040
|
+
// Spied per test: an earlier suite calls jest.restoreAllMocks(), which
|
|
6041
|
+
// would unwire a spy created at collection time.
|
|
6042
|
+
let mockMixPanelEvent;
|
|
6043
|
+
const runtimeFilters = [
|
|
6044
|
+
{
|
|
6045
|
+
columnName: 'Patient SSN',
|
|
6046
|
+
operator: types_1.RuntimeFilterOp.EQ,
|
|
6047
|
+
values: ['123-45-6789'],
|
|
6048
|
+
},
|
|
6049
|
+
];
|
|
6050
|
+
const runtimeParameters = [
|
|
6051
|
+
{
|
|
6052
|
+
name: 'Sales Region',
|
|
6053
|
+
value: 'EMEA',
|
|
6054
|
+
},
|
|
6055
|
+
];
|
|
6056
|
+
beforeAll(() => {
|
|
6057
|
+
(0, index_1.init)({
|
|
6058
|
+
thoughtSpotHost: 'tshost',
|
|
6059
|
+
authType: index_1.AuthType.None,
|
|
6060
|
+
});
|
|
6061
|
+
});
|
|
6062
|
+
beforeEach(() => {
|
|
6063
|
+
document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
|
|
6064
|
+
mockMixPanelEvent = jest.spyOn(mixpanelInstance, 'uploadMixpanelEvent');
|
|
6065
|
+
});
|
|
6066
|
+
afterEach(() => {
|
|
6067
|
+
mockMixPanelEvent.mockRestore();
|
|
6068
|
+
});
|
|
6069
|
+
const getEmbedCreateProps = () => {
|
|
6070
|
+
const call = mockMixPanelEvent.mock.calls.find(([eventId]) => eventId === mixpanel_service_1.MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE);
|
|
6071
|
+
expect(call).toBeDefined();
|
|
6072
|
+
return call[1];
|
|
6073
|
+
};
|
|
6074
|
+
test('uploads the summary instead of the filters and parameters', () => {
|
|
6075
|
+
new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
6076
|
+
liveboardId: 'lb-guid',
|
|
6077
|
+
runtimeFilters,
|
|
6078
|
+
runtimeParameters,
|
|
6079
|
+
});
|
|
6080
|
+
expect(getEmbedCreateProps()).toEqual(expect.objectContaining({
|
|
6081
|
+
liveboardId: 'lb-guid',
|
|
6082
|
+
runtimeFilters: { count: 1, operators: ['EQ'] },
|
|
6083
|
+
runtimeParameters: { count: 1, applicabilityLevels: [] },
|
|
6084
|
+
}));
|
|
6085
|
+
});
|
|
6086
|
+
test('no column name, parameter name or operand reaches mixpanel', () => {
|
|
6087
|
+
new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
6088
|
+
liveboardId: 'lb-guid',
|
|
6089
|
+
runtimeFilters,
|
|
6090
|
+
runtimeParameters,
|
|
6091
|
+
});
|
|
6092
|
+
const uploaded = JSON.stringify(getEmbedCreateProps());
|
|
6093
|
+
['Patient SSN', '123-45-6789', 'Sales Region', 'EMEA'].forEach((customerValue) => {
|
|
6094
|
+
expect(uploaded).not.toContain(customerValue);
|
|
6095
|
+
});
|
|
6096
|
+
});
|
|
6097
|
+
test('an embed with no runtime filters is unchanged', () => {
|
|
6098
|
+
new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
|
|
6099
|
+
liveboardId: 'lb-guid',
|
|
6100
|
+
});
|
|
6101
|
+
const props = getEmbedCreateProps();
|
|
6102
|
+
expect(props).toEqual({
|
|
6103
|
+
liveboardId: 'lb-guid',
|
|
6104
|
+
embedComponentType: 'LiveboardEmbed',
|
|
6105
|
+
});
|
|
6106
|
+
});
|
|
6107
|
+
});
|
|
5498
6108
|
//# sourceMappingURL=ts-embed.spec.js.map
|