blob: 403b618e3d5e5b80bc62f42957a8dfad00cfb863 [file] [log] [blame]
import { defineSharedModule, defineSharedModules, reset } from '../../src';
describe('shared modules', () => {
afterEach(() => {
reset();
});
it('assigns to window', async () => {
const fakeModule = { foo: 'bar' };
const fetchModule = jest.fn().mockResolvedValue(fakeModule);
await defineSharedModule('test-module', fetchModule);
expect((window as any)['__superset__/test-module']).toStrictEqual(fakeModule);
});
it('resolves to the same reference every time', async () => {
const fakeModule = { foo: 'bar' };
const fetchModule = jest.fn().mockResolvedValue(fakeModule);
const result1 = await defineSharedModule('test-module', fetchModule);
const result2 = await defineSharedModule('test-module', fetchModule);
expect(result1).toStrictEqual(fakeModule);
expect(result2).toStrictEqual(fakeModule);
});
it('does not redefine unnecessarily', async () => {
const fakeModule = { foo: 'bar' };
const fetchModule = jest.fn().mockResolvedValue(fakeModule);
const duplicateFetchModule = jest.fn().mockResolvedValue(fakeModule);
const result1 = await defineSharedModule('test-module', fetchModule);
const result2 = await defineSharedModule('test-module', duplicateFetchModule);
expect(result1).toStrictEqual(fakeModule);
expect(result2).toStrictEqual(fakeModule);
expect(duplicateFetchModule).not.toHaveBeenCalled();
});
it('deduplicates in-progress definitions', async () => {
const fakeModule = { foo: 'bar' };
// get a promise that actually takes a moment;
const fetchModule = jest
.fn()
.mockImplementation(() => Promise.resolve(setImmediate).then(() => fakeModule));
const promise1 = defineSharedModule('test-module', fetchModule);
const promise2 = defineSharedModule('test-module', fetchModule);
const [result1, result2] = await Promise.all([promise1, promise2]);
expect(fetchModule).toHaveBeenCalledTimes(1);
expect(result1).toStrictEqual(result2);
});
it('shares a map of modules', async () => {
const foo = { foo: 'bar' };
const fizz = { fizz: 'buzz' };
await defineSharedModules({
'module-foo': async () => foo,
'module-fizz': async () => fizz,
});
expect((window as any)['__superset__/module-foo']).toEqual(foo);
expect((window as any)['__superset__/module-fizz']).toEqual(fizz);
});
});