v2.53.1 — MED-3: Tests für Tombstone-Heuristik, SyncBericht, songAusServerMap + delete-deleted_at

## MED-3 (Review-Fix)
- test/sync_service_test.dart NEU (14 Tests): tombstoneAnwenden-Matrix
  (letzterSync null → true, deletedAt null → true, älter → false, neuer →
  true, Gleichstand → false, ungültiger Timestamp → true), SyncBericht
  (hatAenderungen, zusammenfassung kombiniert/leer, details), songAusServerMap
  (cloud_id/Titel/Künstler/Dauer/Größe/istKorrupt-Mapping, Defaults bei
  fehlenden Feldern, String-Robustheit) — deckt die MED-1-Heuristik + den
  MED-2-DB-Insert ab (123→140 Tests)
- test/cloud_service_test.dart +3: delete mit deletedAt sendet deleted_at im
  Body, delete ohne deletedAt sendet KEIN deleted_at-Feld, delete
  Netzwerkfehler → false
This commit is contained in:
Dustin
2026-08-05 11:24:51 +02:00
parent 2cd34d61dc
commit f14b658566
2 changed files with 189 additions and 0 deletions
+38
View File
@@ -304,6 +304,44 @@ void main() {
expect(await cloud401.delete('s1'), isFalse);
});
test('delete mit deletedAt sendet deleted_at im Body (Tombstone, Sprint E)',
() async {
late Map<String, dynamic> gesendeterBody;
final cloud = CloudService(
client: MockClient((req) async {
gesendeterBody = jsonDecode(req.body) as Map<String, dynamic>;
return http.Response('{}', 200);
}),
);
final ok = await cloud.delete('s1', deletedAt: '2026-08-05T10:00:00');
expect(ok, isTrue);
expect(gesendeterBody['song_id'], 's1');
expect(gesendeterBody['deleted_at'], '2026-08-05T10:00:00');
});
test('delete ohne deletedAt sendet KEIN deleted_at-Feld', () async {
late Map<String, dynamic> gesendeterBody;
final cloud = CloudService(
client: MockClient((req) async {
gesendeterBody = jsonDecode(req.body) as Map<String, dynamic>;
return http.Response('{}', 200);
}),
);
final ok = await cloud.delete('s1');
expect(ok, isTrue);
expect(gesendeterBody['song_id'], 's1');
expect(gesendeterBody.containsKey('deleted_at'), isFalse);
});
test('delete Netzwerkfehler → false (kein Crash)', () async {
final cloud = CloudService(
client: MockClient(
(req) async => throw http.ClientException('offline')),
);
expect(await cloud.delete('s1', deletedAt: '2026-08-05T10:00:00'),
isFalse);
});
test('globalList 200 → Songs, 401 → []', () async {
final cloudOk = CloudService(
client: MockClient((req) async =>