@thoughtspot/visual-embed-sdk 1.44.1 → 1.44.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/package.json +6 -5
- package/cjs/src/api-intercept.d.ts.map +1 -1
- package/cjs/src/api-intercept.js +8 -3
- package/cjs/src/api-intercept.js.map +1 -1
- package/cjs/src/api-intercept.spec.js +19 -3
- package/cjs/src/api-intercept.spec.js.map +1 -1
- package/cjs/src/auth.spec.js +43 -42
- package/cjs/src/auth.spec.js.map +1 -1
- package/cjs/src/authToken.spec.js +3 -3
- package/cjs/src/authToken.spec.js.map +1 -1
- package/cjs/src/embed/app.d.ts +17 -0
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +9 -5
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +96 -6
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts +1 -1
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +4 -0
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/base.spec.js +71 -15
- package/cjs/src/embed/base.spec.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.spec.js +2 -2
- package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +6 -1
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +8 -3
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/embed.spec.js +101 -2
- package/cjs/src/embed/embed.spec.js.map +1 -1
- package/cjs/src/embed/events.spec.js +2 -2
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +18 -0
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +13 -6
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +114 -26
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/pinboard.spec.js +1 -1
- package/cjs/src/embed/pinboard.spec.js.map +1 -1
- package/cjs/src/embed/sage.spec.js +2 -2
- package/cjs/src/embed/sage.spec.js.map +1 -1
- package/cjs/src/embed/search.spec.js +118 -2
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed-trigger.spec.js +2 -3
- package/cjs/src/embed/ts-embed-trigger.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +3 -2
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +51 -17
- 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 +335 -71
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.d.ts +8 -0
- package/cjs/src/errors.d.ts.map +1 -1
- package/cjs/src/errors.js +8 -0
- package/cjs/src/errors.js.map +1 -1
- package/cjs/src/mixpanel-service.spec.js +1 -1
- package/cjs/src/mixpanel-service.spec.js.map +1 -1
- package/cjs/src/react/index.spec.js +3 -4
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/test/test-utils.js +1 -1
- package/cjs/src/test/test-utils.js.map +1 -1
- package/cjs/src/types.d.ts +194 -1
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +94 -2
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/authService.spec.js +8 -8
- package/cjs/src/utils/authService/authService.spec.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/cjs/src/utils/graphql/graphql-request.spec.js +1 -1
- package/cjs/src/utils/graphql/graphql-request.spec.js.map +1 -1
- package/cjs/src/utils/graphql/sourceService.spec.js +1 -1
- package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -1
- package/cjs/src/utils/logger.spec.d.ts +5 -20
- package/cjs/src/utils/logger.spec.d.ts.map +1 -1
- package/cjs/src/utils/processData.spec.js +17 -17
- package/cjs/src/utils/processData.spec.js.map +1 -1
- package/cjs/src/utils/processTrigger.spec.js +8 -8
- package/cjs/src/utils/processTrigger.spec.js.map +1 -1
- package/cjs/src/utils.d.ts +16 -3
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +60 -5
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +72 -10
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-BE9gGzRX.js → index-D0n5LIka.js} +1 -1
- package/dist/src/api-intercept.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +17 -0
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +1 -1
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +18 -0
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +3 -2
- 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/errors.d.ts +8 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/types.d.ts +194 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/logger.spec.d.ts +5 -20
- package/dist/src/utils/logger.spec.d.ts.map +1 -1
- package/dist/src/utils.d.ts +16 -3
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +282 -74
- package/dist/tsembed-react.js +281 -73
- package/dist/tsembed.es.js +282 -74
- package/dist/tsembed.js +281 -73
- package/dist/visual-embed-sdk-react-full.d.ts +185 -3
- package/dist/visual-embed-sdk-react.d.ts +184 -2
- package/dist/visual-embed-sdk.d.ts +185 -3
- package/lib/package.json +6 -5
- package/lib/src/api-intercept.d.ts.map +1 -1
- package/lib/src/api-intercept.js +9 -4
- package/lib/src/api-intercept.js.map +1 -1
- package/lib/src/api-intercept.spec.js +20 -4
- package/lib/src/api-intercept.spec.js.map +1 -1
- package/lib/src/auth.spec.js +43 -42
- package/lib/src/auth.spec.js.map +1 -1
- package/lib/src/authToken.spec.js +3 -3
- package/lib/src/authToken.spec.js.map +1 -1
- package/lib/src/embed/app.d.ts +17 -0
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +10 -6
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +96 -6
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +1 -1
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +5 -1
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/base.spec.js +72 -16
- package/lib/src/embed/base.spec.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.spec.js +2 -2
- package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +7 -2
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +9 -4
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/embed.spec.js +103 -4
- package/lib/src/embed/embed.spec.js.map +1 -1
- package/lib/src/embed/events.spec.js +2 -2
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +2 -2
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +18 -0
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +15 -8
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +114 -26
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/pinboard.spec.js +1 -1
- package/lib/src/embed/pinboard.spec.js.map +1 -1
- package/lib/src/embed/sage.spec.js +2 -2
- package/lib/src/embed/sage.spec.js.map +1 -1
- package/lib/src/embed/search.spec.js +118 -2
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/ts-embed-trigger.spec.js +2 -3
- package/lib/src/embed/ts-embed-trigger.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +3 -2
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +52 -18
- 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 +336 -72
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.d.ts +8 -0
- package/lib/src/errors.d.ts.map +1 -1
- package/lib/src/errors.js +8 -0
- package/lib/src/errors.js.map +1 -1
- package/lib/src/mixpanel-service.spec.js +1 -1
- package/lib/src/mixpanel-service.spec.js.map +1 -1
- package/lib/src/react/index.spec.js +3 -4
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/test/test-utils.js +1 -1
- package/lib/src/test/test-utils.js.map +1 -1
- package/lib/src/types.d.ts +194 -1
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +93 -1
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/authService.spec.js +8 -8
- package/lib/src/utils/authService/authService.spec.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/lib/src/utils/graphql/graphql-request.spec.js +1 -1
- package/lib/src/utils/graphql/graphql-request.spec.js.map +1 -1
- package/lib/src/utils/graphql/sourceService.spec.js +1 -1
- package/lib/src/utils/graphql/sourceService.spec.js.map +1 -1
- package/lib/src/utils/logger.spec.d.ts +5 -20
- package/lib/src/utils/logger.spec.d.ts.map +1 -1
- package/lib/src/utils/processData.spec.js +17 -17
- package/lib/src/utils/processData.spec.js.map +1 -1
- package/lib/src/utils/processTrigger.spec.js +8 -8
- package/lib/src/utils/processTrigger.spec.js.map +1 -1
- package/lib/src/utils.d.ts +16 -3
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +57 -4
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +73 -11
- package/lib/src/utils.spec.js.map +1 -1
- package/package.json +6 -5
- package/src/api-intercept.spec.ts +23 -10
- package/src/api-intercept.ts +9 -4
- package/src/auth.spec.ts +53 -51
- package/src/authToken.spec.ts +3 -3
- package/src/embed/app.spec.ts +128 -7
- package/src/embed/app.ts +30 -4
- package/src/embed/base.spec.ts +95 -21
- package/src/embed/base.ts +5 -2
- package/src/embed/bodyless-conversation.spec.ts +2 -2
- package/src/embed/conversation.spec.ts +9 -4
- package/src/embed/conversation.ts +7 -2
- package/src/embed/embed.spec.ts +122 -2
- package/src/embed/events.spec.ts +2 -2
- package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
- package/src/embed/liveboard.spec.ts +137 -29
- package/src/embed/liveboard.ts +36 -6
- package/src/embed/pinboard.spec.ts +1 -1
- package/src/embed/sage.spec.ts +2 -2
- package/src/embed/search.spec.ts +133 -2
- package/src/embed/ts-embed-trigger.spec.ts +2 -3
- package/src/embed/ts-embed.spec.ts +424 -91
- package/src/embed/ts-embed.ts +56 -19
- package/src/errors.ts +8 -0
- package/src/mixpanel-service.spec.ts +1 -1
- package/src/react/index.spec.tsx +4 -5
- package/src/test/test-utils.ts +2 -2
- package/src/types.ts +206 -1
- package/src/utils/authService/authService.spec.ts +17 -17
- package/src/utils/authService/tokenizedAuthService.spec.ts +4 -4
- package/src/utils/graphql/answerService/answerService.spec.ts +3 -3
- package/src/utils/graphql/graphql-request.spec.ts +2 -2
- package/src/utils/graphql/sourceService.spec.ts +1 -1
- package/src/utils/processData.spec.ts +26 -26
- package/src/utils/processTrigger.spec.ts +8 -8
- package/src/utils.spec.ts +100 -11
- package/src/utils.ts +59 -7
|
@@ -2,7 +2,7 @@ import { resetValueFromWindow } from '../utils';
|
|
|
2
2
|
import { ERROR_MESSAGE } from '../errors';
|
|
3
3
|
import { resetCachedAuthToken } from '../authToken';
|
|
4
4
|
import { AuthType, init, EmbedEvent, SearchEmbed, PinboardEmbed, AppEmbed, LiveboardEmbed, SageEmbed, AnswerService, } from '../index';
|
|
5
|
-
import { Action, HomeLeftNavItem, RuntimeFilterOp, HomepageModule, HostEvent, ContextMenuTriggerOptions, CustomActionTarget, CustomActionsPosition, } from '../types';
|
|
5
|
+
import { Action, HomeLeftNavItem, RuntimeFilterOp, HomepageModule, HostEvent, ContextMenuTriggerOptions, CustomActionTarget, CustomActionsPosition, ErrorDetailsTypes, EmbedErrorCodes, } from '../types';
|
|
6
6
|
import { executeAfterWait, getDocumentBody, getIFrameEl, getIFrameSrc, getRootEl, postMessageToParent, defaultParamsForPinboardEmbed, waitFor, expectUrlMatchesWithParams, expectUrlToHaveParamsWithValues, mockMessageChannel, createRootEleForEmbed, expectUrlMatch, fixedEncodeURI, } from '../test/test-utils';
|
|
7
7
|
import * as config from '../config';
|
|
8
8
|
import * as embedConfig from './embedConfig';
|
|
@@ -40,7 +40,7 @@ export const defaultParams = `&${defaultParamsWithoutHiddenActions}&hideAction=[
|
|
|
40
40
|
const hideBydefault = `&hideAction=${fixedEncodeURI(JSON.stringify([Action.ReportError, ...HiddenActionItemByDefaultForSearchEmbed]))}`;
|
|
41
41
|
const defaultParamsWithHiddenActions = defaultParamsWithoutHiddenActions + hideBydefault;
|
|
42
42
|
beforeAll(() => {
|
|
43
|
-
spyOn(window, 'alert');
|
|
43
|
+
jest.spyOn(window, 'alert').mockImplementation(() => { });
|
|
44
44
|
});
|
|
45
45
|
const customisations = {
|
|
46
46
|
style: {
|
|
@@ -96,7 +96,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
96
96
|
resetCachedAuthToken();
|
|
97
97
|
});
|
|
98
98
|
beforeAll(() => {
|
|
99
|
-
jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(
|
|
99
|
+
jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(undefined);
|
|
100
100
|
});
|
|
101
101
|
describe('Vaidate iframe properties', () => {
|
|
102
102
|
beforeAll(() => {
|
|
@@ -204,7 +204,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
204
204
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
205
205
|
});
|
|
206
206
|
await executeAfterWait(() => {
|
|
207
|
-
expect(baseInstance.notifyAuthFailure).
|
|
207
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
|
|
208
208
|
expect(baseInstance.handleAuth).not.toHaveBeenCalled();
|
|
209
209
|
expect(mockPort.postMessage).toHaveBeenCalledWith({
|
|
210
210
|
type: EmbedEvent.AuthExpire,
|
|
@@ -236,7 +236,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
236
236
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
237
237
|
});
|
|
238
238
|
await executeAfterWait(() => {
|
|
239
|
-
expect(baseInstance.notifyAuthFailure).
|
|
239
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
|
|
240
240
|
expect(mockPort.postMessage).not.toHaveBeenCalledWith({
|
|
241
241
|
type: EmbedEvent.AuthExpire,
|
|
242
242
|
data: { authToken: 'test_auth_token2' },
|
|
@@ -588,7 +588,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
588
588
|
expect(iframe.contentWindow.postMessage).toHaveBeenCalledTimes(0);
|
|
589
589
|
}, 1000);
|
|
590
590
|
});
|
|
591
|
-
test('should remove event listener when called off method', async (
|
|
591
|
+
test('should remove event listener when called off method', async () => {
|
|
592
592
|
const mockEmbedEventPayload = {
|
|
593
593
|
type: EmbedEvent.Save,
|
|
594
594
|
data: { answerId: '123' },
|
|
@@ -606,10 +606,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
606
606
|
const iframe = getIFrameEl();
|
|
607
607
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
|
|
608
608
|
});
|
|
609
|
-
|
|
610
|
-
expect(mockFn).toHaveBeenCalledTimes(1);
|
|
611
|
-
done();
|
|
612
|
-
}, 100);
|
|
609
|
+
expect(mockFn).toHaveBeenCalledTimes(1);
|
|
613
610
|
});
|
|
614
611
|
});
|
|
615
612
|
describe('Appinit embedEvent in cookieless authentication authType', () => {
|
|
@@ -850,7 +847,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
850
847
|
authType: AuthType.TrustedAuthTokenCookieless,
|
|
851
848
|
getAuthToken: () => Promise.reject(),
|
|
852
849
|
});
|
|
853
|
-
jest.spyOn(logger, 'error').
|
|
850
|
+
jest.spyOn(logger, 'error').mockImplementation(() => { });
|
|
854
851
|
});
|
|
855
852
|
afterEach(() => {
|
|
856
853
|
jest.clearAllMocks();
|
|
@@ -917,14 +914,14 @@ describe('Unit test case for ts embed', () => {
|
|
|
917
914
|
const mockPort = {
|
|
918
915
|
postMessage: jest.fn(),
|
|
919
916
|
};
|
|
920
|
-
const loggerSpy = jest.spyOn(logger, 'error').
|
|
917
|
+
const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
|
|
921
918
|
await executeAfterWait(() => {
|
|
922
919
|
const iframe = getIFrameEl();
|
|
923
920
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
924
921
|
});
|
|
925
922
|
await executeAfterWait(() => {
|
|
926
923
|
expect(getRootEl().innerHTML).toContain('Not logged in');
|
|
927
|
-
expect(baseInstance.notifyAuthFailure).
|
|
924
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
|
|
928
925
|
expect(loggerSpy).toHaveBeenCalledTimes(1);
|
|
929
926
|
});
|
|
930
927
|
jest.spyOn(authService, 'verifyTokenService').mockClear();
|
|
@@ -941,7 +938,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
941
938
|
const searchEmbed = new SearchEmbed(getRootEl(), { ...defaultViewConfig, preRenderId: 'test' });
|
|
942
939
|
jest.spyOn(baseInstance, 'notifyAuthFailure');
|
|
943
940
|
searchEmbed.preRender();
|
|
944
|
-
const loggerSpy = jest.spyOn(logger, 'error').
|
|
941
|
+
const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
|
|
945
942
|
const mockPort = {
|
|
946
943
|
postMessage: jest.fn(),
|
|
947
944
|
};
|
|
@@ -952,7 +949,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
952
949
|
const preRenderWrapper = document.getElementById('tsEmbed-pre-render-wrapper-test');
|
|
953
950
|
await executeAfterWait(() => {
|
|
954
951
|
expect(preRenderWrapper.innerHTML).toContain('Not logged in');
|
|
955
|
-
expect(baseInstance.notifyAuthFailure).
|
|
952
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
|
|
956
953
|
expect(loggerSpy).toHaveBeenCalledTimes(1);
|
|
957
954
|
});
|
|
958
955
|
jest.spyOn(authService, 'verifyTokenService').mockClear();
|
|
@@ -982,7 +979,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
982
979
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
|
|
983
980
|
});
|
|
984
981
|
await executeAfterWait(() => {
|
|
985
|
-
expect(baseInstance.notifyAuthFailure).
|
|
982
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
|
|
986
983
|
expect(baseInstance.handleAuth).toHaveBeenCalled();
|
|
987
984
|
});
|
|
988
985
|
});
|
|
@@ -1007,7 +1004,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1007
1004
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload);
|
|
1008
1005
|
});
|
|
1009
1006
|
await executeAfterWait(() => {
|
|
1010
|
-
expect(baseInstance.notifyAuthFailure).
|
|
1007
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.EXPIRY);
|
|
1011
1008
|
expect(baseInstance.handleAuth).not.toHaveBeenCalled();
|
|
1012
1009
|
});
|
|
1013
1010
|
});
|
|
@@ -1023,9 +1020,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1023
1020
|
const setup = async (isLoggedIn = false) => {
|
|
1024
1021
|
jest.spyOn(window, 'addEventListener').mockImplementationOnce((event, handler, options) => {
|
|
1025
1022
|
handler({
|
|
1026
|
-
data: {
|
|
1027
|
-
type: 'xyz',
|
|
1028
|
-
},
|
|
1023
|
+
data: { type: 'xyz' },
|
|
1029
1024
|
ports: [3000],
|
|
1030
1025
|
source: null,
|
|
1031
1026
|
});
|
|
@@ -1043,8 +1038,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
1043
1038
|
};
|
|
1044
1039
|
test('mixpanel should call with VISUAL_SDK_RENDER_COMPLETE', async () => {
|
|
1045
1040
|
await setup(true);
|
|
1046
|
-
expect(mockMixPanelEvent).
|
|
1047
|
-
expect(mockMixPanelEvent).
|
|
1041
|
+
expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
|
|
1042
|
+
expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_COMPLETE, expect.objectContaining({
|
|
1048
1043
|
elWidth: 0,
|
|
1049
1044
|
elHeight: 0,
|
|
1050
1045
|
}));
|
|
@@ -1054,12 +1049,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
1054
1049
|
const prefetchIframe = document.querySelectorAll('.prefetchIframe');
|
|
1055
1050
|
expect(prefetchIframe.length).toBe(0);
|
|
1056
1051
|
});
|
|
1057
|
-
test('Should render failure when login fails', async (
|
|
1058
|
-
setup(false);
|
|
1059
|
-
|
|
1060
|
-
expect(getRootEl().innerHTML).toContain('Failed to Login');
|
|
1061
|
-
done();
|
|
1062
|
-
});
|
|
1052
|
+
test('Should render failure when login fails', async () => {
|
|
1053
|
+
await setup(false);
|
|
1054
|
+
expect(getRootEl().innerHTML).toContain('Failed to Login');
|
|
1063
1055
|
});
|
|
1064
1056
|
});
|
|
1065
1057
|
describe('Trigger infoSuccess event on iframe load', () => {
|
|
@@ -1074,9 +1066,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1074
1066
|
const setup = async (isLoggedIn = false, overrideOrgId = undefined) => {
|
|
1075
1067
|
jest.spyOn(window, 'addEventListener').mockImplementationOnce((event, handler, options) => {
|
|
1076
1068
|
handler({
|
|
1077
|
-
data: {
|
|
1078
|
-
type: 'xyz',
|
|
1079
|
-
},
|
|
1069
|
+
data: { type: 'xyz' },
|
|
1080
1070
|
ports: [3000],
|
|
1081
1071
|
source: null,
|
|
1082
1072
|
});
|
|
@@ -1309,19 +1299,19 @@ describe('Unit test case for ts embed', () => {
|
|
|
1309
1299
|
const iFrame = document.createElement('div');
|
|
1310
1300
|
iFrame.contentWindow = null;
|
|
1311
1301
|
jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
|
|
1312
|
-
spyOn(logger, 'error');
|
|
1302
|
+
jest.spyOn(logger, 'error');
|
|
1313
1303
|
await tsEmbed.render();
|
|
1314
1304
|
});
|
|
1315
1305
|
test('mixpanel should call with VISUAL_SDK_RENDER_FAILED', () => {
|
|
1316
|
-
expect(mockMixPanelEvent).
|
|
1317
|
-
expect(mockMixPanelEvent).
|
|
1306
|
+
expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_START);
|
|
1307
|
+
expect(mockMixPanelEvent).toHaveBeenCalledWith(MIXPANEL_EVENT.VISUAL_SDK_RENDER_FAILED, {
|
|
1318
1308
|
error: 'false',
|
|
1319
1309
|
});
|
|
1320
1310
|
});
|
|
1321
1311
|
});
|
|
1322
1312
|
describe('when visible actions are set', () => {
|
|
1323
1313
|
test('should throw error when there are both visible and hidden actions - pinboard', async () => {
|
|
1324
|
-
spyOn(logger, 'error');
|
|
1314
|
+
jest.spyOn(logger, 'error');
|
|
1325
1315
|
const pinboardEmbed = new PinboardEmbed(getRootEl(), {
|
|
1326
1316
|
hiddenActions: [Action.DownloadAsCsv],
|
|
1327
1317
|
visibleActions: [Action.DownloadAsCsv],
|
|
@@ -1330,7 +1320,12 @@ describe('Unit test case for ts embed', () => {
|
|
|
1330
1320
|
});
|
|
1331
1321
|
await pinboardEmbed.render();
|
|
1332
1322
|
expect(pinboardEmbed['isError']).toBe(true);
|
|
1333
|
-
expect(logger.error).toHaveBeenCalledWith(
|
|
1323
|
+
expect(logger.error).toHaveBeenCalledWith({
|
|
1324
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1325
|
+
message: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
|
|
1326
|
+
code: EmbedErrorCodes.CONFLICTING_ACTIONS_CONFIG,
|
|
1327
|
+
error: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
|
|
1328
|
+
});
|
|
1334
1329
|
});
|
|
1335
1330
|
test('should not throw error when there are only visible or hidden actions - pinboard', async () => {
|
|
1336
1331
|
const pinboardEmbed = new PinboardEmbed(getRootEl(), {
|
|
@@ -1347,7 +1342,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1347
1342
|
* @param visibleActions
|
|
1348
1343
|
*/
|
|
1349
1344
|
async function testActionsForLiveboards(hiddenActions, visibleActions) {
|
|
1350
|
-
spyOn(logger, 'error');
|
|
1345
|
+
jest.spyOn(logger, 'error');
|
|
1351
1346
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1352
1347
|
hiddenActions,
|
|
1353
1348
|
visibleActions,
|
|
@@ -1356,7 +1351,12 @@ describe('Unit test case for ts embed', () => {
|
|
|
1356
1351
|
});
|
|
1357
1352
|
await liveboardEmbed.render();
|
|
1358
1353
|
expect(liveboardEmbed['isError']).toBe(true);
|
|
1359
|
-
expect(logger.error).toHaveBeenCalledWith(
|
|
1354
|
+
expect(logger.error).toHaveBeenCalledWith({
|
|
1355
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1356
|
+
message: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
|
|
1357
|
+
code: EmbedErrorCodes.CONFLICTING_ACTIONS_CONFIG,
|
|
1358
|
+
error: ERROR_MESSAGE.CONFLICTING_ACTIONS_CONFIG,
|
|
1359
|
+
});
|
|
1360
1360
|
}
|
|
1361
1361
|
test('should throw error when there are both visible and hidden action arrays', async () => {
|
|
1362
1362
|
await testActionsForLiveboards([Action.DownloadAsCsv], [Action.DownloadAsCsv]);
|
|
@@ -1388,7 +1388,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1388
1388
|
});
|
|
1389
1389
|
describe('when visible Tabs are set', () => {
|
|
1390
1390
|
test('should throw error when there are both visible and hidden Tabs - pinboard', async () => {
|
|
1391
|
-
spyOn(logger, 'error');
|
|
1391
|
+
jest.spyOn(logger, 'error');
|
|
1392
1392
|
const pinboardEmbed = new PinboardEmbed(getRootEl(), {
|
|
1393
1393
|
visibleTabs: [tabId1],
|
|
1394
1394
|
hiddenTabs: [tabId2],
|
|
@@ -1397,7 +1397,12 @@ describe('Unit test case for ts embed', () => {
|
|
|
1397
1397
|
});
|
|
1398
1398
|
await pinboardEmbed.render();
|
|
1399
1399
|
expect(pinboardEmbed['isError']).toBe(true);
|
|
1400
|
-
expect(logger.error).toHaveBeenCalledWith(
|
|
1400
|
+
expect(logger.error).toHaveBeenCalledWith({
|
|
1401
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1402
|
+
message: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
|
|
1403
|
+
code: EmbedErrorCodes.CONFLICTING_TABS_CONFIG,
|
|
1404
|
+
error: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
|
|
1405
|
+
});
|
|
1401
1406
|
});
|
|
1402
1407
|
test('should not throw error when there are only visible or hidden Tabs - pinboard', async () => {
|
|
1403
1408
|
const pinboardEmbed = new PinboardEmbed(getRootEl(), {
|
|
@@ -1414,7 +1419,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1414
1419
|
* @param visibleTabs
|
|
1415
1420
|
*/
|
|
1416
1421
|
async function testTabsForLiveboards(hiddenTabs, visibleTabs) {
|
|
1417
|
-
spyOn(logger, 'error');
|
|
1422
|
+
jest.spyOn(logger, 'error');
|
|
1418
1423
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1419
1424
|
hiddenTabs,
|
|
1420
1425
|
visibleTabs,
|
|
@@ -1423,7 +1428,12 @@ describe('Unit test case for ts embed', () => {
|
|
|
1423
1428
|
});
|
|
1424
1429
|
await liveboardEmbed.render();
|
|
1425
1430
|
expect(liveboardEmbed['isError']).toBe(true);
|
|
1426
|
-
expect(logger.error).toHaveBeenCalledWith(
|
|
1431
|
+
expect(logger.error).toHaveBeenCalledWith({
|
|
1432
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1433
|
+
message: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
|
|
1434
|
+
code: EmbedErrorCodes.CONFLICTING_TABS_CONFIG,
|
|
1435
|
+
error: ERROR_MESSAGE.CONFLICTING_TABS_CONFIG,
|
|
1436
|
+
});
|
|
1427
1437
|
}
|
|
1428
1438
|
test('should throw error when there are both visible and hidden Tab arrays', async () => {
|
|
1429
1439
|
await testTabsForLiveboards([tabId1], [tabId2]);
|
|
@@ -1462,11 +1472,16 @@ describe('Unit test case for ts embed', () => {
|
|
|
1462
1472
|
});
|
|
1463
1473
|
});
|
|
1464
1474
|
test('Error should be true', async () => {
|
|
1465
|
-
spyOn(logger, 'error');
|
|
1475
|
+
jest.spyOn(logger, 'error');
|
|
1466
1476
|
const tsEmbed = new SearchEmbed(getRootEl(), {});
|
|
1467
1477
|
await tsEmbed.render();
|
|
1468
1478
|
expect(tsEmbed['isError']).toBe(true);
|
|
1469
|
-
expect(logger.error).toHaveBeenCalledWith(
|
|
1479
|
+
expect(logger.error).toHaveBeenCalledWith({
|
|
1480
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
1481
|
+
message: ERROR_MESSAGE.INIT_SDK_REQUIRED,
|
|
1482
|
+
code: EmbedErrorCodes.INIT_ERROR,
|
|
1483
|
+
error: ERROR_MESSAGE.INIT_SDK_REQUIRED,
|
|
1484
|
+
});
|
|
1470
1485
|
});
|
|
1471
1486
|
});
|
|
1472
1487
|
describe('V1Embed ', () => {
|
|
@@ -1474,7 +1489,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1474
1489
|
jest.spyOn(config, 'getThoughtSpotHost').mockImplementation(() => 'http://tshost');
|
|
1475
1490
|
});
|
|
1476
1491
|
test('when isRendered is true than isError will be true', async () => {
|
|
1477
|
-
spyOn(logger, 'warn');
|
|
1492
|
+
jest.spyOn(logger, 'warn');
|
|
1478
1493
|
const viEmbedIns = new tsEmbedInstance.V1Embed(getRootEl(), defaultViewConfig);
|
|
1479
1494
|
expect(viEmbedIns['isError']).toBe(false);
|
|
1480
1495
|
await viEmbedIns.render();
|
|
@@ -1518,7 +1533,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1518
1533
|
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${defaultParamsForPinboardEmbed}${defaultParamsPost}#/${path}`);
|
|
1519
1534
|
});
|
|
1520
1535
|
test('navigateToPage function use before render', async () => {
|
|
1521
|
-
spyOn(logger, 'log');
|
|
1536
|
+
jest.spyOn(logger, 'log');
|
|
1522
1537
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1523
1538
|
frameParams: {
|
|
1524
1539
|
width: '100%',
|
|
@@ -1722,7 +1737,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1722
1737
|
await appEmbed.render();
|
|
1723
1738
|
expectUrlMatchesWithParams(getIFrameSrc(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&additionalPendoKey=1234${defaultParamsPost}#/home`);
|
|
1724
1739
|
});
|
|
1725
|
-
xit('Sets the forceSAMLAutoRedirect param', async (
|
|
1740
|
+
xit('Sets the forceSAMLAutoRedirect param', async () => {
|
|
1726
1741
|
jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
|
|
1727
1742
|
init({
|
|
1728
1743
|
thoughtSpotHost: 'tshost',
|
|
@@ -1735,11 +1750,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
1735
1750
|
},
|
|
1736
1751
|
});
|
|
1737
1752
|
appEmbed.render();
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
|
|
1741
|
-
done();
|
|
1742
|
-
});
|
|
1753
|
+
expect(getIFrameSrc()).toContain('authType=EmbeddedSSO');
|
|
1754
|
+
expect(getIFrameSrc()).toContain('forceSAMLAutoRedirect=true');
|
|
1743
1755
|
});
|
|
1744
1756
|
it('Should set the override locale for number/date and currency format', async () => {
|
|
1745
1757
|
jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValue(true);
|
|
@@ -1889,8 +1901,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1889
1901
|
beforeAll(() => {
|
|
1890
1902
|
delete window.location;
|
|
1891
1903
|
window.location = {
|
|
1892
|
-
|
|
1893
|
-
search: '',
|
|
1904
|
+
assign: jest.fn(),
|
|
1894
1905
|
};
|
|
1895
1906
|
});
|
|
1896
1907
|
beforeEach(() => {
|
|
@@ -1960,7 +1971,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1960
1971
|
});
|
|
1961
1972
|
afterAll(() => {
|
|
1962
1973
|
const rootEle = document.getElementById('myRoot');
|
|
1963
|
-
rootEle.remove();
|
|
1974
|
+
rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
|
|
1964
1975
|
jest.clearAllMocks();
|
|
1965
1976
|
});
|
|
1966
1977
|
it('should preRender and hide the iframe', async () => {
|
|
@@ -1994,9 +2005,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
1994
2005
|
};
|
|
1995
2006
|
});
|
|
1996
2007
|
// show preRender
|
|
1997
|
-
const warnSpy = spyOn(logger, 'warn');
|
|
2008
|
+
const warnSpy = jest.spyOn(logger, 'warn');
|
|
1998
2009
|
libEmbed.showPreRender();
|
|
1999
|
-
expect(warnSpy).toHaveBeenCalledTimes(
|
|
2010
|
+
expect(warnSpy).toHaveBeenCalledTimes(1);
|
|
2000
2011
|
resizeObserverCb([
|
|
2001
2012
|
{
|
|
2002
2013
|
target: tsEmbedDiv,
|
|
@@ -2017,7 +2028,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2017
2028
|
});
|
|
2018
2029
|
it('preRender called without preRenderId should log error ', () => {
|
|
2019
2030
|
createRootEleForEmbed();
|
|
2020
|
-
spyOn(logger, 'error');
|
|
2031
|
+
jest.spyOn(logger, 'error');
|
|
2021
2032
|
const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
2022
2033
|
liveboardId: 'myLiveboardId',
|
|
2023
2034
|
});
|
|
@@ -2044,7 +2055,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2044
2055
|
preRenderId: 'i-am-preRendered',
|
|
2045
2056
|
liveboardId: 'myLiveboardId',
|
|
2046
2057
|
});
|
|
2047
|
-
spyOn(libEmbed, 'preRender');
|
|
2058
|
+
jest.spyOn(libEmbed, 'preRender');
|
|
2048
2059
|
libEmbed.hidePreRender();
|
|
2049
2060
|
expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
|
|
2050
2061
|
});
|
|
@@ -2078,8 +2089,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2078
2089
|
const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
2079
2090
|
liveboardId: 'myLiveboardId',
|
|
2080
2091
|
});
|
|
2081
|
-
spyOn(libEmbed, 'preRender');
|
|
2082
|
-
spyOn(logger, 'error');
|
|
2092
|
+
jest.spyOn(libEmbed, 'preRender');
|
|
2093
|
+
jest.spyOn(logger, 'error');
|
|
2083
2094
|
libEmbed.showPreRender();
|
|
2084
2095
|
expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
|
|
2085
2096
|
expect(logger.error).toHaveBeenCalledTimes(1);
|
|
@@ -2109,7 +2120,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2109
2120
|
preRenderId: 'test',
|
|
2110
2121
|
});
|
|
2111
2122
|
await libEmbed.syncPreRenderStyle();
|
|
2112
|
-
expect(logger.error).
|
|
2123
|
+
expect(logger.error).toHaveBeenCalledWith('PreRender should be called before using syncPreRenderStyle');
|
|
2113
2124
|
logger.error.mockClear();
|
|
2114
2125
|
});
|
|
2115
2126
|
});
|
|
@@ -2142,7 +2153,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2142
2153
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
2143
2154
|
});
|
|
2144
2155
|
await executeAfterWait(() => {
|
|
2145
|
-
expect(baseInstance.notifyAuthFailure).
|
|
2156
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
|
|
2146
2157
|
expect(baseInstance.handleAuth).toHaveBeenCalled();
|
|
2147
2158
|
expect(mockPort.postMessage).toHaveBeenCalledWith({
|
|
2148
2159
|
type: EmbedEvent.IdleSessionTimeout,
|
|
@@ -2168,14 +2179,14 @@ describe('Unit test case for ts embed', () => {
|
|
|
2168
2179
|
const mockPort = {
|
|
2169
2180
|
postMessage: jest.fn(),
|
|
2170
2181
|
};
|
|
2171
|
-
const loggerSpy = jest.spyOn(logger, 'error').
|
|
2182
|
+
const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
|
|
2172
2183
|
await executeAfterWait(() => {
|
|
2173
2184
|
const iframe = getIFrameEl();
|
|
2174
2185
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
2175
2186
|
});
|
|
2176
2187
|
await executeAfterWait(() => {
|
|
2177
2188
|
expect(getRootEl().innerHTML).toContain('Not logged in');
|
|
2178
|
-
expect(baseInstance.notifyAuthFailure).
|
|
2189
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
|
|
2179
2190
|
expect(loggerSpy).toHaveBeenCalledTimes(1);
|
|
2180
2191
|
});
|
|
2181
2192
|
jest.spyOn(authService, 'verifyTokenService').mockClear();
|
|
@@ -2200,13 +2211,13 @@ describe('Unit test case for ts embed', () => {
|
|
|
2200
2211
|
const mockPort = {
|
|
2201
2212
|
postMessage: jest.fn(),
|
|
2202
2213
|
};
|
|
2203
|
-
const loggerSpy = jest.spyOn(logger, 'error').
|
|
2214
|
+
const loggerSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
|
|
2204
2215
|
await executeAfterWait(() => {
|
|
2205
2216
|
const iframe = getIFrameEl();
|
|
2206
2217
|
postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
|
|
2207
2218
|
});
|
|
2208
2219
|
await executeAfterWait(() => {
|
|
2209
|
-
expect(baseInstance.notifyAuthFailure).
|
|
2220
|
+
expect(baseInstance.notifyAuthFailure).toHaveBeenCalledWith(authInstance.AuthFailureType.IDLE_SESSION_TIMEOUT);
|
|
2210
2221
|
expect(loggerSpy).toHaveBeenCalledTimes(0);
|
|
2211
2222
|
});
|
|
2212
2223
|
jest.spyOn(authService, 'verifyTokenService').mockClear();
|
|
@@ -2214,7 +2225,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2214
2225
|
});
|
|
2215
2226
|
});
|
|
2216
2227
|
describe('Renders should wait for init to completed', () => {
|
|
2217
|
-
const errorSpy = jest.spyOn(logger, 'error').
|
|
2228
|
+
const errorSpy = jest.spyOn(logger, 'error').mockImplementation(() => { });
|
|
2218
2229
|
beforeEach(() => {
|
|
2219
2230
|
errorSpy.mockClear();
|
|
2220
2231
|
resetValueFromWindow('initFlagKey');
|
|
@@ -2858,7 +2869,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2858
2869
|
});
|
|
2859
2870
|
test('should execute callbacks through executeEvent function', async () => {
|
|
2860
2871
|
let capturedExecuteEvent;
|
|
2861
|
-
mockHandleInterceptEvent.mockImplementation((params) => {
|
|
2872
|
+
mockHandleInterceptEvent.mockImplementation(async (params) => {
|
|
2862
2873
|
capturedExecuteEvent = params.executeEvent;
|
|
2863
2874
|
});
|
|
2864
2875
|
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
@@ -2891,7 +2902,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
2891
2902
|
});
|
|
2892
2903
|
test('should call triggerUIPassThrough through getUnsavedAnswerTml function', async () => {
|
|
2893
2904
|
let capturedGetUnsavedAnswerTml;
|
|
2894
|
-
mockHandleInterceptEvent.mockImplementation((params) => {
|
|
2905
|
+
mockHandleInterceptEvent.mockImplementation(async (params) => {
|
|
2895
2906
|
capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
|
|
2896
2907
|
});
|
|
2897
2908
|
const mockTmlResponse = { tml: 'test-tml-content' };
|
|
@@ -3041,7 +3052,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
3041
3052
|
});
|
|
3042
3053
|
test('should pass eventPort to executeCallbacks', async () => {
|
|
3043
3054
|
let capturedExecuteEvent;
|
|
3044
|
-
mockHandleInterceptEvent.mockImplementation((params) => {
|
|
3055
|
+
mockHandleInterceptEvent.mockImplementation(async (params) => {
|
|
3045
3056
|
capturedExecuteEvent = params.executeEvent;
|
|
3046
3057
|
});
|
|
3047
3058
|
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
@@ -3074,7 +3085,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
3074
3085
|
});
|
|
3075
3086
|
test('should handle getUnsavedAnswerTml with empty response', async () => {
|
|
3076
3087
|
let capturedGetUnsavedAnswerTml;
|
|
3077
|
-
mockHandleInterceptEvent.mockImplementation((params) => {
|
|
3088
|
+
mockHandleInterceptEvent.mockImplementation(async (params) => {
|
|
3078
3089
|
capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
|
|
3079
3090
|
});
|
|
3080
3091
|
mockProcessTrigger.mockResolvedValue([]);
|
|
@@ -3132,4 +3143,257 @@ describe('Unit test case for ts embed', () => {
|
|
|
3132
3143
|
});
|
|
3133
3144
|
});
|
|
3134
3145
|
});
|
|
3146
|
+
describe('Additional Coverage Tests', () => {
|
|
3147
|
+
beforeAll(() => {
|
|
3148
|
+
init({
|
|
3149
|
+
thoughtSpotHost: 'tshost',
|
|
3150
|
+
authType: AuthType.None,
|
|
3151
|
+
});
|
|
3152
|
+
});
|
|
3153
|
+
test('should handle getAuthTokenForCookielessInit with non-cookieless auth', async () => {
|
|
3154
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3155
|
+
const token = await searchEmbed['getAuthTokenForCookielessInit']();
|
|
3156
|
+
expect(token).toBe('');
|
|
3157
|
+
});
|
|
3158
|
+
test('should call setIFrameHeight', async () => {
|
|
3159
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3160
|
+
await searchEmbed.render();
|
|
3161
|
+
await executeAfterWait(() => {
|
|
3162
|
+
searchEmbed['setIFrameHeight'](500);
|
|
3163
|
+
expect(getIFrameEl().style.height).toBe('500px');
|
|
3164
|
+
});
|
|
3165
|
+
});
|
|
3166
|
+
test('should test getIframeCenter calculation', async () => {
|
|
3167
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3168
|
+
await searchEmbed.render();
|
|
3169
|
+
await executeAfterWait(() => {
|
|
3170
|
+
const center = searchEmbed['getIframeCenter']();
|
|
3171
|
+
expect(center).toHaveProperty('iframeCenter');
|
|
3172
|
+
expect(center).toHaveProperty('iframeHeight');
|
|
3173
|
+
expect(center).toHaveProperty('viewPortHeight');
|
|
3174
|
+
});
|
|
3175
|
+
});
|
|
3176
|
+
test('should handle preRender with replaceExistingPreRender=true', async () => {
|
|
3177
|
+
createRootEleForEmbed();
|
|
3178
|
+
const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
3179
|
+
preRenderId: 'test-replace',
|
|
3180
|
+
liveboardId: 'lb1',
|
|
3181
|
+
});
|
|
3182
|
+
await embed1.preRender();
|
|
3183
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
3184
|
+
preRenderId: 'test-replace',
|
|
3185
|
+
liveboardId: 'lb2',
|
|
3186
|
+
});
|
|
3187
|
+
await embed2.preRender(false, true);
|
|
3188
|
+
expect(document.getElementById('tsEmbed-pre-render-wrapper-test-replace')).toBeTruthy();
|
|
3189
|
+
});
|
|
3190
|
+
test('should test getIframeSrc base implementation', () => {
|
|
3191
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3192
|
+
expect(searchEmbed.getIframeSrc()).toBe('');
|
|
3193
|
+
});
|
|
3194
|
+
test('should handle createEmbedEventResponder with OnBeforeGetVizDataIntercept', async () => {
|
|
3195
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3196
|
+
const mockPort = { postMessage: jest.fn() };
|
|
3197
|
+
const responder = searchEmbed['createEmbedEventResponder'](mockPort, EmbedEvent.OnBeforeGetVizDataIntercept);
|
|
3198
|
+
responder({ data: 'test' });
|
|
3199
|
+
expect(mockPort.postMessage).toHaveBeenCalled();
|
|
3200
|
+
});
|
|
3201
|
+
test('should clean up message event listeners', async () => {
|
|
3202
|
+
const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener');
|
|
3203
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3204
|
+
await searchEmbed.render();
|
|
3205
|
+
searchEmbed['unsubscribeToMessageEvents']();
|
|
3206
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('message', expect.any(Function));
|
|
3207
|
+
});
|
|
3208
|
+
});
|
|
3209
|
+
describe('Trigger method edge cases', () => {
|
|
3210
|
+
beforeAll(() => {
|
|
3211
|
+
init({
|
|
3212
|
+
thoughtSpotHost: 'tshost',
|
|
3213
|
+
authType: AuthType.None,
|
|
3214
|
+
});
|
|
3215
|
+
});
|
|
3216
|
+
beforeEach(() => {
|
|
3217
|
+
document.body.innerHTML = getDocumentBody();
|
|
3218
|
+
});
|
|
3219
|
+
test('should handle error when trigger is called with undefined messageType', async () => {
|
|
3220
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3221
|
+
jest.spyOn(logger, 'error');
|
|
3222
|
+
await searchEmbed.render();
|
|
3223
|
+
await executeAfterWait(async () => {
|
|
3224
|
+
const result = await searchEmbed.trigger(undefined);
|
|
3225
|
+
expect(result).toBeNull();
|
|
3226
|
+
expect(logger.error).toHaveBeenCalledWith(expect.objectContaining({
|
|
3227
|
+
errorType: ErrorDetailsTypes.VALIDATION_ERROR,
|
|
3228
|
+
code: EmbedErrorCodes.HOST_EVENT_TYPE_UNDEFINED,
|
|
3229
|
+
}));
|
|
3230
|
+
});
|
|
3231
|
+
});
|
|
3232
|
+
test('should return null when trigger is called before iframe is ready', async () => {
|
|
3233
|
+
jest.spyOn(baseInstance, 'getAuthPromise').mockRejectedValueOnce(new Error('Auth failed'));
|
|
3234
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3235
|
+
jest.spyOn(logger, 'debug');
|
|
3236
|
+
await searchEmbed.render();
|
|
3237
|
+
await executeAfterWait(async () => {
|
|
3238
|
+
const result = await searchEmbed.trigger(HostEvent.Reload);
|
|
3239
|
+
expect(result).toBeNull();
|
|
3240
|
+
});
|
|
3241
|
+
});
|
|
3242
|
+
});
|
|
3243
|
+
describe('PreRender replaceExistingPreRender scenarios', () => {
|
|
3244
|
+
beforeAll(() => {
|
|
3245
|
+
init({
|
|
3246
|
+
thoughtSpotHost: 'tshost',
|
|
3247
|
+
authType: AuthType.None,
|
|
3248
|
+
});
|
|
3249
|
+
});
|
|
3250
|
+
afterEach(() => {
|
|
3251
|
+
const rootEle = document.getElementById('myRoot');
|
|
3252
|
+
rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
|
|
3253
|
+
});
|
|
3254
|
+
test('should skip re-rendering when preRender already exists and replaceExistingPreRender is false', async () => {
|
|
3255
|
+
createRootEleForEmbed();
|
|
3256
|
+
const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
3257
|
+
preRenderId: 'no-replace-test',
|
|
3258
|
+
liveboardId: 'lb1',
|
|
3259
|
+
});
|
|
3260
|
+
await embed1.preRender();
|
|
3261
|
+
await waitFor(() => !!getIFrameEl());
|
|
3262
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
3263
|
+
preRenderId: 'no-replace-test',
|
|
3264
|
+
liveboardId: 'lb2',
|
|
3265
|
+
});
|
|
3266
|
+
const result = await embed2.preRender(false, false);
|
|
3267
|
+
expect(result).toBe(embed2);
|
|
3268
|
+
// The original iframe should still have lb1
|
|
3269
|
+
const iframe = getIFrameEl();
|
|
3270
|
+
expect(iframe.src).toContain('lb1');
|
|
3271
|
+
});
|
|
3272
|
+
});
|
|
3273
|
+
describe('Destroy error handling', () => {
|
|
3274
|
+
beforeAll(() => {
|
|
3275
|
+
init({
|
|
3276
|
+
thoughtSpotHost: 'tshost',
|
|
3277
|
+
authType: AuthType.None,
|
|
3278
|
+
});
|
|
3279
|
+
});
|
|
3280
|
+
beforeEach(() => {
|
|
3281
|
+
document.body.innerHTML = getDocumentBody();
|
|
3282
|
+
});
|
|
3283
|
+
test('should handle error gracefully when destroy fails', async () => {
|
|
3284
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
3285
|
+
frameParams: { width: '100%', height: '100%' },
|
|
3286
|
+
});
|
|
3287
|
+
await appEmbed.render();
|
|
3288
|
+
const logSpy = jest.spyOn(logger, 'log').mockImplementation(() => { });
|
|
3289
|
+
jest.spyOn(Node.prototype, 'removeChild').mockImplementationOnce(() => {
|
|
3290
|
+
throw new Error('Remove failed');
|
|
3291
|
+
});
|
|
3292
|
+
expect(() => {
|
|
3293
|
+
appEmbed.destroy();
|
|
3294
|
+
}).not.toThrow();
|
|
3295
|
+
expect(logSpy).toHaveBeenCalledWith('Error destroying TS Embed', expect.any(Error));
|
|
3296
|
+
logSpy.mockRestore();
|
|
3297
|
+
});
|
|
3298
|
+
});
|
|
3299
|
+
describe('Fullscreen change handler behavior', () => {
|
|
3300
|
+
beforeAll(() => {
|
|
3301
|
+
init({
|
|
3302
|
+
thoughtSpotHost: 'tshost',
|
|
3303
|
+
authType: AuthType.None,
|
|
3304
|
+
disableFullscreenPresentation: false,
|
|
3305
|
+
});
|
|
3306
|
+
});
|
|
3307
|
+
beforeEach(() => {
|
|
3308
|
+
document.body.innerHTML = getDocumentBody();
|
|
3309
|
+
});
|
|
3310
|
+
test('should trigger ExitPresentMode when exiting fullscreen', async () => {
|
|
3311
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
3312
|
+
...defaultViewConfig,
|
|
3313
|
+
liveboardId: 'test-lb',
|
|
3314
|
+
});
|
|
3315
|
+
await liveboardEmbed.render();
|
|
3316
|
+
await executeAfterWait(() => {
|
|
3317
|
+
const iframe = getIFrameEl();
|
|
3318
|
+
expect(iframe).toBeTruthy();
|
|
3319
|
+
});
|
|
3320
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
3321
|
+
liveboardEmbed['setupFullscreenChangeHandler']();
|
|
3322
|
+
Object.defineProperty(document, 'fullscreenElement', {
|
|
3323
|
+
value: null,
|
|
3324
|
+
writable: true,
|
|
3325
|
+
configurable: true,
|
|
3326
|
+
});
|
|
3327
|
+
const event = new Event('fullscreenchange');
|
|
3328
|
+
document.dispatchEvent(event);
|
|
3329
|
+
await executeAfterWait(() => {
|
|
3330
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.ExitPresentMode, expect.any(String), expect.any(Object));
|
|
3331
|
+
});
|
|
3332
|
+
});
|
|
3333
|
+
test('should not trigger ExitPresentMode when entering fullscreen', async () => {
|
|
3334
|
+
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
3335
|
+
...defaultViewConfig,
|
|
3336
|
+
liveboardId: 'test-lb-fullscreen',
|
|
3337
|
+
});
|
|
3338
|
+
await liveboardEmbed.render();
|
|
3339
|
+
await executeAfterWait(() => {
|
|
3340
|
+
const iframe = getIFrameEl();
|
|
3341
|
+
expect(iframe).toBeTruthy();
|
|
3342
|
+
});
|
|
3343
|
+
mockProcessTrigger.mockClear();
|
|
3344
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
3345
|
+
liveboardEmbed['setupFullscreenChangeHandler']();
|
|
3346
|
+
Object.defineProperty(document, 'fullscreenElement', {
|
|
3347
|
+
value: getIFrameEl(),
|
|
3348
|
+
writable: true,
|
|
3349
|
+
configurable: true,
|
|
3350
|
+
});
|
|
3351
|
+
const event = new Event('fullscreenchange');
|
|
3352
|
+
document.dispatchEvent(event);
|
|
3353
|
+
await executeAfterWait(() => {
|
|
3354
|
+
expect(mockProcessTrigger).not.toHaveBeenCalledWith(expect.any(Object), HostEvent.ExitPresentMode, expect.any(String), expect.any(Object));
|
|
3355
|
+
});
|
|
3356
|
+
});
|
|
3357
|
+
});
|
|
3358
|
+
describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
3359
|
+
beforeAll(() => {
|
|
3360
|
+
init({
|
|
3361
|
+
thoughtSpotHost: 'tshost',
|
|
3362
|
+
authType: AuthType.None,
|
|
3363
|
+
});
|
|
3364
|
+
});
|
|
3365
|
+
afterEach(() => {
|
|
3366
|
+
const rootEle = document.getElementById('myRoot');
|
|
3367
|
+
rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
|
|
3368
|
+
});
|
|
3369
|
+
test('should trigger UpdateEmbedParams when showPreRender connects to existing prerendered component', async () => {
|
|
3370
|
+
createRootEleForEmbed();
|
|
3371
|
+
mockMessageChannel();
|
|
3372
|
+
window.ResizeObserver = window.ResizeObserver
|
|
3373
|
+
|| jest.fn().mockImplementation(() => ({
|
|
3374
|
+
disconnect: jest.fn(),
|
|
3375
|
+
observe: jest.fn(),
|
|
3376
|
+
unobserve: jest.fn(),
|
|
3377
|
+
}));
|
|
3378
|
+
const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
3379
|
+
preRenderId: 'update-params-test',
|
|
3380
|
+
liveboardId: 'original-lb',
|
|
3381
|
+
});
|
|
3382
|
+
await embed1.preRender();
|
|
3383
|
+
await waitFor(() => !!getIFrameEl());
|
|
3384
|
+
embed1.isEmbedContainerLoaded = true;
|
|
3385
|
+
mockProcessTrigger.mockClear();
|
|
3386
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
3387
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
3388
|
+
preRenderId: 'update-params-test',
|
|
3389
|
+
liveboardId: 'updated-lb',
|
|
3390
|
+
});
|
|
3391
|
+
embed2.showPreRender();
|
|
3392
|
+
await executeAfterWait(() => {
|
|
3393
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
3394
|
+
liveboardId: 'updated-lb',
|
|
3395
|
+
}));
|
|
3396
|
+
});
|
|
3397
|
+
});
|
|
3398
|
+
});
|
|
3135
3399
|
//# sourceMappingURL=ts-embed.spec.js.map
|