Archived
Unterseiten: gemeinsamer Footer über ein Layout
/kontakt, /ueber-uns, /agb, /impressum, /wartungs-abo, /hosting-abo und die 404-Seite bekommen den vorhandenen Footer (Impressum, Datenschutz, Kündigen/Widerrufen) über ein gemeinsames Layout in src/routes.tsx. Die Seiten selbst bleiben unverändert, damit die bestehenden Abo- und AGB-Tests nicht auf doppelte Footer-Links stoßen. Die Startseite behält ihren eigenen Footer, /datenschutz leitet weiter und bleibt ohne. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c75befe8e5
commit
900d3a9ab5
2 files changed
+37
-2
No files matched your search
+14
-2
@@ -1,4 +1,5 @@
|
|||||||
import { Routes, Route } from "react-router-dom";
|
import { Routes, Route, Outlet } from "react-router-dom";
|
||||||
|
import Footer from "@/components/Footer";
|
||||||
import Index from "./pages/Index";
|
import Index from "./pages/Index";
|
||||||
import ContactPage from "./pages/Contact";
|
import ContactPage from "./pages/Contact";
|
||||||
import AGBPage from "./pages/AGB";
|
import AGBPage from "./pages/AGB";
|
||||||
@@ -9,18 +10,29 @@ import HostingAboPage from "./pages/HostingAbo";
|
|||||||
import DatenschutzPage from "./pages/Datenschutz";
|
import DatenschutzPage from "./pages/Datenschutz";
|
||||||
import NotFound from "./pages/NotFound";
|
import NotFound from "./pages/NotFound";
|
||||||
|
|
||||||
|
/** Gemeinsamer Rahmen aller Unterseiten: Seiteninhalt, darunter der Footer mit Impressum, Datenschutz und Kündigen. */
|
||||||
|
const SubpageLayout = () => (
|
||||||
|
<>
|
||||||
|
<Outlet />
|
||||||
|
<Footer />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
|
||||||
/** Alle Seiten der Website; App.tsx rendert sie im BrowserRouter, die Tests im MemoryRouter. */
|
/** Alle Seiten der Website; App.tsx rendert sie im BrowserRouter, die Tests im MemoryRouter. */
|
||||||
export const AppRoutes = () => (
|
export const AppRoutes = () => (
|
||||||
<Routes>
|
<Routes>
|
||||||
|
{/* Die Startseite bringt ihren Footer selbst mit; /datenschutz leitet nur weiter. */}
|
||||||
<Route path="/" element={<Index />} />
|
<Route path="/" element={<Index />} />
|
||||||
|
<Route path="/datenschutz" element={<DatenschutzPage />} />
|
||||||
|
<Route element={<SubpageLayout />}>
|
||||||
<Route path="/kontakt" element={<ContactPage />} />
|
<Route path="/kontakt" element={<ContactPage />} />
|
||||||
<Route path="/agb" element={<AGBPage />} />
|
<Route path="/agb" element={<AGBPage />} />
|
||||||
<Route path="/impressum" element={<ImpressumPage />} />
|
<Route path="/impressum" element={<ImpressumPage />} />
|
||||||
<Route path="/ueber-uns" element={<AboutPage />} />
|
<Route path="/ueber-uns" element={<AboutPage />} />
|
||||||
<Route path="/wartungs-abo" element={<WartungsAboPage />} />
|
<Route path="/wartungs-abo" element={<WartungsAboPage />} />
|
||||||
<Route path="/hosting-abo" element={<HostingAboPage />} />
|
<Route path="/hosting-abo" element={<HostingAboPage />} />
|
||||||
<Route path="/datenschutz" element={<DatenschutzPage />} />
|
|
||||||
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
|
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
|
||||||
<Route path="*" element={<NotFound />} />
|
<Route path="*" element={<NotFound />} />
|
||||||
|
</Route>
|
||||||
</Routes>
|
</Routes>
|
||||||
);
|
);
|
||||||
@@ -259,3 +259,26 @@ describe("B5 Erfolgsversprechen entschärft", () => {
|
|||||||
expect(screen.queryByText("Langfristige Partnerschaft")).toBeNull();
|
expect(screen.queryByText("Langfristige Partnerschaft")).toBeNull();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("C1 Footer auf allen Unterseiten", () => {
|
||||||
|
const unterseiten = ["/kontakt", "/ueber-uns", "/agb", "/impressum", "/wartungs-abo", "/hosting-abo", "/gibt-es-nicht"];
|
||||||
|
|
||||||
|
it.each(unterseiten)("%s zeigt genau einen Footer mit Impressum und Datenschutz", (pfad) => {
|
||||||
|
seite(pfad);
|
||||||
|
const footer = screen.getByRole("contentinfo");
|
||||||
|
expect(within(footer).getByRole("link", { name: "Impressum" })).toHaveAttribute("href", "/impressum");
|
||||||
|
expect(within(footer).getByRole("link", { name: "Datenschutz" })).toHaveAttribute("href", DATENSCHUTZ);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("die Startseite hat weiterhin genau einen Footer", () => {
|
||||||
|
seite("/");
|
||||||
|
expect(screen.getAllByRole("contentinfo")).toHaveLength(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("der Footer steht hinter dem Seiteninhalt", () => {
|
||||||
|
seite("/impressum");
|
||||||
|
const inhalt = screen.getByRole("main");
|
||||||
|
const footer = screen.getByRole("contentinfo");
|
||||||
|
expect(inhalt.compareDocumentPosition(footer) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in new issue
Block a user