Entwarnung vorweg: es fehlt nichts. Alle vier Bereiche (Meine Musik, Online, Suchen, Favoriten) standen durchgehend in der Bottom-Nav; lib/main.dart wurde von der UI-Politur gar nicht angefasst. Aber die Politur hatte das Menue abgeschwaecht — zwei eigene Fehler: - selectedLabelStyle/unselectedLabelStyle bekamen beide fontSize 12. Damit verlor der aktive Eintrag den Groessenunterschied (Flutter-Vorgabe 14 zu 12), an dem man erkennt, wo man ist. Jetzt keine fontSize mehr. - unselectedItemColor stand auf text3 (Beiwerk-Stufe). Ein Hauptmenue ist kein Beiwerk -> text2. Zusaetzlich deutlicher: Haarlinie ueber der Leiste (auf Schwarz ging sie sonst im Inhalt auf), gefuellte Symbole fuer den aktiven Bereich (zweites Merkmal neben der Farbe) und fetterer aktiver Eintrag. Neu: test/hauptmenue_test.dart — prueft Vorhandensein, Sichtbarkeit auf dem Bildschirm, Position am unteren Rand, Wechsel per Tipp und die Abhebung des aktiven Bereichs. Damit kann keine weitere Politur das Menue unbemerkt abschwaechen. Nebenbei eine Test-Falle geloest: await db.close() nach einem tester.tap laesst den Lauf unbegrenzt haengen (drift plant eine Aufraeum-Aufgabe ein, die der Test-Rahmen nicht mehr abarbeitet). Rezept im Test dokumentiert. Beim bekannten Haenger in song_detail_sheet_test.dart hilft es NICHT — gegengeprueft und als eigene Ursache im BACKLOG vermerkt. 328 Tests gruen (10 neue, 1 uebersprungen), flutter analyze ohne Befund. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FpPu4nuKjKKeX1RpdDeX81
66 lines
3.3 KiB
Markdown
66 lines
3.3 KiB
Markdown
# Backlog
|
|
|
|
Bekannte offene Punkte, die bewusst zurückgestellt wurden. Nichts hier ist
|
|
vergessen — es ist entschieden, es später zu machen. Erledigtes wandert raus
|
|
(die Geschichte steht im CHANGELOG).
|
|
|
|
---
|
|
|
|
## 🧪 Widget-Test `song_detail_sheet_test.dart` hängt (übersprungen)
|
|
|
|
**Stand:** 2026-08-21 · **Auswirkung:** nur Tests, die App ist nicht betroffen
|
|
|
|
Der Test `Übernahme eines Online-Vorschlags setzt metadataEdited` bleibt beim
|
|
Aufbau des Widget-Baums hängen und kommt **nie** zurück — auch nach 13+
|
|
Minuten kein Abbruch. Da `flutter test` alle Dateien in einem Lauf abarbeitet,
|
|
blockierte er den **gesamten** Testlauf. Er ist deshalb mit `skip: true` und
|
|
einem TODO im Code markiert; der Lauf ist damit wieder in ~20 Sekunden durch.
|
|
|
|
**Fachlich ist nichts ungeprüft:** Was der Test absichern sollte, prüft
|
|
`test/library/metadaten_uebernahme_test.dart` ohne Widgets — inklusive der
|
|
Regel, dass eine übernommene Online-Korrektur `metadataEdited` setzt und
|
|
den nächsten Bibliotheks-Scan damit überlebt.
|
|
|
|
**Was schon eingegrenzt ist:**
|
|
|
|
| Verdacht | Ergebnis |
|
|
|---|---|
|
|
| `http.runWithClient` erreicht den State im Modal-Sheet nicht | ❌ widerlegt — eigene Sonde zeigt `MockClient` auch im Sheet |
|
|
| drift unter `testWidgets` blockiert (fehlendes `runAsync`) | ❌ widerlegt — `upsertSongs` + `watchSongs().first` laufen durch |
|
|
| Einer der Provider blockiert `pumpWidget` | ❌ widerlegt — `MeloDb`, `CategoryService`, `AppSettings` einzeln geprüft |
|
|
| `db.close()` im Teardown (der Hänger aus `hauptmenue_test.dart`) | ❌ widerlegt — Entfernen ändert nichts, siehe unten |
|
|
| Zusammenspiel `showModalBottomSheet` + Providerbaum | ⏳ offen — der Hänger tritt zwischen `pumpWidget` und dem ersten `tap` auf |
|
|
|
|
**Nicht die Ursache (2026-08-21 geprüft):** In `hauptmenue_test.dart` trat ein
|
|
Hänger mit derselben Signatur auf. Dort war die Ursache `await db.close()`
|
|
nach einem `tester.tap` — drift plant beim Schließen eine Aufräum-Aufgabe
|
|
ein, die der Test-Rahmen nicht mehr abarbeitet. Das Rezept dagegen:
|
|
Dienste per `.value` bereitstellen (der Baum darf sie nicht schließen), am
|
|
Testende `pumpWidget(SizedBox())` + `pump(Duration(milliseconds: 1))`, und
|
|
auf `db.close()` verzichten. **Bei `song_detail_sheet_test.dart` hilft genau
|
|
das nicht** — dort wurde es angewandt und der Test hängt weiter. Die beiden
|
|
Hänger haben also unterschiedliche Ursachen.
|
|
|
|
**Nächster Schritt:** Den Testkörper schrittweise abspecken (Providerbaum
|
|
minimieren, Sheet durch eine normale Route ersetzen) bis der Hänger
|
|
verschwindet — die letzte entfernte Zutat ist die Ursache. Ein
|
|
`tester.pumpWidget(const SizedBox())` mit anschließendem `pump()` am Testende
|
|
hat bei `online_screen_test.dart` einen verwandten Aufräum-Timer von drift
|
|
gelöst und ist einen Versuch wert.
|
|
|
|
---
|
|
|
|
## 📥 Kein Wiederherstellen gelöschter Titel
|
|
|
|
**Stand:** 2026-08-21 · **Auswirkung:** Datenverlust im Fehlerfall möglich
|
|
|
|
Löschungen wirken über den Geräte-Abgleich in beide Richtungen. Gegen
|
|
versehentliche Massenlöschung schützt die Sicherheitsbremse
|
|
(`loeschBremseGreift`), aber eine **einzelne** irrtümliche Löschung ist
|
|
endgültig: Datei und Navidrome-Verknüpfung sind weg, sobald kein Konto den
|
|
Titel mehr aktiv hat.
|
|
|
|
Denkbar wäre ein Papierkorb am Server (Datei erst nach X Tagen wirklich
|
|
löschen). Bewusst nicht gebaut — erst beobachten, ob es in der Praxis
|
|
gebraucht wird.
|