// 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() }) })