forked from Mike/freno-dev
feat: add product-aware deletion emails and subdomain deletion/downloads routes
- Extend DeletionForm with product discriminator and configurable cooldown cookie - Extract env-free deletion email helpers into deletion-email.ts with Lineage/Nessa branding - Make misc.sendDeletionRequestEmail mutation product-aware (subject, html content, cookie) - Replace legacy /deletion/life-and-lineage page with 308 redirect to lineage subdomain - Add Lineage and Nessa subdomain deletion route modules with shared content components - Add Lineage downloads route modules with shared content - Update privacy policy deletion link to lineage subdomain
This commit is contained in:
46
src/routes/deletion/life-and-lineage.test.ts
Normal file
46
src/routes/deletion/life-and-lineage.test.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Regression test for the legacy `/deletion/life-and-lineage` route (task 11).
|
||||
*
|
||||
* The route was converted from a rendered page into a 308 permanent redirect
|
||||
* to `lineage.freno.me/deletion`. Because the route file is a SolidStart
|
||||
* server module, this is a STATIC SOURCE AUDIT (same pattern as the
|
||||
* `misc.test.ts` regression tests) asserting:
|
||||
* - The route exports a `GET` handler (API-route redirect, not a page).
|
||||
* - The response status is 308 (permanent).
|
||||
* - The `Location` header derives from the centralized
|
||||
* `LEGACY_DELETION_REDIRECT_TARGET` constant (not a hardcoded literal), so
|
||||
* the unit test in `deletion-content.test.ts` is the single source of
|
||||
* truth for the destination.
|
||||
* - No page component / DeletionForm import remains (the form moved to
|
||||
* `src/routes/lineage/deletion.tsx`).
|
||||
*/
|
||||
import { describe, it, expect } from "bun:test";
|
||||
import { readFileSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
|
||||
const SOURCE = readFileSync(
|
||||
join(import.meta.dir, "life-and-lineage.tsx"),
|
||||
"utf8"
|
||||
);
|
||||
|
||||
describe("Legacy /deletion/life-and-lineage — redirect (task 11)", () => {
|
||||
it("is a GET handler (API-route redirect, not a rendered page)", () => {
|
||||
expect(SOURCE).toContain("export function GET()");
|
||||
expect(SOURCE).not.toContain("export default function");
|
||||
});
|
||||
|
||||
it("responds with a 308 permanent redirect", () => {
|
||||
expect(SOURCE).toContain("status: 308");
|
||||
});
|
||||
|
||||
it("derives the Location from the centralized constant", () => {
|
||||
expect(SOURCE).toContain("LEGACY_DELETION_REDIRECT_TARGET");
|
||||
// The constant is imported from the lineage deletion-content module.
|
||||
expect(SOURCE).toContain("~/routes/lineage/deletion-content");
|
||||
});
|
||||
|
||||
it("no longer ships a page component / DeletionForm", () => {
|
||||
expect(SOURCE).not.toContain("DeletionForm");
|
||||
expect(SOURCE).not.toContain("PageHead");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user