import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import type { ReactNode } from "react"; import Hero from "./Hero"; jest.mock("next/dynamic", () => () => { const DynamicComponent = ({ variant }: { variant?: string }) => (
); DynamicComponent.displayName = "MockHeroScene"; return DynamicComponent; }); jest.mock("motion/react", () => { const React = require("react"); const motion = new Proxy( {}, { get: (_, tag: string) => { const Component = ({ children, initial: _initial, animate: _animate, whileHover: _whileHover, whileTap: _whileTap, variants: _variants, transition: _transition, ...props }: { children?: ReactNode } & Record) => React.createElement(tag, props, children); Component.displayName = `motion.${tag}`; return Component; }, }, ); return { AnimatePresence: ({ children }: { children: React.ReactNode }) => children, motion, useInView: () => true, useReducedMotion: () => false, useMotionValue: (initial: number) => ({ get: () => initial, set: jest.fn(), }), useSpring: ( value: { get: () => number; set: (v: number) => void }, _config: unknown, ) => value, useTransform: ( value: { get: () => number; set: (v: number) => void }, _input: number[], _output: number[], ) => value, }; }); jest.mock("cobe", () => ({ __esModule: true, default: jest.fn(() => ({ destroy: jest.fn(), })), })); function mockMatchMedia(matches = false) { Object.defineProperty(window, "matchMedia", { writable: true, value: jest.fn().mockImplementation((query) => ({ matches, media: query, onchange: null, addListener: jest.fn(), removeListener: jest.fn(), addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), })), }); } describe("Hero", () => { beforeEach(() => { mockMatchMedia(false); jest.spyOn(Math, "random").mockReturnValue(0); jest.spyOn(window, "open").mockImplementation(() => null); }); afterEach(() => { jest.restoreAllMocks(); }); it("renders the command center hero and primary actions", async () => { const { container } = render(); await waitFor(() => expect(container.querySelector("[data-hero-variant]")).toHaveAttribute( "data-hero-variant", "command-center", ), ); expect( screen.getByRole("heading", { level: 1, name: /engenharia de software para sistemas/i, }), ).toBeInTheDocument(); expect( screen.getByRole("button", { name: /conversar sobre uma oportunidade/i }), ).toBeInTheDocument(); expect( screen.getByRole("link", { name: /ver casos selecionados/i }), ).toHaveAttribute("href", "/cases"); expect(screen.getByRole("link", { name: /download cv/i })).toHaveAttribute( "href", "/Profile.pdf", ); expect(screen.queryByTestId("hero-scene")).not.toBeInTheDocument(); }); it("keeps social links, proof content and WhatsApp CTA", async () => { render(); await waitFor(() => expect( screen.getByText(/Disponível para novas oportunidades/i), ).toBeInTheDocument(), ); expect(screen.getByLabelText("GitHub")).toBeInTheDocument(); expect(screen.getByLabelText("LinkedIn")).toBeInTheDocument(); expect(screen.getByLabelText("Email")).toBeInTheDocument(); expect(screen.getByText(/Garuva, SC \/ Brasil/i)).toBeInTheDocument(); expect(screen.getByText(/Operação/i)).toBeInTheDocument(); expect(screen.getByText(/Clareza/i)).toBeInTheDocument(); expect(screen.getAllByText(/Resultado/i).length).toBeGreaterThan(0); fireEvent.click( screen.getByRole("button", { name: /conversar sobre uma oportunidade/i }), ); expect(window.open).toHaveBeenCalledWith( expect.stringContaining("https://wa.me/"), "_blank", "noopener,noreferrer", ); }); });