// @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.tsx"; import { FeatureBoundary } from "../../src/presentation/boundaries/render-error-boundary.tsx"; 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( , ); 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( , ); expect(screen.getByRole("alert")).toHaveTextContent( "화면을 표시하지 못했습니다.", ); expect(recover).not.toHaveBeenCalled(); }); });