@thoughtspot/visual-embed-sdk
Version:
ThoughtSpot Embed SDK
159 lines • 6.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.mockSessionInfo = exports.getHashQueryParams = exports.createRootEleForEmbed = exports.expectUrlMatch = exports.expectUrlToHaveParamsWithValues = exports.expectUrlMatchesWithParams = exports.mockMessageChannel = exports.messageChannelMock = exports.fixedEncodeURI = exports.EVENT_WAIT_TIME = exports.executeAfterWait = exports.postMessageToParent = exports.waitFor = exports.getIFrameSrc = exports.getAllIframeEl = exports.getIFrameEl = exports.getRootEl2 = exports.getRootEl = exports.getDocumentBody = exports.defaultParamsForPinboardEmbed = exports.defaultParams = exports.defaultParamsWithoutHiddenActions = void 0;
const lodash_1 = require("lodash");
const package_json_1 = require("../../package.json");
const types_1 = require("../types");
/**
Initialises fetch to the global object
*/
if (!global.fetch.mockResponse) {
console.log('mocking fetch');
global.fetch = jest.fn(() => Promise.resolve({
json: () => Promise.resolve({ mixpanelAccessToken: '' }),
}));
}
exports.defaultParamsWithoutHiddenActions = `hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${package_json_1.version}&authType=${types_1.AuthType.None}&blockNonEmbedFullAppAccess=true`;
exports.defaultParams = `&${exports.defaultParamsWithoutHiddenActions}&hideAction=[%22${types_1.Action.ReportError}%22]`;
exports.defaultParamsForPinboardEmbed = `hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${package_json_1.version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${types_1.Action.ReportError}%22]`;
const getDocumentBody = () => '<div id="embed"></div><div id="embed-2"></div>';
exports.getDocumentBody = getDocumentBody;
const getRootEl = () => document.getElementById('embed');
exports.getRootEl = getRootEl;
const getRootEl2 = () => document.getElementById('embed-2');
exports.getRootEl2 = getRootEl2;
const getIFrameEl = (container = document) => container.querySelector('iframe');
exports.getIFrameEl = getIFrameEl;
const getAllIframeEl = () => document.querySelectorAll('iframe');
exports.getAllIframeEl = getAllIframeEl;
const getIFrameSrc = (container = document) => (0, exports.getIFrameEl)(container).src;
exports.getIFrameSrc = getIFrameSrc;
const waitFor = (fn) => new Promise((resolve) => {
const interval = setInterval(() => {
const value = fn();
if (value) {
clearInterval(interval);
resolve();
}
}, 100);
});
exports.waitFor = waitFor;
/**
* jsdom does not set event source, therefore we do it
* programmatically and use dispatchEvent instead of the
* postMessage API
* Reference: https://github.com/jsdom/jsdom/issues/2745
* @param window
* @param data
* @param port
*/
const postMessageToParent = (window, data, port) => {
const message = new MessageEvent('message', {
data,
source: window,
ports: [port],
});
window.parent.dispatchEvent(message);
};
exports.postMessageToParent = postMessageToParent;
/**
* Execute a given function after a certain time has elapsed
* @param fn The function to be executed after the wait period
* @param waitTime The wait period in milliseconds
*/
const executeAfterWait = (fn, waitTime = 0) => new Promise((resolve, reject) => {
setTimeout(() => {
const value = fn();
resolve(value);
}, waitTime);
});
exports.executeAfterWait = executeAfterWait;
/**
* Time (in milliseconds) to wait for async events to be triggered
*/
exports.EVENT_WAIT_TIME = 1000;
/**
*
* @param str
*/
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
exports.fixedEncodeURI = fixedEncodeURI;
/**
* MessageChannel is available in Node > 15.0.0. Since the current node
* environment's used for github actions is not above 14, we are mocking this
* for the current unit tests.
*/
exports.messageChannelMock = {
port1: {},
port2: {},
};
const mockMessageChannel = () => {
exports.messageChannelMock.port1.close = jest.fn();
exports.messageChannelMock.port2.onmessage = jest.fn();
window.MessageChannel = function MessageChannelMock() {
return exports.messageChannelMock;
};
};
exports.mockMessageChannel = mockMessageChannel;
const expectUrlMatchesWithParams = (source, target) => {
const sourceUrl = new URL(source);
const targetUrl = new URL(target);
expect(sourceUrl.origin).toBe(targetUrl.origin);
expect(sourceUrl.pathname).toBe(targetUrl.pathname);
const sourceParamsObj = Object.fromEntries(sourceUrl.searchParams);
const targetParamsObj = Object.fromEntries(targetUrl.searchParams);
expect(sourceParamsObj).toMatchObject(targetParamsObj);
const sourceHashParams = (0, exports.getHashQueryParams)(sourceUrl.hash);
const targetHashParams = (0, exports.getHashQueryParams)(targetUrl.hash);
expect(sourceHashParams).toMatchObject(targetHashParams);
};
exports.expectUrlMatchesWithParams = expectUrlMatchesWithParams;
const expectUrlToHaveParamsWithValues = (url, paramsWithValues) => {
const urlObj = new URL(url);
const urlParams = Object.fromEntries(urlObj.searchParams);
const sourceHashParams = (0, exports.getHashQueryParams)(urlObj.hash);
const sourceParams = {
...urlParams, ...sourceHashParams,
};
Object.entries(paramsWithValues).forEach(([key, value]) => {
expect((0, lodash_1.has)(sourceParams, key)).toBeTruthy();
expect(`${sourceParams[key]}`).toBe(`${value}`);
});
};
exports.expectUrlToHaveParamsWithValues = expectUrlToHaveParamsWithValues;
const expectUrlMatch = (source, target) => {
(0, exports.expectUrlMatchesWithParams)(source, target);
const sourceUrl = new URL(source);
const targetUrl = new URL(target);
expect(sourceUrl.hash).toBe(targetUrl.hash);
};
exports.expectUrlMatch = expectUrlMatch;
const createRootEleForEmbed = () => {
const rootEle = document.createElement('div');
rootEle.id = 'myRoot';
const tsEmbedDiv = document.createElement('div');
tsEmbedDiv.id = 'tsEmbedDiv';
rootEle.appendChild(tsEmbedDiv);
document.body.appendChild(rootEle);
};
exports.createRootEleForEmbed = createRootEleForEmbed;
const getHashQueryParams = (hash) => {
const params = hash.split('?')[1];
const hashParams = new URLSearchParams(params);
return Object.fromEntries(hashParams);
};
exports.getHashQueryParams = getHashQueryParams;
exports.mockSessionInfo = {
userGUID: '1234',
mixpanelToken: 'abc123',
isPublicUser: false,
sessionId: '6588e7d9-710c-453e-a7b4-535fb3a8cbb2',
genNo: 3,
acSession: {
sessionId: 'cb202c48-b14b-4466-8a70-899ea666d46q',
genNo: 5,
},
};
//# sourceMappingURL=test-utils.js.map