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>
54 lines
2.7 KiB
TypeScript
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()
|
|
})
|
|
})
|