H1 'Sites e sistemas que trazem pedidos pelo WhatsApp e tiram sua operação da planilha.'; HeroWork maior com a SEV; menu Cases, Serviços, Como trabalho, Sobre e IA com next/link e pré-carregamento no hover; menu do celular em tela cheia; WhatsApp flutuante e no rodapé com a mensagem da rota; rodapé em todas as páginas; FAQ da home; /ia como oferta de revisão de app feito com IA; formulário com noscript, validação do mailto e plano B do pop-up; cartões sem foco indevido; sem a fonte Monument.
109 lines
3.7 KiB
TypeScript
109 lines
3.7 KiB
TypeScript
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(<Contact />);
|
|
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(<Contact />);
|
|
|
|
await user.click(submit());
|
|
|
|
expect(window.open).not.toHaveBeenCalled();
|
|
expect(navigationAttempts(errors)).toBe(0);
|
|
expect(window.gtag).not.toHaveBeenCalled();
|
|
});
|
|
});
|