UX-Simulation: Mehrfachauswahl überall, Baka-Login, Bestätigungen, Suche

7 Agenten sind die App als normaler Nutzer durchgegangen (Erststart,
Bibliothek, Download, Suche, Favoriten, Player, Einstellungen) und haben
39 Reibungspunkte gefunden. Erster Block:

- Mehrfachauswahl lief nur im Lieder-/Favoriten-Reiter, nicht in
  Kategorie-/Künstler-/Album-Ansichten — jetzt überall, per geteilter
  auswahl_leiste.dart
- Zwei unterschiedlich ausgestattete Favoriten-Listen (Tab vs. Playlisten)
  vereinheitlicht
- Baka-Login zeigt Ladezustand + Fehler im Dialog statt bis zu 15s stumm
  zu bleiben (wie der Navidrome-Login)
- Cache leeren, Navidrome-Abmelden, Download einzeln entfernen fragen jetzt
  nach
- Download-Fehlermeldung bei toter Serververbindung nennt den echten Grund
  statt "War schon heruntergeladen"
- YouTube-Fehlermeldungen sind jetzt rot statt neutralfarben
- Suche schließt die Tastatur nach Auswahl, nennt den Suchbegriff bei
  "Nichts gefunden", einzelne Verlaufseinträge sind entfernbar
- Icon-/Text-Korrekturen (Mikrofon-Icon fälschlich bei Speicherzugriff,
  "Online"-Tab existiert nicht, ReplayGain-Jargon)

537 Tests grün (vorher 533), flutter analyze ohne Befund.
This commit is contained in:
Hermes (Server)
2026-08-25 09:42:41 +02:00
parent 60c57577a3
commit 07acf77ba4
15 changed files with 511 additions and 202 deletions
+3 -2
View File
@@ -127,11 +127,12 @@ void main() {
await aufraeumen(tester);
});
testWidgets('ohne Treffer erscheint "Nichts gefunden"', (tester) async {
testWidgets('ohne Treffer erscheint "Nichts gefunden" mit dem Suchbegriff',
(tester) async {
await pumpe(tester);
await tippe(tester, 'jazzfrühstück');
expect(find.text('Nichts gefunden'), findsOneWidget);
expect(find.text('Nichts gefunden für „jazzfrühstück"'), findsOneWidget);
await aufraeumen(tester);
});
+23
View File
@@ -44,4 +44,27 @@ void main() {
expect(vorher, ['rock']);
});
});
group('verlaufOhne', () {
test('entfernt genau den gesuchten Begriff', () {
expect(verlaufOhne(['trap', 'neoni', 'rock'], 'neoni'),
['trap', 'rock']);
});
test('Groß- und Kleinschreibung gilt als derselbe Begriff', () {
expect(verlaufOhne(['Rock', 'trap'], 'rock'), ['trap']);
});
test('ein nicht enthaltener Begriff ändert nichts', () {
expect(verlaufOhne(['rock'], 'trap'), ['rock']);
});
test('lässt die Ausgangsliste unverändert', () {
final vorher = ['rock', 'trap'];
verlaufOhne(vorher, 'rock');
expect(vorher, ['rock', 'trap']);
});
});
}