import { describe, it, expect, vi, beforeEach } from "vitest"; const sent: Array> = []; vi.mock("resend", () => ({ Resend: class { emails = { send: async (args: Record) => { sent.push(args); return { data: { id: "test" }, error: null }; }, }; }, })); vi.mock("../settings", () => ({ getSetting: async () => "Second Brain", })); const { sendCommentReplyEmail } = await import("../email"); const LESSON_URL = "https://school.second-brain.ru/courses/obsidian-full/lessons/lesson-1"; describe("sendCommentReplyEmail", () => { beforeEach(() => { sent.length = 0; }); it("кладёт текст ответа в письмо и ведёт кнопкой на урок", async () => { await sendCommentReplyEmail( "student@example.com", "Владимир", "6.3. Холст", "Прямого импорта нет, но есть два пути.", LESSON_URL, "Дмитрий" ); expect(sent).toHaveLength(1); expect(sent[0].to).toBe("student@example.com"); expect(sent[0].subject).toBe("Ответ на ваш комментарий к уроку «6.3. Холст»"); expect(sent[0].html).toContain("Прямого импорта нет, но есть два пути."); expect(sent[0].html).toContain("Привет, Владимир!"); expect(sent[0].html).toContain("Отвечает Дмитрий:"); expect(sent[0].html).toContain(`href="${LESSON_URL}"`); }); it("экранирует разметку в тексте ответа и в названии урока", async () => { await sendCommentReplyEmail( "student@example.com", "Владимир", "Урок про холст", 'Смотрите тег ', LESSON_URL ); const html = sent[0].html; expect(html).not.toContain("