Hero: replace particle field with cobe globe (Capricorn view, multi-axis drag, reduced-motion safe), telemetry HUD with pointer parallax, particle text build effect, Space Grotesk display font. SEO: short titles with template, PT-BR accents, twitter cards on dynamic cases, escaped JSON-LD via lib/jsonld.ts, CSP report-only, 25 service FAQs answer-first. Design: fix TW4 layered reset killing spacing utilities, literal @theme tokens, mobile hero overflow, header overlap, empty case cards. Remove framer-motion (unified on motion/react), header version badge, phone number from hero CTA. Production build verified (24 static pages).
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { act, render, screen } from "@testing-library/react";
|
|
import type { ReactNode } from "react";
|
|
|
|
import PageIntro from "./PageIntro";
|
|
|
|
jest.mock("react-dom", () => ({
|
|
...jest.requireActual("react-dom"),
|
|
createPortal: (children: ReactNode) => children,
|
|
}));
|
|
|
|
jest.mock("motion/react", () => {
|
|
const React = require("react");
|
|
const motion = new Proxy(
|
|
{},
|
|
{
|
|
get:
|
|
(_target, tag: string) =>
|
|
({ children, ...props }: { children?: ReactNode }) =>
|
|
React.createElement(tag, props, children),
|
|
},
|
|
);
|
|
|
|
return {
|
|
AnimatePresence: ({ children }: { children: ReactNode }) => children,
|
|
motion,
|
|
useReducedMotion: () => false,
|
|
};
|
|
});
|
|
|
|
describe("PageIntro", () => {
|
|
it("renders the compact signal loading state without a fake percentage", () => {
|
|
render(<PageIntro />);
|
|
|
|
expect(screen.getByText(/EVANDRO.*DEV/)).toBeInTheDocument();
|
|
expect(screen.getByText("SINAL DE ENTRADA")).toBeInTheDocument();
|
|
expect(screen.getByText("Preparando o portfólio")).toBeInTheDocument();
|
|
expect(screen.queryByText("000")).not.toBeInTheDocument();
|
|
});
|
|
|
|
it("stays visible long enough to be perceived on a fast page load", () => {
|
|
jest.useFakeTimers();
|
|
render(<PageIntro />);
|
|
|
|
act(() => jest.advanceTimersByTime(900));
|
|
expect(screen.getByText("Preparando o portfólio")).toBeInTheDocument();
|
|
|
|
act(() => jest.runAllTimers());
|
|
expect(
|
|
screen.queryByText("Preparando o portfólio"),
|
|
).not.toBeInTheDocument();
|
|
jest.useRealTimers();
|
|
});
|
|
});
|