Files
portifolio-evandrodevbr/e2e/helpers.ts
T
Evandro Fonseca Junior 2cd4a98c55 test: e2e mais rígida e .gitattributes
Zero telas sem texto no computador e no celular; atalho de teclado em até 4 Tabs e linear em até 36 com o inventário das paradas; ciclo de foco do menu com a barra de cookies; oferta e cabeçalho levando ao formulário; foco vindo de outra página; separador da faixa de clientes; contagem de pôsteres da SEV. .gitattributes com eol=lf.
2026-10-14 19:14:49 -03:00

58 lines
2.1 KiB
TypeScript

import { readFileSync } from "node:fs";
import { join } from "node:path";
import type { APIRequestContext } from "@playwright/test";
/** Caminhos (`/`, `/cases/…`) de todas as rotas do /sitemap.xml, sem o domínio de produção. */
export async function sitemapPaths(request: APIRequestContext) {
const response = await request.get("/sitemap.xml");
if (response.status() !== 200)
throw new Error(`/sitemap.xml respondeu ${response.status()}`);
const xml = await response.text();
const paths = [...xml.matchAll(/<loc>\s*([^<\s]+)\s*<\/loc>/g)].map(
([, loc]) => {
const { pathname } = new URL(loc);
return pathname === "" ? "/" : pathname;
},
);
return [...new Set(paths)];
}
let devServer: Promise<boolean> | undefined;
/**
* O `BASE_URL` é um servidor de desenvolvimento (`next dev`)? O HTML dele traz o cliente de recarga a quente (HMR) e o
* React Refresh, que o build de produção não tem. Serve para as poucas coisas que só existem em um dos dois: a barra
* de cookies (só em produção) e avisos do React (só no desenvolvimento).
*/
export function isDevServer(request: APIRequestContext) {
devServer ??= request
.get("/")
.then((response) => response.text())
.then((html) => /hmr-client|react-refresh/.test(html))
.catch((error) => {
devServer = undefined;
throw error;
});
return devServer;
}
/** Nomes dos projetos de cliente, como a home os lista (public/portfolio-data.json, kind "cliente"). */
export function clientProjectNames() {
const data = JSON.parse(
readFileSync(
join(__dirname, "..", "public", "portfolio-data.json"),
"utf8",
),
) as { projects: Array<{ title: string; kind?: string }> };
return data.projects
.filter((project) => project.kind === "cliente")
.map((project) => project.title);
}
/** Texto do cabeçalho da seção de contato da home. */
export const CONTACT_HEADING =
"Vamos conversar sobre o que sua empresa precisa.";
export const DESKTOP = { width: 1440, height: 900 } as const;
export const PHONE = { width: 390, height: 844 } as const;