a93a43e1c8
- extractImportantMessages (TDD) : E:/dpkg error → error, W:/GPG → warning, déprecations/EOL → future_major_change ; nettoyage des secrets dans les URLs - recordImportantMessages : dédup par (machine, source, message) non acquitté → maj lastSeenAt, sinon insert (firstSeen/lastSeen) dans important_messages - branché dans refreshMachine (sortie APT) avec snapshotId - routes GET /machines/:id/messages + POST .../:msgId/ack - UI : carte « Messages importants » (badge sévérité + ack) dans le panneau détail tsc 0 · 118 tests · build OK. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
43 lines
1.7 KiB
TypeScript
43 lines
1.7 KiB
TypeScript
import { describe, it, expect } from "vitest";
|
|
import { extractImportantMessages } from "./importantMessages.js";
|
|
|
|
describe("extractImportantMessages", () => {
|
|
it("classe les erreurs APT (E:, dpkg) en error", () => {
|
|
const raw = [
|
|
"E: Unable to locate package toto",
|
|
"dpkg: error processing package nginx (--configure):",
|
|
"Inst libc6 [2.36] (2.37 Debian:13)",
|
|
].join("\n");
|
|
const msgs = extractImportantMessages(raw, "apt");
|
|
expect(msgs.filter((m) => m.severity === "error").length).toBe(2);
|
|
expect(msgs.every((m) => m.category === "error")).toBe(true);
|
|
});
|
|
|
|
it("classe W: et erreurs GPG en warning", () => {
|
|
const raw = [
|
|
"W: GPG error: http://deb.debian.org ... NO_PUBKEY 1234ABCD",
|
|
"W: Target Packages is configured multiple times",
|
|
].join("\n");
|
|
const msgs = extractImportantMessages(raw, "apt");
|
|
expect(msgs.length).toBe(2);
|
|
expect(msgs.every((m) => m.severity === "warning")).toBe(true);
|
|
});
|
|
|
|
it("détecte les annonces de dépréciation / changement majeur", () => {
|
|
const raw = "Note: package foo is deprecated and will be removed in the next release";
|
|
const msgs = extractImportantMessages(raw, "apt");
|
|
expect(msgs.some((m) => m.category === "future_major_change")).toBe(true);
|
|
});
|
|
|
|
it("nettoie les secrets éventuels dans les URLs", () => {
|
|
const raw = "E: Failed to fetch https://user:pass@repo.example/x";
|
|
const msgs = extractImportantMessages(raw, "apt");
|
|
expect(msgs[0]!.message).not.toContain("user:pass");
|
|
});
|
|
|
|
it("ignore les lignes normales", () => {
|
|
const raw = "Reading package lists...\nBuilding dependency tree...";
|
|
expect(extractImportantMessages(raw, "apt")).toHaveLength(0);
|
|
});
|
|
});
|