Files
rippy/rippy-windows/test/protokoll.test.ts
HitonabiandClaude Fable 5.1 3dc6798c79 feat(v5): 5.5.0 — Kern und Oberfläche aufgeteilt, Übersicht und Einstellungen neu, Erst-Einrichtung mit Poster-Kulisse
Commander-Wünsche vom 02.09.2026 vor der Freigabe von 5.4.0 (die deshalb nie
veröffentlicht wurde):

Kern: kern/index.ts ist nur noch Bootstrap und Router; Dienste in
kern/dienste/ (Einstellungen, Werkzeuge, Laufwerke, Erkennung, Vorgänge,
Speicher, Benachrichtigung, Automatik), Kontext in kern/kontext.ts,
Protokoll-Datei in gemeinsam/protokoll.ts, Platz-Rechnung in gemeinsam/platz.ts.

Oberfläche: fenster/App.tsx ist nur noch der Rahmen; bausteine.tsx, dialoge/,
uebersicht/ (LaufwerkKachel, KompressionsKarte, SpeicherKarte, VerlaufKarte),
einstellungen/ (Karten je Funktion, SprachAuswahl), einrichtung/
(ErstEinrichtung, PosterHintergrund).

Neu: Bibliothek weg, dafür Verlauf; Speicher-und-Bilanz-Karte (statfs);
LED-Fußleiste; MakeMKV-Kopf in die Einstellungen; Sprach-Chips mit Dropdown
statt Allgemeinem Preset; Karten Automatik/Benachrichtigung/Allgemein/Update;
Durchsuchen bei Werkzeugen; Arbeitsordner lokal (Encode dort, dann in die
Ablage); Platz-Prüfung vor dem Rip (Dialog und Kern); Automatik mit Countdown;
Serien-Merker über Discs; Rettungs-Abbild mit Nullen nur nach gesehenen
Lesefehlern (kern/rip/rettung.ts, Phase rettet, iso:-Quelle); Warteschlange
pausieren; Discord/Telegram-Benachrichtigung; Protokoll-Datei je Tag;
Fensterlage 80 % mittig, gemerkt; Erst-Einrichtung in acht Schritten vor dem
Poster-Grid.

Beweise: 413 Tests (neu: speicher, benachrichtigung, automatik, rettung,
fensterlage, protokoll, kleinkram-550), drei Typprüfungen, Klick-Beweis mit
29 Schritten inklusive Erst-Einrichtung (zweiter Start mit
RIPPY_START_BEREICH=einrichtung), Bilder beweise/klick/01…09.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 17:51:15 +02:00

54 lines
2.7 KiB
TypeScript

// Tests der Protokoll-Datei (gemeinsam/protokoll.ts, 5.5.0): eine Datei je
// Tag, Zeile mit Zeitstempel und Quelle, Aufräumen nach 14 Tagen — und
// fremde Dateien im Ordner bleiben unangetastet.
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { afterAll, describe, expect, it } from 'vitest'
import { Protokoll, protokollDateiname, veraltet, zeitstempel } from '../src/gemeinsam/protokoll'
const wurzel = mkdtempSync(join(tmpdir(), 'rippy-protokoll-'))
afterAll(() => rmSync(wurzel, { recursive: true, force: true }))
describe('protokollDateiname / zeitstempel / veraltet', () => {
it('Name und Stempel sind lokal und zweistellig', () => {
const d = new Date(2026, 8, 2, 7, 5, 9)
expect(protokollDateiname(d)).toBe('rippy-2026-09-02.log')
expect(zeitstempel(d)).toBe('2026-09-02 07:05:09')
})
it('veraltet: älter als 14 Tage ja, 13 Tage nein, fremde Namen nie', () => {
const jetzt = new Date(2026, 8, 20)
const namen = ['rippy-2026-09-01.log', 'rippy-2026-09-07.log', 'rippy-2026-09-19.log', 'notizen.txt', 'rippy-alt.log']
expect(veraltet(namen, jetzt)).toEqual(['rippy-2026-09-01.log'])
expect(veraltet(namen, jetzt, 5)).toEqual(['rippy-2026-09-01.log', 'rippy-2026-09-07.log'])
})
})
describe('Protokoll', () => {
it('legt den Ordner an, schreibt Zeilen mit Stempel und Quelle, räumt Altes weg', () => {
const ordner = join(wurzel, 'logs')
let uhr = new Date(2026, 8, 2, 21, 13, 5)
const p = new Protokoll(ordner, 'kern', () => uhr)
p.schreiben('Datenbank geöffnet: C:\\x\\rippy.db')
p.schreiben('zweite Zeile')
const datei = join(ordner, 'rippy-2026-09-02.log')
expect(existsSync(datei)).toBe(true)
const zeilen = readFileSync(datei, 'utf8').trimEnd().split('\n')
expect(zeilen).toEqual(['2026-09-02 21:13:05 [kern] Datenbank geöffnet: C:\\x\\rippy.db', '2026-09-02 21:13:05 [kern] zweite Zeile'])
writeFileSync(join(ordner, 'rippy-2026-08-01.log'), 'alt\n')
writeFileSync(join(ordner, 'fremd.txt'), 'bleibt\n')
uhr = new Date(2026, 8, 3)
expect(p.aufraeumen()).toBe(1)
expect(existsSync(join(ordner, 'rippy-2026-08-01.log'))).toBe(false)
expect(existsSync(join(ordner, 'fremd.txt'))).toBe(true)
expect(existsSync(datei)).toBe(true)
})
it('ein nicht schreibbarer Ordner kippt nichts — die Fehlschläge werden beim nächsten Erfolg vermerkt', () => {
const sperre = join(wurzel, 'datei-statt-ordner')
writeFileSync(sperre, 'x')
const p = new Protokoll(join(sperre, 'logs'), 'haupt', () => new Date(2026, 8, 2))
expect(() => p.schreiben('geht nicht')).not.toThrow()
})
})