69 lines
2.1 KiB
TypeScript
69 lines
2.1 KiB
TypeScript
// @vitest-environment jsdom
|
|
|
|
import { render, screen } from "@testing-library/react";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
|
|
import {
|
|
ChunkRecoveryBoundary,
|
|
isChunkLoadFailure,
|
|
} from "../../src/presentation/boundaries/chunk-recovery-boundary.js";
|
|
import { FeatureBoundary } from "../../src/presentation/boundaries/render-error-boundary.jsx";
|
|
|
|
function ChunkDefect(): never {
|
|
throw new TypeError("Failed to fetch dynamically imported module");
|
|
}
|
|
|
|
function RenderDefect(): never {
|
|
throw new Error("ordinary render defect");
|
|
}
|
|
|
|
describe("chunk recovery boundary classification", () => {
|
|
it("recognizes lazy module failures without classifying ordinary render errors", () => {
|
|
expect(
|
|
isChunkLoadFailure(
|
|
new TypeError("Failed to fetch dynamically imported module"),
|
|
),
|
|
).toBe(true);
|
|
expect(isChunkLoadFailure(new Error("ordinary render defect"))).toBe(false);
|
|
});
|
|
|
|
it("runs the recovery input only for a lazy chunk rejection", async () => {
|
|
const recover = vi.fn(async () => ({
|
|
action: "support" as const,
|
|
reason: "reload-already-attempted",
|
|
}));
|
|
render(
|
|
<ChunkRecoveryBoundary chunkId="route-home" recover={recover}>
|
|
<ChunkDefect />
|
|
</ChunkRecoveryBoundary>,
|
|
);
|
|
|
|
expect(
|
|
await screen.findByRole("heading", {
|
|
name: "화면 자산을 복구하지 못했습니다.",
|
|
}),
|
|
).toBeVisible();
|
|
expect(recover).toHaveBeenCalledOnce();
|
|
expect(recover).toHaveBeenCalledWith({
|
|
chunkId: "route-home",
|
|
failureKind: "CHUNK_LOAD_FAILURE",
|
|
});
|
|
});
|
|
|
|
it("rethrows an ordinary component defect to the local render boundary", () => {
|
|
const recover = vi.fn();
|
|
render(
|
|
<FeatureBoundary routeId="APP_HOME" buildId="build-a">
|
|
<ChunkRecoveryBoundary chunkId="route-home" recover={recover}>
|
|
<RenderDefect />
|
|
</ChunkRecoveryBoundary>
|
|
</FeatureBoundary>,
|
|
);
|
|
|
|
expect(screen.getByRole("alert")).toHaveTextContent(
|
|
"화면을 표시하지 못했습니다.",
|
|
);
|
|
expect(recover).not.toHaveBeenCalled();
|
|
});
|
|
});
|