import { beforeAll, describe, expect, it, vi } from 'vitest'; import { createEmptyProject } from '@/domain/model/factory'; import { ladeSitzung, saveSession } from '@/services/storage'; /** * Ein unberuehrter Wiederanlauf ist kein ungespeicherter Stand. * * Befund 20 verlangt zu Recht: Was aus dem Sitzungsspeicher kommt, steht in * keiner Datei, und "Neu", "Öffnen" und "Schließen" duerfen es nicht ohne * Rueckfrage verwerfen. Die Behebung setzte den Merker aber fuer JEDEN * wiederhergestellten Stand. * * Damit galt auch das leere Startprojekt als ungespeichert - und zwar bei jedem * zweiten Start: Wer das Programm oeffnet, nichts eingibt und wieder schliesst, * bekommt seinen unberuehrten Stand beim Verlassen in den Sitzungsspeicher * geschrieben (`AutoSave.beimVerlassen`). Beim naechsten Start kam er als * 'geladen' zurueck, der Fenstertitel trug den Aufzaehlungspunkt, und das * Schliessen fragte "Ungespeicherte Änderungen" - ueber eine Arbeit, die es * nie gab. * * Am gebauten Stand gemessen (`e2e/rauchtest.spec.ts`, Titel * "• Projekt – Neues Projekt – LSA-Planer Professional"): Die Rueckfrage hielt * dort das Fenster offen, bis der Rauchtest ablief. * * Das ist die gefaehrliche Richtung fuer eine Rueckfrage: Wer sie bei jedem * Schliessen sieht, ohne je etwas geaendert zu haben, klickt sie weg - und * damit auch dann, wenn sie einmal einen echten Knotenpunkt schuetzt. * * Geprueft wird am echten Einstiegspunkt: `src/main.ts` wird eingelesen und * startet die ganze Anwendung; nur der Sitzungsspeicher ist ersetzt. Das * Gegenstueck - ein wiederhergestellter Stand MIT Inhalt - steht in * `wiederanlaufanzeige.test.ts` und muss gruen bleiben. */ vi.mock('@/services/storage', async (importOriginal) => { const echt = await importOriginal(); return { ...echt, ladeSitzung: vi.fn(), saveSession: vi.fn(), addRecoveryPoint: vi.fn(), }; }); async function warte(ms = 0): Promise { await new Promise((fertig) => setTimeout(fertig, ms)); } beforeAll(async () => { vi.mocked(ladeSitzung).mockResolvedValue({ art: 'geladen', stand: { // Genau das, was ein frischer Start auch liefert - nur eben aus dem // Sitzungsspeicher. project: createEmptyProject(), issues: [], repaired: false, migrated: false, sourceVersion: '13', intergreenComparison: [], }, }); vi.mocked(saveSession).mockResolvedValue({ ok: true, message: '' }); localStorage.clear(); document.body.replaceChildren(); const wurzel = document.createElement('div'); wurzel.id = 'anwendung'; document.body.append(wurzel); await import('@/main'); await warte(20); }); describe('Wiederanlauf mit einem unberuehrten Projekt', () => { it('setzt keinen Aufzählungspunkt in den Fenstertitel', () => { expect(document.title.startsWith('• ')).toBe(false); }); it('meldet in der Kopfzeile keine ungespeicherten Änderungen', () => { const info = document.getElementById('kopf-projektinfo'); expect(info?.textContent).not.toContain('ungespeicherte Änderungen'); }); it('sagt in der Statusleiste weiterhin, dass keine Datei dahintersteht', () => { // Das bleibt richtig und ist etwas anderes als "geaendert": Ein neues // Projekt steht in keiner Datei, egal woher es kommt. const leiste = document.querySelector('.leiste'); expect(leiste?.textContent).toContain('Nicht als Datei gespeichert'); }); });