whisper-money/resources/js/lib/chunk-load-recovery.test.ts

73 lines
2.1 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import {
isChunkLoadError,
reloadOnChunkLoadError,
} from './chunk-load-recovery';
describe('isChunkLoadError', () => {
it('detects Vite dynamic import fetch failures', () => {
expect(
isChunkLoadError(
new TypeError(
'Failed to fetch dynamically imported module: https://whisper.money/build/assets/accounts-BO3xxENF.js',
),
),
).toBe(true);
});
it('detects Vite CSS preload failures', () => {
expect(
isChunkLoadError(
new Error(
'Unable to preload CSS for /build/assets/app-BpqbLMXP.css',
),
),
).toBe(true);
});
it('ignores unrelated errors', () => {
expect(isChunkLoadError(new Error('Validation failed'))).toBe(false);
});
});
describe('reloadOnChunkLoadError', () => {
it('reloads once per asset signature', () => {
const reload = vi.fn();
const storage = window.sessionStorage;
storage.clear();
const reason = new TypeError(
'Failed to fetch dynamically imported module: https://whisper.money/build/assets/accounts-BO3xxENF.js',
);
expect(
reloadOnChunkLoadError(reason, {
assetSignature: 'app-old.js',
reload,
storage,
}),
).toBe(true);
expect(
reloadOnChunkLoadError(reason, {
assetSignature: 'app-old.js',
reload,
storage,
}),
).toBe(false);
expect(reload).toHaveBeenCalledOnce();
});
it('does not reload for unrelated errors', () => {
const reload = vi.fn();
expect(
reloadOnChunkLoadError(new Error('Validation failed'), {
assetSignature: 'app-old.js',
reload,
storage: window.sessionStorage,
}),
).toBe(false);
expect(reload).not.toHaveBeenCalled();
});
});