import type { Kysely } from "kysely"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { buildCommentNotificationEmail, lookupContentAuthor, sendCommentNotification, } from "../../../src/comments/notifications.js"; import type { Database } from "../../../src/database/types.js"; import type { EmailPipeline } from "../../../src/plugins/email.js"; import { setupTestDatabaseWithCollections, teardownTestDatabase } from "../../utils/test-db.js"; describe("Comment Notifications", () => { describe("buildCommentNotificationEmail", () => { it("builds email with content title", () => { const email = buildCommentNotificationEmail("author@example.com", { commentAuthorName: "Jane", commentBody: "Great post!", contentTitle: "My Blog Post", collection: "post", adminBaseUrl: "https://example.com/_emdash", }); expect(email.to).toBe("author@example.com"); expect(email.subject).toBe('New comment on "My Blog Post"'); expect(email.text).toContain("Jane"); expect(email.text).toContain("Great post!"); expect(email.text).toContain("/_emdash/admin/comments"); expect(email.html).toContain("Jane"); expect(email.html).toContain("Great post!"); }); it("falls back to collection name when no title", () => { const email = buildCommentNotificationEmail("author@example.com", { commentAuthorName: "Jane", commentBody: "Nice!", contentTitle: "", collection: "post", adminBaseUrl: "https://example.com/_emdash", }); expect(email.subject).toBe('New comment on "post item"'); }); it("truncates long comment bodies", () => { const longBody = "x".repeat(600); const email = buildCommentNotificationEmail("author@example.com", { commentAuthorName: "Jane", commentBody: longBody, contentTitle: "Post", collection: "post", adminBaseUrl: "https://example.com/_emdash", }); expect(email.text).toContain("..."); expect(email.text).not.toContain("x".repeat(600)); }); it("escapes HTML in author name and body", () => { const email = buildCommentNotificationEmail("author@example.com", { commentAuthorName: '', commentBody: "", contentTitle: "Post", collection: "post", adminBaseUrl: "https://example.com/_emdash", }); expect(email.html).not.toContain("