/** * Locale-specific SEO slugs — public German keyword URLs rewrite onto the * shared App Router folders; English slugs under /de/ 301 to the DE slug. */ import { describe, test, expect } from "./runner"; import { decideSeoLocalePath, localizePathname, publicPath, } from "../../src/lib/seo/slugs"; describe("SEO slugs — public paths", () => { test("German blog slugs use keyword URLs", () => { expect(publicPath("de", "blog/simple-expense-tracking")).toBe( "/de/blog/einfache-ausgabenverfolgung", ); expect(publicPath("en", "blog/simple-expense-tracking")).toBe( "/en/blog/simple-expense-tracking", ); }); test("German keyword pages use German slugs", () => { expect(publicPath("de", "ocr-receipt-scanner")).toBe("/de/beleg-ocr"); expect(publicPath("de", "expense-tracker-freelancers")).toBe( "/de/ausgaben-tracker-freelancer", ); expect(publicPath("de", "expensify-alternative")).toBe("/de/alternative-zu-expensify"); expect(publicPath("de", "lexoffice-alternative")).toBe("/de/alternative-zu-lexoffice"); }); }); describe("SEO slugs — middleware decisions", () => { test("DE public slug rewrites onto the internal folder", () => { expect(decideSeoLocalePath("/de/blog/einfache-ausgabenverfolgung")).toEqual({ kind: "rewrite", pathname: "/de/blog/simple-expense-tracking", }); expect(decideSeoLocalePath("/de/beleg-ocr")).toEqual({ kind: "rewrite", pathname: "/de/ocr-receipt-scanner", }); }); test("English slug under /de/ redirects to the German keyword URL", () => { expect(decideSeoLocalePath("/de/blog/simple-expense-tracking")).toEqual({ kind: "redirect", pathname: "/de/blog/einfache-ausgabenverfolgung", }); expect(decideSeoLocalePath("/de/ocr-receipt-scanner")).toEqual({ kind: "redirect", pathname: "/de/beleg-ocr", }); }); test("German slug under /en/ redirects to the English URL", () => { expect(decideSeoLocalePath("/en/blog/einfache-ausgabenverfolgung")).toEqual({ kind: "redirect", pathname: "/en/blog/simple-expense-tracking", }); }); test("correct English public slugs pass through", () => { expect(decideSeoLocalePath("/en/blog/simple-expense-tracking")).toEqual({ kind: "none", }); expect(decideSeoLocalePath("/en/ocr-receipt-scanner")).toEqual({ kind: "none" }); }); test("homepage and blog index are untouched", () => { expect(decideSeoLocalePath("/de")).toEqual({ kind: "none" }); expect(decideSeoLocalePath("/en")).toEqual({ kind: "none" }); expect(decideSeoLocalePath("/de/blog")).toEqual({ kind: "none" }); expect(decideSeoLocalePath("/en/blog")).toEqual({ kind: "none" }); }); }); describe("SEO slugs — language switch", () => { test("maps the sibling locale slug instead of only swapping /en and /de", () => { expect(localizePathname("/en/blog/simple-expense-tracking", "de")).toBe( "/de/blog/einfache-ausgabenverfolgung", ); expect(localizePathname("/de/blog/einfache-ausgabenverfolgung", "en")).toBe( "/en/blog/simple-expense-tracking", ); expect(localizePathname("/de", "en")).toBe("/en"); expect(localizePathname("/en/blog", "de")).toBe("/de/blog"); }); });