feat(servicos): ofertas no topo de /servicos, capa por assunto e diagramas
/servicos abre com as 3 ofertas e depois outros serviços; H1 de criação de sites e de engenharia com o nome da oferta; capa de cada serviço pelo assunto (SEV fora do próprio case cai de ~11 para 2 imagens); diagrama de fluxo em SVG nos serviços sem case; cases com o que o cliente passou a poder fazer e contato logo depois de Como ficou; FAQ num componente só; lastmod por rota; ProfessionalService com areaServed.
This commit is contained in:
1 parent
e63f3c2ebd
commit
fc44a69fb3
41 files changed
+2486
-550
No files matched your search
@@ -31,7 +31,9 @@ function withDesktopCapture() {
|
||||
const sev = getCase("sev-modaintima"); // cliente, com site no ar
|
||||
const asServicos = getCase("as-servicos"); // cliente, sem site público
|
||||
const twins = getCase("twins-lab"); // laboratório, sem site público
|
||||
/** Título com algum case de cliente; sem cliente (só experiência ou projeto próprio), é "Como eu trabalho nisso". */
|
||||
const TITLE = "Onde já apliquei isso";
|
||||
const TITLE_WITHOUT_CLIENT = "Como eu trabalho nisso";
|
||||
const NOTE = "Texto de experiência de teste.";
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -57,11 +59,12 @@ describe("ServiceRelatedCases", () => {
|
||||
);
|
||||
|
||||
expect(
|
||||
screen.getByRole("heading", { level: 2, name: TITLE }),
|
||||
screen.getByRole("heading", { level: 2, name: TITLE_WITHOUT_CLIENT }),
|
||||
).toBeVisible();
|
||||
expect(screen.queryByRole("heading", { name: TITLE })).toBeNull();
|
||||
expect(screen.getByText(NOTE)).toBeVisible();
|
||||
expect(container.querySelectorAll("article")).toHaveLength(0);
|
||||
expect(screen.queryByRole("link", { name: /^Ler case:/ })).toBeNull();
|
||||
expect(screen.queryByRole("link", { name: /^Ver case/ })).toBeNull();
|
||||
});
|
||||
|
||||
it("path: cases and no experience note (main path) -> one card per case, no 'Na prática' paragraph", () => {
|
||||
@@ -81,14 +84,15 @@ describe("ServiceRelatedCases", () => {
|
||||
if (!card) throw new Error("Missing case card");
|
||||
expect(within(card).getByText(sev.headline)).toBeVisible();
|
||||
// case de cliente: o kicker é só o nome
|
||||
expect(within(card).getByText(sev.title)).toBeVisible();
|
||||
const kicker = card.querySelector(".ds-kicker");
|
||||
expect(kicker).toHaveTextContent(new RegExp(`^${sev.title}$`));
|
||||
expect(within(card).queryByText(/Projeto próprio/)).toBeNull();
|
||||
expect(within(card).getByText("Frase de relação do SEV.")).toBeVisible();
|
||||
expect(
|
||||
within(card).getByRole("link", { name: `Ler case: ${sev.title}` }),
|
||||
within(card).getByRole("link", { name: `Ver case ${sev.title}` }),
|
||||
).toHaveAttribute("href", `/cases/${sev.id}`);
|
||||
expect(
|
||||
within(card).getByRole("link", { name: `Abrir o site: ${sev.title}` }),
|
||||
within(card).getByRole("link", { name: `Abrir o site ${sev.title}` }),
|
||||
).toHaveAttribute("href", sev.demoUrl);
|
||||
});
|
||||
|
||||
@@ -107,7 +111,7 @@ describe("ServiceRelatedCases", () => {
|
||||
expect(note.querySelector("a")).toBeNull();
|
||||
expect(
|
||||
note.compareDocumentPosition(
|
||||
screen.getByRole("link", { name: `Ler case: ${sev.title}` }),
|
||||
screen.getByRole("link", { name: `Ver case ${sev.title}` }),
|
||||
) & Node.DOCUMENT_POSITION_FOLLOWING,
|
||||
).toBeTruthy();
|
||||
});
|
||||
@@ -138,7 +142,7 @@ describe("ServiceRelatedCases", () => {
|
||||
expect(container.querySelector(".ds-bframe")).toBeNull();
|
||||
expect(container.querySelector("img")).toBeNull();
|
||||
expect(
|
||||
screen.getByRole("link", { name: `Ler case: ${sev.title}` }),
|
||||
screen.getByRole("link", { name: `Ver case ${sev.title}` }),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -152,6 +156,42 @@ describe("ServiceRelatedCases", () => {
|
||||
);
|
||||
|
||||
expect(screen.getByText(`${twins.title} · Projeto próprio`)).toBeVisible();
|
||||
// só projeto próprio, sem cliente: o título não promete trabalho aplicado para alguém
|
||||
expect(
|
||||
screen.getByRole("heading", { level: 2, name: TITLE_WITHOUT_CLIENT }),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
it("path: case whose cover already opens the page -> it gets no card at all (the cover caption cites it), the others keep theirs", () => {
|
||||
withDesktopCapture();
|
||||
const lavacao = getCase("lavacao-047");
|
||||
const { container } = render(
|
||||
<ServiceRelatedCases
|
||||
cases={[lavacao, sev]}
|
||||
relevance={{}}
|
||||
heroCaseId={lavacao.id}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(container.querySelectorAll("article")).toHaveLength(1);
|
||||
expect(
|
||||
container.querySelector(`a[href="/cases/${lavacao.id}"]`),
|
||||
).toBeNull();
|
||||
expect(container.textContent).not.toContain(lavacao.title);
|
||||
expect(
|
||||
container.querySelector(`a[aria-hidden="true"][href="/cases/${sev.id}"]`),
|
||||
).not.toBeNull();
|
||||
expect(
|
||||
screen.getByRole("link", { name: `Ver case ${sev.title}` }),
|
||||
).toBeVisible();
|
||||
});
|
||||
|
||||
it("path: the cover case is the only one -> no cases to list and no experience note -> renders nothing", () => {
|
||||
const { container } = render(
|
||||
<ServiceRelatedCases cases={[sev]} relevance={{}} heroCaseId={sev.id} />,
|
||||
);
|
||||
|
||||
expect(container).toBeEmptyDOMElement();
|
||||
});
|
||||
|
||||
it("path: no relevance sentence for the case -> falls back to the case summary", () => {
|
||||
@@ -172,7 +212,7 @@ describe("ServiceRelatedCases", () => {
|
||||
);
|
||||
|
||||
expect(
|
||||
screen.getByRole("link", { name: `Ler case: ${asServicos.title}` }),
|
||||
screen.getByRole("link", { name: `Ver case ${asServicos.title}` }),
|
||||
).toBeVisible();
|
||||
expect(screen.queryByRole("link", { name: /^Abrir o site/ })).toBeNull();
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user