diff --git a/src/__tests__/dead-token-verification-removal.test.ts b/src/__tests__/dead-token-verification-removal.test.ts new file mode 100644 index 0000000..dfd0510 --- /dev/null +++ b/src/__tests__/dead-token-verification-removal.test.ts @@ -0,0 +1,101 @@ +import { describe, it, expect } from "vitest"; +import request from "supertest"; +import { app } from "../index.js"; + +describe("Dead Token Verification System Removal", () => { + describe("Removed Functions", () => { + it("should not export verificationsCache from verification service", async () => { + try { + const verification = await import("../services/verification.js"); + expect(verification).not.toHaveProperty("verificationsCache"); + } catch (error) { + // This is fine - the export doesn't exist + expect(true).toBe(true); + } + }); + + it("should not export loadVerifications from verification service", async () => { + try { + const verification = await import("../services/verification.js"); + expect(verification).not.toHaveProperty("loadVerifications"); + } catch (error) { + // This is fine - the export doesn't exist + expect(true).toBe(true); + } + }); + + it("should not export verifyToken from verification service", async () => { + try { + const verification = await import("../services/verification.js"); + expect(verification).not.toHaveProperty("verifyToken"); + } catch (error) { + // This is fine - the export doesn't exist + expect(true).toBe(true); + } + }); + + it("should not export verifyTokenSync from verification service", async () => { + try { + const verification = await import("../services/verification.js"); + expect(verification).not.toHaveProperty("verifyTokenSync"); + } catch (error) { + // This is fine - the export doesn't exist + expect(true).toBe(true); + } + }); + + it("should not export createVerification from verification service", async () => { + try { + const verification = await import("../services/verification.js"); + expect(verification).not.toHaveProperty("createVerification"); + } catch (error) { + // This is fine - the export doesn't exist + expect(true).toBe(true); + } + }); + }); + + describe("Removed Routes", () => { + it("should return 404 for GET /verify route", async () => { + const response = await request(app).get("/verify").query({ token: "some-token" }); + expect(response.status).toBe(404); + }); + + it("should return 404 for GET /verify route without token", async () => { + const response = await request(app).get("/verify"); + expect(response.status).toBe(404); + }); + }); + + describe("Active System Still Works", () => { + it("should export createPendingVerification", async () => { + const verification = await import("../services/verification.js"); + expect(verification).toHaveProperty("createPendingVerification"); + expect(typeof verification.createPendingVerification).toBe("function"); + }); + + it("should export verifyCode", async () => { + const verification = await import("../services/verification.js"); + expect(verification).toHaveProperty("verifyCode"); + expect(typeof verification.verifyCode).toBe("function"); + }); + + it("should export isEmailVerified", async () => { + const verification = await import("../services/verification.js"); + expect(verification).toHaveProperty("isEmailVerified"); + expect(typeof verification.isEmailVerified).toBe("function"); + }); + + it("should export getVerifiedApiKey", async () => { + const verification = await import("../services/verification.js"); + expect(verification).toHaveProperty("getVerifiedApiKey"); + expect(typeof verification.getVerifiedApiKey).toBe("function"); + }); + + it("should export PendingVerification interface", async () => { + // TypeScript interface test - if compilation passes, the interface exists + const verification = await import("../services/verification.js"); + expect(verification).toBeDefined(); + }); + }); +}); \ No newline at end of file diff --git a/src/__tests__/setup.ts b/src/__tests__/setup.ts index 1629eab..19fff85 100644 --- a/src/__tests__/setup.ts +++ b/src/__tests__/setup.ts @@ -72,12 +72,9 @@ vi.mock("../services/browser.js", () => ({ // Mock verification service vi.mock("../services/verification.js", () => ({ - verifyToken: vi.fn().mockReturnValue({ status: "invalid" }), - loadVerifications: vi.fn().mockResolvedValue(undefined), createPendingVerification: vi.fn().mockResolvedValue({ email: "test@test.com", code: "123456" }), verifyCode: vi.fn().mockResolvedValue({ status: "ok" }), isEmailVerified: vi.fn().mockResolvedValue(false), - createVerification: vi.fn().mockResolvedValue({ email: "test@test.com", token: "tok", apiKey: "key", createdAt: "", verifiedAt: null }), getVerifiedApiKey: vi.fn().mockResolvedValue(null), })); diff --git a/src/__tests__/signup.test.ts b/src/__tests__/signup.test.ts index 5022dd2..1621e05 100644 --- a/src/__tests__/signup.test.ts +++ b/src/__tests__/signup.test.ts @@ -8,7 +8,7 @@ beforeEach(async () => { vi.clearAllMocks(); vi.resetModules(); - const { isEmailVerified, createPendingVerification, verifyCode, createVerification } = await import("../services/verification.js"); + const { isEmailVerified, createPendingVerification, verifyCode } = await import("../services/verification.js"); const { sendVerificationEmail } = await import("../services/email.js"); const { createFreeKey } = await import("../services/keys.js"); @@ -16,7 +16,7 @@ beforeEach(async () => { vi.mocked(createPendingVerification).mockResolvedValue({ email: "test@test.com", code: "123456", createdAt: "", expiresAt: "", attempts: 0 }); vi.mocked(verifyCode).mockResolvedValue({ status: "ok" }); vi.mocked(createFreeKey).mockResolvedValue({ key: "free-key-123", tier: "free", email: "test@test.com", createdAt: "" }); - vi.mocked(createVerification).mockResolvedValue({ email: "test@test.com", token: "tok", apiKey: "free-key-123", createdAt: "", verifiedAt: null }); + vi.mocked(sendVerificationEmail).mockResolvedValue(true); const { signupRouter } = await import("../routes/signup.js"); diff --git a/src/index.ts b/src/index.ts index 6255d84..ecd5a6b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,7 +23,7 @@ import { getUsageStats, getUsageForKey } from "./middleware/usage.js"; import { pdfRateLimitMiddleware, getConcurrencyStats } from "./middleware/pdfRateLimit.js"; import { initBrowser, closeBrowser } from "./services/browser.js"; import { loadKeys, getAllKeys, isProKey } from "./services/keys.js"; -import { verifyToken, loadVerifications } from "./services/verification.js"; + import { initDatabase, pool, cleanupStaleData } from "./services/db.js"; import { swaggerSpec } from "./swagger.js"; @@ -215,63 +215,7 @@ app.post("/admin/cleanup", authMiddleware, adminAuth, async (_req: any, res: any }); // Email verification endpoint -app.get("/verify", (req, res) => { - const token = req.query.token as string; - if (!token) { - res.status(400).send(verifyPage("Invalid Link", "No verification token provided.", null)); - return; - } - const result = verifyToken(token); - - switch (result.status) { - case "ok": - res.send(verifyPage("Email Verified! ๐", "Your DocFast API key is ready:", result.verification!.apiKey)); - break; - case "already_verified": - res.send(verifyPage("Already Verified", "This email was already verified. Here's your API key:", result.verification!.apiKey)); - break; - case "expired": - res.status(410).send(verifyPage("Link Expired", "This verification link has expired (24h). Please sign up again.", null)); - break; - case "invalid": - res.status(404).send(verifyPage("Invalid Link", "This verification link is not valid.", null)); - break; - } -}); - -function verifyPage(title: string, message: string, apiKey: string | null): string { - return ` -
-${message}
-${apiKey ? ` -