import { type FC, useContext } from "react"; import { describe, expect, it, vi } from "vitest"; import { render, renderHook, screen, waitFor } from "~test/react-render.js"; import { DOODLES_CONTRACT } from "~test/test-contracts.js"; import { NFTDescription } from "./description.js"; import { NFTMedia } from "./media.js"; import { NFTName } from "./name.js"; import { NFTProvider, NFTProviderContext, useNFTContext } from "./provider.js"; describe.runIf(process.env.TW_SECRET_KEY)("NFTProvider", () => { it("should render children correctly", () => { render(
Child Component
, ); expect(screen.getByText("Child Component")).toBeInTheDocument(); }); it("should provide context values to children", () => { function NFTConsumer() { const context = useContext(NFTProviderContext); if (!context) { return
No context
; } return (
Contract: {String(context.contract)}, Token ID:{" "} {context.tokenId.toString()}
); } render( , ); expect(screen.getByText(/Contract:/)).toBeInTheDocument(); expect(screen.getByText(/Token ID: 0/)).toBeInTheDocument(); }); it("should render the NFT image", () => { render( , ); waitFor(() => expect(screen.getByRole("img")).toBeInTheDocument()); }); it("should render the NFT name", () => { render( , ); waitFor(() => expect(screen.getByText("Doodle #1")).toBeInTheDocument()); }); it("should render the NFT description", () => { render( , ); waitFor(() => expect( screen.getByText( "A community-driven collectibles project featuring art by Burnt Toast", ), ).toBeInTheDocument(), ); }); it("useNFTContext should return the context value when used within NFTProvider", () => { const wrapper: FC = ({ children }: React.PropsWithChildren) => ( {children} ); const { result } = renderHook(() => useNFTContext(), { wrapper }); expect(result.current.contract).toStrictEqual(DOODLES_CONTRACT); expect(result.current.tokenId).toBe(0n); }); it("useNFTContext should throw an error when used outside of NFTProvider", () => { const consoleErrorSpy = vi .spyOn(console, "error") .mockImplementation(() => {}); expect(() => { renderHook(() => useNFTContext()); }).toThrow( "NFTProviderContext not found. Make sure you are using NFTMedia, NFTDescription, etc. inside a component", ); consoleErrorSpy.mockRestore(); }); });