Files
jobtrackingapp/job-tracker-ui/src/page-layout.test.tsx
T

54 lines
3.2 KiB
TypeScript

import React from "react";
import "@testing-library/jest-dom";
import { fireEvent, render, screen, within } from "@testing-library/react";
import { Alert, Button, ThemeProvider } from "@mui/material";
import { getTheme } from "./theme";
import { PageHeader, PageSection } from "./layout/PageLayout";
import ViewStateNotice from "./components/ViewStateNotice";
import { I18nProvider } from "./i18n/I18nProvider";
test("[PRES-E08] page and nested section headings retain full names and independent actions", () => {
const save = jest.fn();
const manage = jest.fn();
render(<ThemeProvider theme={getTheme("light")}>
<PageHeader title="Innstillinger for oppfølginger og jobbpreferanser" description="Ærlig informasjon om dine valg."
actions={<Button onClick={save}>Lagre varslingsinnstillinger</Button>} />
<PageSection title="Tilkoblede kontoer" description="Administrer innbokstilkoblinger separat."
actions={<Button onClick={manage}>Administrer tilkoblede kontoer</Button>}>
<PageSection title="Kontotilgang" level="h3"><Button disabled>Utilgjengelig</Button></PageSection>
</PageSection>
</ThemeProvider>);
expect(screen.getAllByRole("heading", { level: 1 })).toHaveLength(1);
expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Innstillinger for oppfølginger og jobbpreferanser");
const section = screen.getByRole("region", { name: "Tilkoblede kontoer" });
expect(within(section).getByRole("heading", { level: 2 })).toHaveTextContent("Tilkoblede kontoer");
expect(within(section).getByRole("heading", { level: 3 })).toHaveTextContent("Kontotilgang");
expect(section).not.toHaveAttribute("tabindex");
fireEvent.click(screen.getByRole("button", { name: "Lagre varslingsinnstillinger" }));
fireEvent.click(within(section).getByRole("button", { name: "Administrer tilkoblede kontoer" }));
fireEvent.click(screen.getByRole("button", { name: "Utilgjengelig" }));
expect(save).toHaveBeenCalledTimes(1);
expect(manage).toHaveBeenCalledTimes(1);
});
test("[PRES-E08] section composition retains loaded, error/retry and empty child semantics", () => {
const retry = jest.fn();
const content = (loading: boolean, failed: boolean) => <ThemeProvider theme={getTheme("dark")}><I18nProvider>
<PageSection title="Notifications">
<ViewStateNotice loading={loading} title="Could not load" onRetry={retry}
error={failed ? { kind: "unavailable", message: "Could not load", retryable: true } : null} />
{!loading && !failed ? <Alert severity="info">No notifications.</Alert> : null}
</PageSection>
</I18nProvider></ThemeProvider>;
const view = render(content(true, false));
expect(screen.getByRole("status")).toHaveTextContent("Loading");
view.rerender(content(false, true));
fireEvent.click(screen.getByRole("button", { name: "Retry" }));
expect(retry).toHaveBeenCalledTimes(1);
expect(screen.getByRole("alert")).toHaveTextContent("Could not load");
view.rerender(content(false, false));
expect(screen.getByRole("status")).toHaveTextContent("Content loaded.");
expect(screen.getByRole("alert")).toHaveTextContent("No notifications.");
expect(screen.getByRole("region", { name: "Notifications" })).not.toHaveAttribute("tabindex");
});