import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import Contact from "./Contact"; /** * Testes de caminhos-base de openWhatsApp, dentro de Contact: a aba abriu (o vínculo com a página é cortado), * o navegador bloqueou (devolve null ou undefined e a própria página vai para o WhatsApp) e os argumentos da chamada. * O envio com campos inválidos não abre nada. */ const NAVIGATION_ERROR = "Not implemented: navigation"; beforeEach(() => { jest.replaceProperty(process.env, "NODE_ENV", "production"); localStorage.setItem("evandro.analytics-consent.v1", "granted"); delete window["ga-disable-G-QTT9QT0T3S"]; window.gtag = jest.fn(); }); afterEach(() => { jest.restoreAllMocks(); localStorage.clear(); delete window.gtag; }); async function fillValidForm() { const user = userEvent.setup({ delay: null }); render(); await user.type(screen.getByRole("textbox", { name: /nome/i }), "Ana"); await user.type( screen.getByRole("textbox", { name: /contexto/i }), "Organizar pedidos", ); return user; } const submit = () => screen.getByRole("button", { name: /whatsapp/i }); function navigationAttempts(errors: jest.SpyInstance) { return errors.mock.calls.filter(([error]) => String(error).includes(NAVIGATION_ERROR), ).length; } describe("Contact: abertura do WhatsApp", () => { it("path: the tab opened -> the opener link is cut and this page stays where it is", async () => { const errors = jest.spyOn(console, "error").mockImplementation(() => {}); const opened = { opener: { stillLinked: true } }; jest .spyOn(window, "open") .mockImplementation(() => opened as unknown as Window); const user = await fillValidForm(); await user.click(submit()); expect(opened.opener).toBeNull(); expect(navigationAttempts(errors)).toBe(0); }); it("path: the call asks for a new tab with the wa.me link and no third argument (noopener would hide the result)", async () => { jest.spyOn(window, "open").mockImplementation(() => null); jest.spyOn(console, "error").mockImplementation(() => {}); const user = await fillValidForm(); await user.click(submit()); expect(window.open).toHaveBeenCalledTimes(1); const args = jest.mocked(window.open).mock.calls[0]; expect(args).toHaveLength(2); expect(String(args[0])).toMatch(/^https:\/\/wa\.me\/\d+\?text=/); expect(args[1]).toBe("_blank"); }); it("path: the browser blocks the tab with null -> the page itself goes to WhatsApp, once", async () => { const errors = jest.spyOn(console, "error").mockImplementation(() => {}); jest.spyOn(window, "open").mockImplementation(() => null); const user = await fillValidForm(); await user.click(submit()); expect(navigationAttempts(errors)).toBe(1); }); it("path: the browser answers undefined (some in-app browsers) -> the page itself goes to WhatsApp", async () => { const errors = jest.spyOn(console, "error").mockImplementation(() => {}); jest .spyOn(window, "open") .mockImplementation(() => undefined as unknown as Window); const user = await fillValidForm(); await user.click(submit()); expect(navigationAttempts(errors)).toBe(1); }); it("path: the form is invalid -> no tab, no navigation and no metric", async () => { const errors = jest.spyOn(console, "error").mockImplementation(() => {}); jest.spyOn(window, "open").mockImplementation(() => null); const user = userEvent.setup({ delay: null }); render(); await user.click(submit()); expect(window.open).not.toHaveBeenCalled(); expect(navigationAttempts(errors)).toBe(0); expect(window.gtag).not.toHaveBeenCalled(); }); });