Files
sentinel/static/app/utils/retryableImport.spec.tsx
2024-02-15 17:01:50 +00:00

84 lines
2.1 KiB
TypeScript

import retryableImport from 'sentry/utils/retryableImport';
describe('retryableImport', function () {
it('can dynamically import successfully on first try', async function () {
const importMock = jest.fn();
importMock.mockReturnValue(
new Promise(resolve =>
resolve({
default: {
foo: 'bar',
},
})
)
);
const result = await retryableImport(importMock);
expect(result).toEqual({
default: {
foo: 'bar',
},
});
expect(importMock).toHaveBeenCalledTimes(1);
});
it('does not retry if error was not a webpack chunk loading error', async function () {
const importMock = jest.fn();
importMock.mockReturnValueOnce(
new Promise((_resolve, reject) => reject(new Error('Another error happened')))
);
try {
await retryableImport(importMock);
} catch (err) {
// do nothing
}
expect(importMock).toHaveBeenCalledTimes(1);
});
it('can fail 2 dynamic imports and succeed on 3rd try', async function () {
const importMock = jest.fn();
importMock
.mockReturnValueOnce(
new Promise((_resolve, reject) => reject(new Error('Loading chunk 123 failed')))
)
.mockReturnValueOnce(
new Promise((_resolve, reject) => reject(new Error('Loading chunk 123 failed')))
)
.mockReturnValue(
new Promise(resolve =>
resolve({
default: {
foo: 'bar',
},
})
)
);
const result = await retryableImport(importMock);
expect(result).toEqual({
default: {
foo: 'bar',
},
});
expect(importMock).toHaveBeenCalledTimes(3);
});
it('only retries 3 times', async function () {
const importMock = jest.fn(
() =>
new Promise<{default: unknown}>((_resolve, reject) =>
reject(new Error('Loading chunk 123 failed'))
)
);
await expect(retryableImport(importMock)).rejects.toThrow('Loading chunk 123 failed');
expect(importMock).toHaveBeenCalledTimes(3);
});
});