O botão das ofertas rola até o contato com o tipo marcado e não quebra mais as âncoras; ofertas com o que você recebe e primeiro passo, logo depois da vitrine; bloco de IA fora da home; cartão largo da SEV no hero do celular; separador da faixa de clientes só entre itens; favicon de 13 para 1,8 KB; pré-carregamento só no hover e nunca de /#... fora da home; X do menu e cabeçalho opaco; WhatsApp com "o case"; /ia com 3 passos e modelo de relatório ilustrativo; Sobre alinhado ao currículo; CSP Report-Only com os domínios do Ads.
25 lines
1.0 KiB
TypeScript
25 lines
1.0 KiB
TypeScript
import nextConfig from "../next.config";
|
|
|
|
describe("next.config", () => {
|
|
it("does not announce the framework in the X-Powered-By header", () => {
|
|
expect(nextConfig.poweredByHeader).toBe(false);
|
|
});
|
|
|
|
it("serves AVIF before WebP, because the browser takes the first format of the list it accepts", () => {
|
|
expect(nextConfig.images?.formats).toEqual(["image/avif", "image/webp"]);
|
|
});
|
|
|
|
it("leaves the image cache time to the framework default instead of revalidating every minute", () => {
|
|
expect(nextConfig.images).not.toHaveProperty("minimumCacheTTL");
|
|
});
|
|
|
|
it("keeps the CSP in Report-Only (Google Ads is allowed in it now, but the owner activates it later), never enforcing it by accident", async () => {
|
|
const rules = (await nextConfig.headers?.()) ?? [];
|
|
const site = rules.find(({ source }) => source === "/(.*)");
|
|
const names = site?.headers.map(({ key }) => key) ?? [];
|
|
|
|
expect(names).toContain("Content-Security-Policy-Report-Only");
|
|
expect(names).not.toContain("Content-Security-Policy");
|
|
});
|
|
});
|