diff --git a/src/components/auth/__tests__/claim-profile-invalid.test.tsx b/src/components/auth/__tests__/claim-profile-invalid.test.tsx
new file mode 100644
index 000000000..b240065c0
--- /dev/null
+++ b/src/components/auth/__tests__/claim-profile-invalid.test.tsx
@@ -0,0 +1,40 @@
+import { describe, it, expect, vi } from "vitest";
+import { renderToStaticMarkup } from "react-dom/server";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+
+import { I18nProvider } from "@/lib/i18n/context";
+
+/**
+ * A claim link that no longer works still leaves the page with a way on:
+ * the card offers the sign-in page instead of ending in a dead end.
+ */
+
+vi.mock("next/navigation", () => ({
+ useRouter: () => ({ replace: () => {}, refresh: () => {}, push: () => {} }),
+}));
+vi.mock("@/hooks/use-auth", () => ({
+ useAuth: () => ({ user: null }),
+ clearCachesForSessionEnd: () => {},
+}));
+vi.mock("@/lib/queries/use-profile-claim", () => ({
+ useProfileClaimPreview: () => ({ data: undefined, error: null }),
+ useClaimProfile: () => ({ mutate: () => {}, isPending: false }),
+}));
+
+import { ClaimProfile } from "../claim-profile";
+
+describe("ClaimProfile — invalid link", () => {
+ it("offers the sign-in page", () => {
+ const html = renderToStaticMarkup(
+