import { describe, expect, it } from "vitest"; import { parseMbox, searchMailbox } from "../../src/core/mbox"; describe("mbox import and threading", () => { it("splits mboxrd messages, unescapes body From lines, and threads replies", () => { const source = `From sender@example.test Tue Sep 1 10:00:00 2026 From: Sender Date: Tue, 01 Sep 2026 10:00:00 +0000 Message-ID: Subject: Root First body >From escaped body line From reply@example.test Tue Sep 1 10:01:00 2026 From: Reply Date: Tue, 01 Sep 2026 10:01:00 +0000 Message-ID: In-Reply-To: References: Subject: Re: Root Reply body `; const mailbox = parseMbox(new TextEncoder().encode(source)); expect(mailbox.entries).toHaveLength(2); expect(mailbox.entries[0]?.message.bodySource).toContain( "From escaped body line", ); expect(mailbox.entries[1]).toMatchObject({ parentIndex: 0, depth: 1, subject: "Re: Root", }); expect( searchMailbox(mailbox, "escaped body").map((entry) => entry.index), ).toEqual([0]); expect( searchMailbox(mailbox, "reply root", { includeBodies: false }), ).toHaveLength(1); }); it("requires an envelope separator", () => { expect(() => parseMbox(new TextEncoder().encode("From: a@example.test\n\nbody")), ).toThrow(/envelope separator/iu); }); });