CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Mail-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Detailansicht fuer web/mail-postfach (UX-01-App erweitert, nicht neu gebaut): Header (Von/Betreff/Ordner/Datum/Nachricht-ID), Nachrichtentext, Anhangsliste mit Download (Dateiname nicht verfuegbar -- System persistiert keinen Originalnamen, daher Anhang N + aus dem Content-Type geratene Endung). Thread-Gruppierung ueber normalisierten Betreff (keine In-Reply-To/References-Header im System), Navigation zwischen Thread-Nachrichten als reiner Komponentenzustand derselben Seite (kein Routenwechsel -- Ordner-/Suchkontext bleibt dadurch strukturell erhalten, Akzeptanzkriterium 3). UX-03 (eigener offener Branch, eigenes Frontend web/mail-search) wird NICHT wiederverwendet -- getrennte Apps ohne Komponentenfreigabe, siehe UX-02-PRUEFPROTOKOLL.md fuer die Abgrenzung und die Begruendung der Backend-Erweiterung. Tests: lib/threading, lib/threadNavigation, lib/attachmentNaming, components/MessageDetail (Komponententest je Akzeptanzkriterium), __tests__/a11y (jest-axe, Pruefung 3), e2e/ux02 gegen die echte mailpostfach-fixture (Pruefungen 1+2, Mandantentrennung). Bestehender e2e/ux01-Satz bleibt unveraendert gruen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { findNextInThread, findPreviousInThread } from "./threadNavigation";
|
|
import type { MessageListItemDTO } from "./api";
|
|
|
|
function msg(messageId: string, sentAt: number): MessageListItemDTO {
|
|
return { messageId, subject: "Thread", sender: "a@b.test", mailbox: "posteingang", sentAt };
|
|
}
|
|
|
|
const thread = [msg("1", 100), msg("2", 200), msg("3", 300)];
|
|
|
|
describe("findNextInThread", () => {
|
|
it("liefert die nächste Nachricht im Thread", () => {
|
|
expect(findNextInThread(thread, "1")).toBe("2");
|
|
expect(findNextInThread(thread, "2")).toBe("3");
|
|
});
|
|
|
|
it("liefert null an der letzten Nachricht", () => {
|
|
expect(findNextInThread(thread, "3")).toBeNull();
|
|
});
|
|
|
|
it("liefert null für eine unbekannte Nachricht", () => {
|
|
expect(findNextInThread(thread, "unbekannt")).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe("findPreviousInThread", () => {
|
|
it("liefert die vorherige Nachricht im Thread", () => {
|
|
expect(findPreviousInThread(thread, "3")).toBe("2");
|
|
expect(findPreviousInThread(thread, "2")).toBe("1");
|
|
});
|
|
|
|
it("liefert null an der ersten Nachricht", () => {
|
|
expect(findPreviousInThread(thread, "1")).toBeNull();
|
|
});
|
|
});
|