Etapa 1 inteira (logica com 100% de cobertura, cena 3D, toque, sons, bancada de desempenho, e2e) e a base da etapa 2 (mapa novo no Tiled, texturas, imagens dos itens, sons conferidos, golpe recortado e medido). Pagina /jogo fora do menu e do sitemap ate a medicao no celular.
77 lines
2.9 KiB
TypeScript
77 lines
2.9 KiB
TypeScript
import {
|
|
caseStudies,
|
|
pageUpdatedAt,
|
|
servicePages,
|
|
siteUrl,
|
|
} from "@/lib/site-content";
|
|
import sitemap from "./sitemap";
|
|
|
|
/** O mapa do site lista a home, as páginas fixas, cada serviço e cada case, sem repetir endereço. */
|
|
describe("sitemap", () => {
|
|
const urls = sitemap().map((entry) => entry.url);
|
|
|
|
it("lists the fixed pages, every service and every case, once each", () => {
|
|
expect(urls).toEqual(
|
|
expect.arrayContaining([
|
|
siteUrl,
|
|
`${siteUrl}/curriculo`,
|
|
`${siteUrl}/privacidade`,
|
|
`${siteUrl}/servicos`,
|
|
`${siteUrl}/cases`,
|
|
`${siteUrl}/ia`,
|
|
...servicePages.map(({ slug }) => `${siteUrl}/servicos/${slug}`),
|
|
...caseStudies.map(({ id }) => `${siteUrl}/cases/${id}`),
|
|
]),
|
|
);
|
|
expect(new Set(urls).size).toBe(urls.length);
|
|
expect(urls).toHaveLength(6 + servicePages.length + caseStudies.length);
|
|
});
|
|
|
|
it("never lists the 404 page", () => {
|
|
expect(urls.some((url) => /not-found|nada/.test(url))).toBe(false);
|
|
});
|
|
|
|
it("never lists the game (/jogo) or its benchmark (/jogo/bancada)", () => {
|
|
expect(urls.some((url) => url.startsWith(`${siteUrl}/jogo`))).toBe(false);
|
|
});
|
|
|
|
it("gives every route the modification date of its own content, equal on every build", () => {
|
|
const day = (value: Date | string | undefined) =>
|
|
new Date(value ?? "").toISOString().slice(0, 10);
|
|
const byUrl = new Map(
|
|
sitemap().map((entry) => [entry.url, day(entry.lastModified)]),
|
|
);
|
|
|
|
expect(byUrl.get(siteUrl)).toBe(pageUpdatedAt.home);
|
|
expect(byUrl.get(`${siteUrl}/curriculo`)).toBe(pageUpdatedAt.curriculo);
|
|
expect(byUrl.get(`${siteUrl}/privacidade`)).toBe(pageUpdatedAt.privacidade);
|
|
expect(byUrl.get(`${siteUrl}/servicos`)).toBe(pageUpdatedAt.servicos);
|
|
expect(byUrl.get(`${siteUrl}/cases`)).toBe(pageUpdatedAt.cases);
|
|
expect(byUrl.get(`${siteUrl}/ia`)).toBe(pageUpdatedAt.ia);
|
|
for (const { slug, updatedAt } of servicePages) {
|
|
expect(byUrl.get(`${siteUrl}/servicos/${slug}`)).toBe(updatedAt);
|
|
}
|
|
for (const { id, updatedAt } of caseStudies) {
|
|
expect(byUrl.get(`${siteUrl}/cases/${id}`)).toBe(updatedAt);
|
|
}
|
|
|
|
// não é uma data única copiada para todas as rotas, e não vem do relógio: duas chamadas dão o mesmo resultado
|
|
expect(new Set(byUrl.values()).size).toBeGreaterThan(1);
|
|
expect(sitemap()).toEqual(sitemap());
|
|
});
|
|
|
|
it("keeps every content date a real calendar day (AAAA-MM-DD) that is not in the future", () => {
|
|
const days = [
|
|
...Object.values(pageUpdatedAt),
|
|
...servicePages.map(({ updatedAt }) => updatedAt),
|
|
...caseStudies.map(({ updatedAt }) => updatedAt),
|
|
];
|
|
for (const value of days) {
|
|
expect(value).toMatch(/^\d{4}-\d{2}-\d{2}$/);
|
|
const parsed = new Date(`${value}T00:00:00Z`);
|
|
expect(parsed.toISOString().slice(0, 10)).toBe(value);
|
|
expect(parsed.getTime()).toBeLessThanOrEqual(Date.now());
|
|
}
|
|
});
|
|
});
|