@thoughtspot/visual-embed-sdk 1.51.2 → 1.52.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 +9 -1
- package/cjs/src/api-intercept.d.ts.map +1 -1
- package/cjs/src/api-intercept.js +1 -0
- package/cjs/src/api-intercept.js.map +1 -1
- package/cjs/src/contracts/contracts.spec.d.ts +2 -0
- package/cjs/src/contracts/contracts.spec.d.ts.map +1 -0
- package/cjs/src/contracts/contracts.spec.js +345 -0
- package/cjs/src/contracts/contracts.spec.js.map +1 -0
- package/cjs/src/contracts/embed-event-payloads.d.ts +73 -0
- package/cjs/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/cjs/src/contracts/embed-event-payloads.js +3 -0
- package/cjs/src/contracts/embed-event-payloads.js.map +1 -0
- package/cjs/src/contracts/host-event-contracts.d.ts +378 -0
- package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/cjs/src/contracts/host-event-contracts.js +3 -0
- package/cjs/src/contracts/host-event-contracts.js.map +1 -0
- package/cjs/src/contracts/index.d.ts +22 -0
- package/cjs/src/contracts/index.d.ts.map +1 -0
- package/cjs/src/contracts/index.js +33 -0
- package/cjs/src/contracts/index.js.map +1 -0
- package/cjs/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/cjs/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/cjs/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
- package/cjs/src/contracts/ui-passthrough-contracts.js.map +1 -0
- package/cjs/src/css-variables.d.ts +1 -1
- package/cjs/src/embed/app.d.ts +17 -140
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +20 -120
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +70 -26
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +5 -5
- package/cjs/src/embed/events.spec.js +12 -2
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +3 -2
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +23 -18
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +36 -36
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.js +3 -3
- package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +9 -161
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +68 -135
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +215 -32
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/search.d.ts +14 -0
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js +4 -1
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +65 -0
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +21 -25
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +105 -72
- 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 +380 -33
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/full-height.d.ts +137 -0
- package/cjs/src/full-height.d.ts.map +1 -0
- package/cjs/src/full-height.js +272 -0
- package/cjs/src/full-height.js.map +1 -0
- package/cjs/src/full-height.spec.d.ts +2 -0
- package/cjs/src/full-height.spec.d.ts.map +1 -0
- package/cjs/src/full-height.spec.js +835 -0
- package/cjs/src/full-height.spec.js.map +1 -0
- package/cjs/src/index.d.ts +4 -3
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +5 -4
- package/cjs/src/index.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/react/all-types-export.parity.spec.js +55 -3
- package/cjs/src/react/all-types-export.parity.spec.js.map +1 -1
- package/cjs/src/react/index.d.ts +8 -8
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +1 -1
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/react/index.spec.js +7 -7
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/types.d.ts +664 -39
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +406 -13
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/processTrigger.d.ts +3 -1
- package/cjs/src/utils/processTrigger.d.ts.map +1 -1
- package/cjs/src/utils/processTrigger.js +19 -51
- package/cjs/src/utils/processTrigger.js.map +1 -1
- package/cjs/src/utils/transport/iframe-transport.d.ts +55 -0
- package/cjs/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.js +108 -0
- package/cjs/src/utils/transport/iframe-transport.js.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/cjs/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.spec.js +140 -0
- package/cjs/src/utils/transport/iframe-transport.spec.js.map +1 -0
- package/cjs/src/utils.d.ts +18 -0
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +39 -1
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +62 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-D8_Zs-Nr.js → index-C1pmYb5H.js} +1 -1
- package/dist/src/api-intercept.d.ts.map +1 -1
- package/dist/src/contracts/contracts.spec.d.ts +2 -0
- package/dist/src/contracts/contracts.spec.d.ts.map +1 -0
- package/dist/src/contracts/embed-event-payloads.d.ts +73 -0
- package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/dist/src/contracts/host-event-contracts.d.ts +378 -0
- package/dist/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/dist/src/contracts/index.d.ts +22 -0
- package/dist/src/contracts/index.d.ts.map +1 -0
- package/dist/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/dist/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/dist/src/css-variables.d.ts +1 -1
- package/dist/src/embed/app.d.ts +17 -140
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +5 -5
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +3 -2
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +9 -161
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +14 -0
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +21 -25
- 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/full-height.d.ts +137 -0
- package/dist/src/full-height.d.ts.map +1 -0
- package/dist/src/full-height.spec.d.ts +2 -0
- package/dist/src/full-height.spec.d.ts.map +1 -0
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.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/react/index.d.ts +8 -8
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +664 -39
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/processTrigger.d.ts +3 -1
- package/dist/src/utils/processTrigger.d.ts.map +1 -1
- package/dist/src/utils/transport/iframe-transport.d.ts +55 -0
- package/dist/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/dist/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/dist/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/dist/src/utils.d.ts +18 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +1031 -392
- package/dist/tsembed-react.js +1030 -391
- package/dist/tsembed.es.js +1031 -392
- package/dist/tsembed.js +1029 -390
- package/dist/visual-embed-sdk-react-full.d.ts +1483 -693
- package/dist/visual-embed-sdk-react.d.ts +1364 -647
- package/dist/visual-embed-sdk.d.ts +1426 -659
- package/lib/package.json +9 -1
- package/lib/src/api-intercept.d.ts.map +1 -1
- package/lib/src/api-intercept.js +2 -1
- package/lib/src/api-intercept.js.map +1 -1
- package/lib/src/contracts/contracts.spec.d.ts +2 -0
- package/lib/src/contracts/contracts.spec.d.ts.map +1 -0
- package/lib/src/contracts/contracts.spec.js +342 -0
- package/lib/src/contracts/contracts.spec.js.map +1 -0
- package/lib/src/contracts/embed-event-payloads.d.ts +73 -0
- package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/lib/src/contracts/embed-event-payloads.js +2 -0
- package/lib/src/contracts/embed-event-payloads.js.map +1 -0
- package/lib/src/contracts/host-event-contracts.d.ts +378 -0
- package/lib/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/lib/src/contracts/host-event-contracts.js +2 -0
- package/lib/src/contracts/host-event-contracts.js.map +1 -0
- package/lib/src/contracts/index.d.ts +22 -0
- package/lib/src/contracts/index.d.ts.map +1 -0
- package/lib/src/contracts/index.js +22 -0
- package/lib/src/contracts/index.js.map +1 -0
- package/lib/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/lib/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/lib/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
- package/lib/src/contracts/ui-passthrough-contracts.js.map +1 -0
- package/lib/src/css-variables.d.ts +1 -1
- package/lib/src/embed/app.d.ts +17 -140
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +22 -122
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +70 -26
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +5 -5
- package/lib/src/embed/events.spec.js +12 -2
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +3 -2
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +6 -1
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/utils.js +1 -1
- package/lib/src/embed/hostEventClient/utils.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +9 -161
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +70 -137
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +215 -32
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/search.d.ts +14 -0
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +4 -1
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +65 -0
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +21 -25
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +106 -73
- 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 +378 -31
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/full-height.d.ts +137 -0
- package/lib/src/full-height.d.ts.map +1 -0
- package/lib/src/full-height.js +268 -0
- package/lib/src/full-height.js.map +1 -0
- package/lib/src/full-height.spec.d.ts +2 -0
- package/lib/src/full-height.spec.d.ts.map +1 -0
- package/lib/src/full-height.spec.js +833 -0
- package/lib/src/full-height.spec.js.map +1 -0
- package/lib/src/index.d.ts +4 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +3 -3
- package/lib/src/index.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/react/all-types-export.parity.spec.js +55 -3
- package/lib/src/react/all-types-export.parity.spec.js.map +1 -1
- package/lib/src/react/index.d.ts +8 -8
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +1 -1
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/react/index.spec.js +7 -7
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/types.d.ts +664 -39
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +405 -12
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/processTrigger.d.ts +3 -1
- package/lib/src/utils/processTrigger.d.ts.map +1 -1
- package/lib/src/utils/processTrigger.js +19 -51
- package/lib/src/utils/processTrigger.js.map +1 -1
- package/lib/src/utils/transport/iframe-transport.d.ts +55 -0
- package/lib/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/lib/src/utils/transport/iframe-transport.js +101 -0
- package/lib/src/utils/transport/iframe-transport.js.map +1 -0
- package/lib/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/lib/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/lib/src/utils/transport/iframe-transport.spec.js +138 -0
- package/lib/src/utils/transport/iframe-transport.spec.js.map +1 -0
- package/lib/src/utils.d.ts +18 -0
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +37 -0
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +63 -1
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +1426 -659
- package/package.json +9 -1
- package/src/api-intercept.ts +2 -1
- package/src/contracts/contracts.spec.ts +392 -0
- package/src/contracts/embed-event-payloads.ts +83 -0
- package/src/contracts/host-event-contracts.ts +456 -0
- package/src/contracts/index.ts +53 -0
- package/src/contracts/ui-passthrough-contracts.ts +301 -0
- package/src/css-variables.ts +1 -1
- package/src/embed/app.spec.ts +86 -34
- package/src/embed/app.ts +37 -264
- package/src/embed/conversation.ts +5 -5
- package/src/embed/events.spec.ts +14 -2
- package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
- package/src/embed/hostEventClient/host-event-client.ts +18 -5
- package/src/embed/hostEventClient/utils.ts +2 -1
- package/src/embed/liveboard.spec.ts +261 -42
- package/src/embed/liveboard.ts +78 -297
- package/src/embed/search.spec.ts +80 -0
- package/src/embed/search.ts +20 -0
- package/src/embed/ts-embed.spec.ts +518 -31
- package/src/embed/ts-embed.ts +133 -82
- package/src/full-height.spec.ts +1008 -0
- package/src/full-height.ts +361 -0
- package/src/index.ts +95 -5
- package/src/react/all-types-export.parity.spec.ts +63 -3
- package/src/react/all-types-export.ts +46 -0
- package/src/react/index.spec.tsx +7 -7
- package/src/react/index.tsx +9 -9
- package/src/types.ts +665 -37
- package/src/utils/processTrigger.ts +28 -58
- package/src/utils/transport/iframe-transport.spec.ts +177 -0
- package/src/utils/transport/iframe-transport.ts +122 -0
- package/src/utils.spec.ts +71 -0
- package/src/utils.ts +38 -0
- package/cjs/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/cjs/src/embed/hostEventClient/contracts.js.map +0 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/lib/src/embed/hostEventClient/contracts.js.map +0 -1
- package/src/embed/hostEventClient/contracts.ts +0 -262
|
@@ -20,7 +20,7 @@ const logger_1 = require("../utils/logger");
|
|
|
20
20
|
const package_json_1 = require("../../package.json");
|
|
21
21
|
const search_1 = require("./search");
|
|
22
22
|
const processTrigger_1 = require("../utils/processTrigger");
|
|
23
|
-
const
|
|
23
|
+
const ui_passthrough_contracts_1 = require("../contracts/ui-passthrough-contracts");
|
|
24
24
|
const sessionInfoService = tslib_1.__importStar(require("../utils/sessionInfoService"));
|
|
25
25
|
const authToken = tslib_1.__importStar(require("../authToken"));
|
|
26
26
|
const apiIntercept = tslib_1.__importStar(require("../api-intercept"));
|
|
@@ -141,10 +141,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
141
141
|
mockProcessTrigger.mockResolvedValue({ session: 'test' });
|
|
142
142
|
await (0, test_utils_1.executeAfterWait)(async () => {
|
|
143
143
|
const payload = { newVizName: 'test' };
|
|
144
|
-
await searchEmbed.triggerUIPassThrough(
|
|
144
|
+
await searchEmbed.triggerUIPassThrough(ui_passthrough_contracts_1.UIPassthroughEvent.PinAnswerToLiveboard, payload);
|
|
145
145
|
expect(mockProcessTrigger).toHaveBeenCalledWith((0, test_utils_1.getIFrameEl)(), types_1.HostEvent.UIPassthrough, 'http://tshost', {
|
|
146
146
|
parameters: payload,
|
|
147
|
-
type:
|
|
147
|
+
type: ui_passthrough_contracts_1.UIPassthroughEvent.PinAnswerToLiveboard,
|
|
148
148
|
}, undefined);
|
|
149
149
|
});
|
|
150
150
|
});
|
|
@@ -168,6 +168,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
168
168
|
liveboardEmbed.render();
|
|
169
169
|
mockProcessTrigger.mockResolvedValue({ session: 'test' });
|
|
170
170
|
await (0, test_utils_1.executeAfterWait)(async () => {
|
|
171
|
+
// `false` is a deliberately off-contract payload here — this
|
|
172
|
+
// asserts raw passthrough to processTrigger, not a real Save
|
|
173
|
+
// payload — so it is cast past the typed `data` parameter.
|
|
171
174
|
await liveboardEmbed.trigger(types_1.HostEvent.Save, false);
|
|
172
175
|
expect(mockProcessTrigger).toHaveBeenCalledWith((0, test_utils_1.getIFrameEl)(), types_1.HostEvent.Save, 'http://tshost', false, undefined);
|
|
173
176
|
});
|
|
@@ -1561,9 +1564,48 @@ describe('Unit test case for ts embed', () => {
|
|
|
1561
1564
|
errorType: types_1.ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1562
1565
|
message: errors_1.ERROR_MESSAGE.INIT_SDK_REQUIRED,
|
|
1563
1566
|
code: types_1.EmbedErrorCodes.INIT_ERROR,
|
|
1567
|
+
severity: types_1.EmbedErrorSeverity.SEV1,
|
|
1564
1568
|
error: errors_1.ERROR_MESSAGE.INIT_SDK_REQUIRED,
|
|
1565
1569
|
});
|
|
1566
1570
|
});
|
|
1571
|
+
test('a missing init is reported to the host as SEV1', async () => {
|
|
1572
|
+
const errorHandler = jest.fn();
|
|
1573
|
+
const tsEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {});
|
|
1574
|
+
tsEmbed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
1575
|
+
await tsEmbed.render();
|
|
1576
|
+
expect(errorHandler.mock.calls[0][0]).toEqual(expect.objectContaining({
|
|
1577
|
+
code: types_1.EmbedErrorCodes.INIT_ERROR,
|
|
1578
|
+
severity: types_1.EmbedErrorSeverity.SEV1,
|
|
1579
|
+
}));
|
|
1580
|
+
});
|
|
1581
|
+
});
|
|
1582
|
+
describe('error severity', () => {
|
|
1583
|
+
beforeEach(() => {
|
|
1584
|
+
jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(() => 'http://tshost');
|
|
1585
|
+
});
|
|
1586
|
+
test('defaults to SEV3 when the raising site does not set one', () => {
|
|
1587
|
+
const errorHandler = jest.fn();
|
|
1588
|
+
const tsEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {});
|
|
1589
|
+
tsEmbed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
1590
|
+
tsEmbed.handleError({
|
|
1591
|
+
errorType: types_1.ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1592
|
+
message: 'no severity set',
|
|
1593
|
+
code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
|
|
1594
|
+
});
|
|
1595
|
+
expect(errorHandler.mock.calls[0][0]).toEqual(expect.objectContaining({ severity: types_1.EmbedErrorSeverity.SEV3 }));
|
|
1596
|
+
});
|
|
1597
|
+
test('does not override a severity the raising site set', () => {
|
|
1598
|
+
const errorHandler = jest.fn();
|
|
1599
|
+
const tsEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {});
|
|
1600
|
+
tsEmbed.on(index_1.EmbedEvent.Error, errorHandler);
|
|
1601
|
+
tsEmbed.handleError({
|
|
1602
|
+
errorType: types_1.ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1603
|
+
message: 'explicitly fatal',
|
|
1604
|
+
code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
|
|
1605
|
+
severity: types_1.EmbedErrorSeverity.SEV1,
|
|
1606
|
+
});
|
|
1607
|
+
expect(errorHandler.mock.calls[0][0]).toEqual(expect.objectContaining({ severity: types_1.EmbedErrorSeverity.SEV1 }));
|
|
1608
|
+
});
|
|
1567
1609
|
});
|
|
1568
1610
|
describe('V1Embed ', () => {
|
|
1569
1611
|
beforeEach(() => {
|
|
@@ -2901,12 +2943,12 @@ describe('Unit test case for ts embed', () => {
|
|
|
2901
2943
|
expect(preRenderWrapper.style.zIndex).toBe('-5');
|
|
2902
2944
|
libEmbed.destroy();
|
|
2903
2945
|
});
|
|
2904
|
-
it('should use preRenderConfig.
|
|
2946
|
+
it('should use preRenderConfig.id to identify the pre-render instance', async () => {
|
|
2905
2947
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
2906
2948
|
const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
2907
2949
|
liveboardId: 'myLiveboardId',
|
|
2908
2950
|
preRenderConfig: {
|
|
2909
|
-
|
|
2951
|
+
id: 'config-level-id',
|
|
2910
2952
|
},
|
|
2911
2953
|
});
|
|
2912
2954
|
await libEmbed.preRender();
|
|
@@ -2916,13 +2958,13 @@ describe('Unit test case for ts embed', () => {
|
|
|
2916
2958
|
expect(document.getElementById(preRenderIds.wrapper)).not.toBeNull();
|
|
2917
2959
|
libEmbed.destroy();
|
|
2918
2960
|
});
|
|
2919
|
-
it('should prefer preRenderConfig.
|
|
2961
|
+
it('should prefer preRenderConfig.id over top-level preRenderId', async () => {
|
|
2920
2962
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
2921
2963
|
const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
2922
2964
|
liveboardId: 'myLiveboardId',
|
|
2923
2965
|
preRenderId: 'top-level-id',
|
|
2924
2966
|
preRenderConfig: {
|
|
2925
|
-
|
|
2967
|
+
id: 'config-level-id',
|
|
2926
2968
|
},
|
|
2927
2969
|
});
|
|
2928
2970
|
await libEmbed.preRender();
|
|
@@ -2932,7 +2974,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2932
2974
|
expect(preRenderIds.wrapper).not.toContain('top-level-id');
|
|
2933
2975
|
libEmbed.destroy();
|
|
2934
2976
|
});
|
|
2935
|
-
it('should mount the wrapper into preRenderConfig.
|
|
2977
|
+
it('should mount the wrapper into preRenderConfig.containerSelector', async () => {
|
|
2936
2978
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
2937
2979
|
const customContainer = document.createElement('div');
|
|
2938
2980
|
customContainer.id = 'config-level-container';
|
|
@@ -2940,8 +2982,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2940
2982
|
const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
2941
2983
|
liveboardId: 'myLiveboardId',
|
|
2942
2984
|
preRenderConfig: {
|
|
2943
|
-
|
|
2944
|
-
|
|
2985
|
+
id: 'container-via-config',
|
|
2986
|
+
containerSelector: '#config-level-container',
|
|
2945
2987
|
},
|
|
2946
2988
|
});
|
|
2947
2989
|
await libEmbed.preRender();
|
|
@@ -2952,7 +2994,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2952
2994
|
libEmbed.destroy();
|
|
2953
2995
|
customContainer.remove();
|
|
2954
2996
|
});
|
|
2955
|
-
it('should prefer preRenderConfig.
|
|
2997
|
+
it('should prefer preRenderConfig.containerSelector over top-level preRenderContainer', async () => {
|
|
2956
2998
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
2957
2999
|
const topContainer = document.createElement('div');
|
|
2958
3000
|
topContainer.id = 'top-level-container';
|
|
@@ -2964,8 +3006,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2964
3006
|
liveboardId: 'myLiveboardId',
|
|
2965
3007
|
preRenderContainer: '#top-level-container',
|
|
2966
3008
|
preRenderConfig: {
|
|
2967
|
-
|
|
2968
|
-
|
|
3009
|
+
id: 'container-precedence',
|
|
3010
|
+
containerSelector: '#config-level-container-2',
|
|
2969
3011
|
},
|
|
2970
3012
|
});
|
|
2971
3013
|
await libEmbed.preRender();
|
|
@@ -2978,7 +3020,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2978
3020
|
topContainer.remove();
|
|
2979
3021
|
configContainer.remove();
|
|
2980
3022
|
});
|
|
2981
|
-
it('should not attach ResizeObserver when preRenderConfig.
|
|
3023
|
+
it('should not attach ResizeObserver when preRenderConfig.doNotTrackSize is true', async () => {
|
|
2982
3024
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
2983
3025
|
const observeMock = jest.fn();
|
|
2984
3026
|
window.ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
@@ -2989,8 +3031,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2989
3031
|
const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
2990
3032
|
liveboardId: 'myLiveboardId',
|
|
2991
3033
|
preRenderConfig: {
|
|
2992
|
-
|
|
2993
|
-
|
|
3034
|
+
id: 'no-track-via-config',
|
|
3035
|
+
doNotTrackSize: true,
|
|
2994
3036
|
},
|
|
2995
3037
|
});
|
|
2996
3038
|
await libEmbed.preRender();
|
|
@@ -2999,7 +3041,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2999
3041
|
expect(observeMock).not.toHaveBeenCalled();
|
|
3000
3042
|
libEmbed.destroy();
|
|
3001
3043
|
});
|
|
3002
|
-
it('should prefer preRenderConfig.
|
|
3044
|
+
it('should prefer preRenderConfig.doNotTrackSize over top-level doNotTrackPreRenderSize', async () => {
|
|
3003
3045
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
3004
3046
|
const observeMock = jest.fn();
|
|
3005
3047
|
window.ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
@@ -3011,8 +3053,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
3011
3053
|
liveboardId: 'myLiveboardId',
|
|
3012
3054
|
doNotTrackPreRenderSize: false,
|
|
3013
3055
|
preRenderConfig: {
|
|
3014
|
-
|
|
3015
|
-
|
|
3056
|
+
id: 'no-track-precedence',
|
|
3057
|
+
doNotTrackSize: true,
|
|
3016
3058
|
},
|
|
3017
3059
|
});
|
|
3018
3060
|
await libEmbed.preRender();
|
|
@@ -3530,7 +3572,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
3530
3572
|
});
|
|
3531
3573
|
test('should return getPreRenderObj and log if same object', () => {
|
|
3532
3574
|
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
3533
|
-
|
|
3575
|
+
// debug, not info: the wrapper points at the embed being shown, so
|
|
3576
|
+
// this is now the common case rather than a rare diagnostic.
|
|
3577
|
+
const loggerSpy = jest.spyOn(logger_1.logger, 'debug');
|
|
3534
3578
|
// getPreRenderObj reads the embed reference from preRenderWrapper
|
|
3535
3579
|
searchEmbed.preRenderWrapper = {
|
|
3536
3580
|
[searchEmbed['embedNodeKey']]: searchEmbed,
|
|
@@ -4232,16 +4276,6 @@ describe('Additional Coverage Tests', () => {
|
|
|
4232
4276
|
expect((0, test_utils_1.getIFrameEl)().style.height).toBe('500px');
|
|
4233
4277
|
});
|
|
4234
4278
|
});
|
|
4235
|
-
test('should test getIframeCenter calculation', async () => {
|
|
4236
|
-
const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
|
|
4237
|
-
await searchEmbed.render();
|
|
4238
|
-
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4239
|
-
const center = searchEmbed['getIframeCenter']();
|
|
4240
|
-
expect(center).toHaveProperty('iframeCenter');
|
|
4241
|
-
expect(center).toHaveProperty('iframeHeight');
|
|
4242
|
-
expect(center).toHaveProperty('viewPortHeight');
|
|
4243
|
-
});
|
|
4244
|
-
});
|
|
4245
4279
|
test('should handle preRender with replaceExistingPreRender=true', async () => {
|
|
4246
4280
|
(0, test_utils_1.createRootEleForEmbed)();
|
|
4247
4281
|
const embed1 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
@@ -4314,7 +4348,7 @@ describe('Trigger method edge cases', () => {
|
|
|
4314
4348
|
await searchEmbed.render();
|
|
4315
4349
|
// First processTrigger call is getAvailableUIPassthroughKeys for DrillDown
|
|
4316
4350
|
mockProcessTrigger.mockResolvedValueOnce([
|
|
4317
|
-
{ value: { keys: Object.values(
|
|
4351
|
+
{ value: { keys: Object.values(ui_passthrough_contracts_1.UIPassthroughEvent) } },
|
|
4318
4352
|
]);
|
|
4319
4353
|
// DrillDown with no points → throwDrillDownValidationError → isValidationError=true
|
|
4320
4354
|
await expect(searchEmbed.trigger(types_1.HostEvent.DrillDown, {})).rejects.toThrow('DrillDown requires a valid points object');
|
|
@@ -4541,7 +4575,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4541
4575
|
});
|
|
4542
4576
|
embed2.showPreRender();
|
|
4543
4577
|
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4544
|
-
|
|
4578
|
+
// Not LastCalledWith: LiveboardEmbed fires Navigate after this.
|
|
4579
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4545
4580
|
liveboardId: 'original-lb',
|
|
4546
4581
|
visibleVizs: ['viz-1'],
|
|
4547
4582
|
runtimeFilters: [
|
|
@@ -4584,7 +4619,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4584
4619
|
});
|
|
4585
4620
|
embed2.showPreRender();
|
|
4586
4621
|
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4587
|
-
|
|
4622
|
+
// Not LastCalledWith: LiveboardEmbed fires Navigate after this.
|
|
4623
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4588
4624
|
liveboardId: 'original-lb',
|
|
4589
4625
|
visibleVizs: ['viz-1', 'viz-2'],
|
|
4590
4626
|
runtimeFilters: [
|
|
@@ -4597,6 +4633,317 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4597
4633
|
}), undefined);
|
|
4598
4634
|
});
|
|
4599
4635
|
});
|
|
4636
|
+
test('should carry the new config filters in UpdateEmbedParams', async () => {
|
|
4637
|
+
await setupPreRenderTest('params-new-filters', { liveboardId: 'original-lb' });
|
|
4638
|
+
const runtimeFilters = [
|
|
4639
|
+
{
|
|
4640
|
+
columnName: 'Color',
|
|
4641
|
+
operator: types_1.RuntimeFilterOp.IN,
|
|
4642
|
+
values: ['red', 'blue'],
|
|
4643
|
+
},
|
|
4644
|
+
];
|
|
4645
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4646
|
+
preRenderId: 'params-new-filters',
|
|
4647
|
+
liveboardId: 'original-lb',
|
|
4648
|
+
runtimeFilters,
|
|
4649
|
+
});
|
|
4650
|
+
embed2.showPreRender();
|
|
4651
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4652
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4653
|
+
runtimeFilters,
|
|
4654
|
+
// The serialized form is the one the container reads.
|
|
4655
|
+
runtimeFilterParams: 'col1=Color&op1=IN&val1=red&val1=blue',
|
|
4656
|
+
}), undefined);
|
|
4657
|
+
// Everything rides in the params payload; nothing follows it.
|
|
4658
|
+
const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateRuntimeFilters);
|
|
4659
|
+
expect(runtimeFilterCalls).toHaveLength(0);
|
|
4660
|
+
});
|
|
4661
|
+
});
|
|
4662
|
+
test('should serialize the filters when they are not excluded from the URL', async () => {
|
|
4663
|
+
await setupPreRenderTest('params-url-filters', { liveboardId: 'original-lb' });
|
|
4664
|
+
// With the flag off, getDefaultAppInitData leaves runtimeFilterParams
|
|
4665
|
+
// null and a URL render carries the filters in the iframe's query
|
|
4666
|
+
// string. A show cycle has no URL, so the payload has to carry them.
|
|
4667
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4668
|
+
preRenderId: 'params-url-filters',
|
|
4669
|
+
liveboardId: 'original-lb',
|
|
4670
|
+
excludeRuntimeFiltersfromURL: false,
|
|
4671
|
+
runtimeFilters: [
|
|
4672
|
+
{
|
|
4673
|
+
columnName: 'Color',
|
|
4674
|
+
operator: types_1.RuntimeFilterOp.IN,
|
|
4675
|
+
values: ['red'],
|
|
4676
|
+
},
|
|
4677
|
+
],
|
|
4678
|
+
});
|
|
4679
|
+
embed2.showPreRender();
|
|
4680
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4681
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4682
|
+
runtimeFilterParams: 'col1=Color&op1=IN&val1=red',
|
|
4683
|
+
}), undefined);
|
|
4684
|
+
});
|
|
4685
|
+
});
|
|
4686
|
+
test('should trigger Navigate only after UpdateEmbedParams has settled', async () => {
|
|
4687
|
+
await setupPreRenderTest('navigate-after-params', {
|
|
4688
|
+
liveboardId: 'original-lb',
|
|
4689
|
+
runtimeFilters: [
|
|
4690
|
+
{
|
|
4691
|
+
columnName: 'Color',
|
|
4692
|
+
operator: types_1.RuntimeFilterOp.IN,
|
|
4693
|
+
values: ['red'],
|
|
4694
|
+
},
|
|
4695
|
+
],
|
|
4696
|
+
});
|
|
4697
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4698
|
+
preRenderId: 'navigate-after-params',
|
|
4699
|
+
liveboardId: 'updated-lb',
|
|
4700
|
+
});
|
|
4701
|
+
embed2.showPreRender();
|
|
4702
|
+
// Inside the settle window the params are already out
|
|
4703
|
+
// and Navigate is not.
|
|
4704
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4705
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4706
|
+
expect(eventTypes).toContain(types_1.HostEvent.UpdateEmbedParams);
|
|
4707
|
+
expect(eventTypes).not.toContain(types_1.HostEvent.Navigate);
|
|
4708
|
+
}, 50);
|
|
4709
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4710
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4711
|
+
// A Navigate that beat the params would make the container load
|
|
4712
|
+
// `updated-lb` while still holding `original-lb`'s runtime filters,
|
|
4713
|
+
// and drop the params that then arrive mid-load (SCAL-336321).
|
|
4714
|
+
expect(eventTypes).toContain(types_1.HostEvent.Navigate);
|
|
4715
|
+
expect(eventTypes.indexOf(types_1.HostEvent.UpdateEmbedParams)).toBeLessThan(eventTypes.indexOf(types_1.HostEvent.Navigate));
|
|
4716
|
+
}, 300);
|
|
4717
|
+
});
|
|
4718
|
+
test('should mark the params empty when the config declares no filters', async () => {
|
|
4719
|
+
await setupPreRenderTest('params-clear-filters', {
|
|
4720
|
+
liveboardId: 'original-lb',
|
|
4721
|
+
runtimeFilters: [
|
|
4722
|
+
{
|
|
4723
|
+
columnName: 'Color',
|
|
4724
|
+
operator: types_1.RuntimeFilterOp.IN,
|
|
4725
|
+
values: ['red', 'blue'],
|
|
4726
|
+
},
|
|
4727
|
+
],
|
|
4728
|
+
});
|
|
4729
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4730
|
+
preRenderId: 'params-clear-filters',
|
|
4731
|
+
liveboardId: 'original-lb',
|
|
4732
|
+
});
|
|
4733
|
+
embed2.showPreRender();
|
|
4734
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4735
|
+
// Not null and not '': the container only reads this field when it
|
|
4736
|
+
// is truthy, so either would leave the previous embed's filters in
|
|
4737
|
+
// place. A lone separator passes that gate and parses to {}.
|
|
4738
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
|
|
4739
|
+
const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateRuntimeFilters);
|
|
4740
|
+
expect(runtimeFilterCalls).toHaveLength(0);
|
|
4741
|
+
});
|
|
4742
|
+
});
|
|
4743
|
+
test('should mark the params empty for an explicitly empty filter array', async () => {
|
|
4744
|
+
await setupPreRenderTest('params-empty-array', {
|
|
4745
|
+
liveboardId: 'original-lb',
|
|
4746
|
+
runtimeFilters: [
|
|
4747
|
+
{
|
|
4748
|
+
columnName: 'Color',
|
|
4749
|
+
operator: types_1.RuntimeFilterOp.IN,
|
|
4750
|
+
values: ['red'],
|
|
4751
|
+
},
|
|
4752
|
+
],
|
|
4753
|
+
});
|
|
4754
|
+
// `runtimeFilters: []` is the shape the customer reported as not
|
|
4755
|
+
// resetting anything.
|
|
4756
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4757
|
+
preRenderId: 'params-empty-array',
|
|
4758
|
+
liveboardId: 'original-lb',
|
|
4759
|
+
runtimeFilters: [],
|
|
4760
|
+
});
|
|
4761
|
+
embed2.showPreRender();
|
|
4762
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4763
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
|
|
4764
|
+
});
|
|
4765
|
+
});
|
|
4766
|
+
test('should mark the params empty when no config in the chain has filters', async () => {
|
|
4767
|
+
await setupPreRenderTest('params-no-filters', { liveboardId: 'original-lb' });
|
|
4768
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4769
|
+
preRenderId: 'params-no-filters',
|
|
4770
|
+
liveboardId: 'updated-lb',
|
|
4771
|
+
});
|
|
4772
|
+
embed2.showPreRender();
|
|
4773
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4774
|
+
const paramsCall = mockProcessTrigger.mock.calls.find((call) => call[1] === types_1.HostEvent.UpdateEmbedParams);
|
|
4775
|
+
expect(paramsCall === null || paramsCall === void 0 ? void 0 : paramsCall[3]).not.toHaveProperty('runtimeFilters');
|
|
4776
|
+
expect(paramsCall === null || paramsCall === void 0 ? void 0 : paramsCall[3].runtimeFilterParams).toBe('&');
|
|
4777
|
+
});
|
|
4778
|
+
});
|
|
4779
|
+
test('should state each embed filters as the pre-render is handed along', async () => {
|
|
4780
|
+
await setupPreRenderTest('params-chain', {
|
|
4781
|
+
liveboardId: 'original-lb',
|
|
4782
|
+
runtimeFilters: [
|
|
4783
|
+
{
|
|
4784
|
+
columnName: 'Color',
|
|
4785
|
+
operator: types_1.RuntimeFilterOp.IN,
|
|
4786
|
+
values: ['red', 'blue'],
|
|
4787
|
+
},
|
|
4788
|
+
],
|
|
4789
|
+
});
|
|
4790
|
+
// Second in the chain declares none, so it empties the field rather
|
|
4791
|
+
// than letting the creator's filters stand.
|
|
4792
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4793
|
+
preRenderId: 'params-chain',
|
|
4794
|
+
liveboardId: 'second-lb',
|
|
4795
|
+
});
|
|
4796
|
+
await embed2.showPreRender();
|
|
4797
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4798
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
|
|
4799
|
+
});
|
|
4800
|
+
mockProcessTrigger.mockClear();
|
|
4801
|
+
// Third declares its own, and states them without reference to either
|
|
4802
|
+
// embed before it.
|
|
4803
|
+
const embed3 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4804
|
+
preRenderId: 'params-chain',
|
|
4805
|
+
liveboardId: 'third-lb',
|
|
4806
|
+
runtimeFilters: [
|
|
4807
|
+
{
|
|
4808
|
+
columnName: 'Region',
|
|
4809
|
+
operator: types_1.RuntimeFilterOp.EQ,
|
|
4810
|
+
values: ['North'],
|
|
4811
|
+
},
|
|
4812
|
+
],
|
|
4813
|
+
});
|
|
4814
|
+
await embed3.showPreRender();
|
|
4815
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4816
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4817
|
+
runtimeFilterParams: 'col1=Region&op1=EQ&val1=North',
|
|
4818
|
+
}), undefined);
|
|
4819
|
+
});
|
|
4820
|
+
});
|
|
4821
|
+
test('should carry the new config runtime parameters in UpdateEmbedParams', async () => {
|
|
4822
|
+
await setupPreRenderTest('params-parameters', {
|
|
4823
|
+
liveboardId: 'original-lb',
|
|
4824
|
+
runtimeParameters: [{ name: 'Region Param', value: 'East' }],
|
|
4825
|
+
});
|
|
4826
|
+
const runtimeParameters = [{ name: 'Region Param', value: 'West' }];
|
|
4827
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4828
|
+
preRenderId: 'params-parameters',
|
|
4829
|
+
liveboardId: 'original-lb',
|
|
4830
|
+
runtimeParameters,
|
|
4831
|
+
});
|
|
4832
|
+
embed2.showPreRender();
|
|
4833
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4834
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4835
|
+
runtimeParameters,
|
|
4836
|
+
runtimeParameterParams: 'param1=Region%20Param¶mVal1=West',
|
|
4837
|
+
}), undefined);
|
|
4838
|
+
// A parameter always carries a value, so the payload says everything
|
|
4839
|
+
// there is to say — no follow-up event.
|
|
4840
|
+
const parameterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateParameters);
|
|
4841
|
+
expect(parameterCalls).toHaveLength(0);
|
|
4842
|
+
});
|
|
4843
|
+
});
|
|
4844
|
+
test('should mark the params empty when the config declares no parameters', async () => {
|
|
4845
|
+
await setupPreRenderTest('params-clear-parameters', {
|
|
4846
|
+
liveboardId: 'original-lb',
|
|
4847
|
+
runtimeParameters: [{ name: 'Region Param', value: 'East' }],
|
|
4848
|
+
});
|
|
4849
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4850
|
+
preRenderId: 'params-clear-parameters',
|
|
4851
|
+
liveboardId: 'original-lb',
|
|
4852
|
+
});
|
|
4853
|
+
embed2.showPreRender();
|
|
4854
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4855
|
+
// Same gate as the filters: the container only reads this field
|
|
4856
|
+
// when it is truthy, so null would leave 'East' standing.
|
|
4857
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeParameterParams: '&' }), undefined);
|
|
4858
|
+
});
|
|
4859
|
+
});
|
|
4860
|
+
test('should keep an empty string parameter value distinct from having none', async () => {
|
|
4861
|
+
await setupPreRenderTest('params-empty-value', { liveboardId: 'original-lb' });
|
|
4862
|
+
// `paramVal1=` is that parameter's value, not an absence — so it must
|
|
4863
|
+
// not collapse to the empty marker.
|
|
4864
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4865
|
+
preRenderId: 'params-empty-value',
|
|
4866
|
+
liveboardId: 'original-lb',
|
|
4867
|
+
runtimeParameters: [{ name: 'Region Param', value: '' }],
|
|
4868
|
+
});
|
|
4869
|
+
embed2.showPreRender();
|
|
4870
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4871
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4872
|
+
runtimeParameterParams: 'param1=Region%20Param¶mVal1=',
|
|
4873
|
+
}), undefined);
|
|
4874
|
+
});
|
|
4875
|
+
});
|
|
4876
|
+
test('should hand the pre-render over to the embed being shown', async () => {
|
|
4877
|
+
const embed1 = await setupPreRenderTest('take-over-state', { liveboardId: 'original-lb' });
|
|
4878
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4879
|
+
preRenderId: 'take-over-state',
|
|
4880
|
+
liveboardId: 'second-lb',
|
|
4881
|
+
});
|
|
4882
|
+
await embed2.showPreRender();
|
|
4883
|
+
// It connected to embed1's pre-render and is now what the wrapper
|
|
4884
|
+
// points at, so getPreRenderObj() means "what is showing".
|
|
4885
|
+
expect(embed2.getPreRenderObj()).toBe(embed2);
|
|
4886
|
+
expect(embed1.getPreRenderObj()).toBe(embed2);
|
|
4887
|
+
});
|
|
4888
|
+
test('should not strand callbacks when the container loads after the shown embed was hidden', async () => {
|
|
4889
|
+
// The creator is subscribed but the container has NOT announced itself
|
|
4890
|
+
// yet, which is the state a real pre-render starts in.
|
|
4891
|
+
const embed1 = await setupPreRenderTest('loaded-after-hide', { liveboardId: 'original-lb' });
|
|
4892
|
+
embed1.isEmbedContainerLoaded = false;
|
|
4893
|
+
// Second embed shows, takes the pre-render over, then is hidden — which
|
|
4894
|
+
// unsubscribes it, so it will never hear EmbedListenerReady itself.
|
|
4895
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4896
|
+
preRenderId: 'loaded-after-hide',
|
|
4897
|
+
liveboardId: 'second-lb',
|
|
4898
|
+
});
|
|
4899
|
+
await embed2.showPreRender();
|
|
4900
|
+
embed2.hidePreRender();
|
|
4901
|
+
expect(embed2.isEmbedContainerLoaded).toBe(false);
|
|
4902
|
+
// Container comes up and the creator hears it.
|
|
4903
|
+
embed1.createEmbedContainerHandler(index_1.EmbedEvent.EmbedListenerReady)();
|
|
4904
|
+
mockProcessTrigger.mockClear();
|
|
4905
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
4906
|
+
// A third embed reads the state off embed2, which owns the wrapper and
|
|
4907
|
+
// never learned the container was up. Reading a per-instance snapshot
|
|
4908
|
+
// here leaves UpdateEmbedParams queued forever and the pre-render stuck
|
|
4909
|
+
// on the previous liveboard.
|
|
4910
|
+
const embed3 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4911
|
+
preRenderId: 'loaded-after-hide',
|
|
4912
|
+
liveboardId: 'third-lb',
|
|
4913
|
+
});
|
|
4914
|
+
await embed3.showPreRender();
|
|
4915
|
+
expect(embed3.isEmbedContainerLoaded).toBe(true);
|
|
4916
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4917
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4918
|
+
expect(eventTypes).toContain(types_1.HostEvent.UpdateEmbedParams);
|
|
4919
|
+
}, 300);
|
|
4920
|
+
});
|
|
4921
|
+
test('should not reconcile runtime filters unless the view config opts in', async () => {
|
|
4922
|
+
await setupPreRenderTest('reconcile-flag-off', {
|
|
4923
|
+
liveboardId: 'original-lb',
|
|
4924
|
+
runtimeFilters: [
|
|
4925
|
+
{
|
|
4926
|
+
columnName: 'Color',
|
|
4927
|
+
operator: types_1.RuntimeFilterOp.IN,
|
|
4928
|
+
values: ['red', 'blue'],
|
|
4929
|
+
},
|
|
4930
|
+
],
|
|
4931
|
+
});
|
|
4932
|
+
// Same shape as the clear-filters case above, minus the flag: the
|
|
4933
|
+
// previous config left filters on the shared pre-render and this one
|
|
4934
|
+
// declares none. Without preRenderConfig.reconcileRuntimeParams the SDK
|
|
4935
|
+
// leaves that to the container, so no UpdateRuntimeFilters goes out.
|
|
4936
|
+
const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
|
|
4937
|
+
preRenderId: 'reconcile-flag-off',
|
|
4938
|
+
liveboardId: 'original-lb',
|
|
4939
|
+
});
|
|
4940
|
+
embed2.showPreRender();
|
|
4941
|
+
await (0, test_utils_1.executeAfterWait)(() => {
|
|
4942
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4943
|
+
expect(eventTypes).toContain(types_1.HostEvent.UpdateEmbedParams);
|
|
4944
|
+
expect(eventTypes).not.toContain(types_1.HostEvent.UpdateRuntimeFilters);
|
|
4945
|
+
});
|
|
4946
|
+
});
|
|
4600
4947
|
test('should handle error when getUpdateEmbedParamsObject fails during showPreRender', async () => {
|
|
4601
4948
|
await setupPreRenderTest('error-test', { liveboardId: 'original-lb' });
|
|
4602
4949
|
const handleErrorSpy = jest.spyOn(index_1.LiveboardEmbed.prototype, 'handleError');
|