diff --git a/src/hooks/__tests__/useCardPreview.test.ts b/src/hooks/__tests__/useCardPreview.test.ts index 328ef85f..03e0ace0 100644 --- a/src/hooks/__tests__/useCardPreview.test.ts +++ b/src/hooks/__tests__/useCardPreview.test.ts @@ -318,4 +318,53 @@ describe("useCardPreview", () => { expect(toBlob).not.toHaveBeenCalled(); expect(result.current.copyStatus).toBe("idle"); }); -}); + + it("handles fonts ready failure in generate effect", async () => { + // Suppress unhandled rejection warning by catching it + const fontsReadyPromise = Promise.reject(new Error("Fonts loading failed")); + fontsReadyPromise.catch(() => {}); + + Object.defineProperty(document, "fonts", { + value: { + ready: fontsReadyPromise, + }, + configurable: true, + }); + + const { result, rerender } = renderHook( + ({ isOpen }) => + useCardPreview(isOpen, mockCardRef, mockSummary, mockLayout, mockDisplayOptions), + { initialProps: { isOpen: false } } + ); + + rerender({ isOpen: true }); + + await waitFor(() => { + expect(result.current.isGenerating).toBe(false); + }); + + expect(result.current.previewUrl).toBeNull(); + expect(result.current.previewSize).toBeNull(); + }); + + it("handles generateImage failure due to target error", async () => { + // Override the mock block to return null or throw earlier if possible, but testing the catch block of generateImage + const error = new Error("Mock Error"); + vi.mocked(toPng).mockRejectedValueOnce(error); + + const { result, rerender } = renderHook( + ({ isOpen }) => + useCardPreview(isOpen, mockCardRef, mockSummary, mockLayout, mockDisplayOptions), + { initialProps: { isOpen: false } } + ); + + rerender({ isOpen: true }); + + await waitFor(() => { + expect(result.current.isGenerating).toBe(false); + }); + + expect(logger.error).toHaveBeenCalledWith("Failed to generate image", error); + expect(result.current.previewUrl).toBeNull(); + }); +}); \ No newline at end of file