test: extract shared fixtures and scaffolds

Collapse duplicated setup across the suite into six shared helpers under
test/test_helpers/ and rewrite the 28 suites that were open-coding it:

  http_fixtures.dart         jsonResponse() for http.Response JSON stubs
  library_tab_scaffold.dart  pumps library tabs under their required ancestors
  multi_server_fixtures.dart MultiServerProvider wiring for widget tests
  playback_report_fakes.dart PlaybackReportCall + fake report sinks
  profile_stack.dart         production-shaped profile dependency graph
  theme.dart                 testMonoTokens for fast-settling widget tests

Net -1245 lines with no change in coverage or assertions.
This commit is contained in:
edde746
2026-07-26 06:09:47 +02:00
parent 04d8070fd4
commit 61344f7862
34 changed files with 1599 additions and 2505 deletions
@@ -8,7 +8,6 @@ import 'package:plezy/media/media_display_criteria.dart';
import 'package:plezy/media/media_item.dart';
import 'package:plezy/media/media_kind.dart';
import 'package:plezy/media/media_server_client.dart';
import 'package:plezy/media/playback_report_metadata.dart';
import 'package:plezy/mpv/models.dart';
import 'package:plezy/mpv/player/player.dart';
import 'package:plezy/mpv/player/player_state.dart';
@@ -20,6 +19,7 @@ import 'package:plezy/services/music/music_playback_service_impl.dart';
import 'package:plezy/services/music/music_source_resolver.dart';
import 'package:plezy/services/playback_coordinator.dart';
import '../../test_helpers/media_items.dart';
import '../../test_helpers/playback_report_fakes.dart';
const _trackDuration = Duration(minutes: 3);
@@ -351,7 +351,7 @@ class RecordedReport {
/// Records the progress-report surface; everything else is unimplemented
/// (the engine and tracker never touch it in these tests).
class FakeMediaServerClient extends Fake implements MediaServerClient {
class FakeMediaServerClient extends Fake with PlaybackReportRecorder implements MediaServerClient {
final List<RecordedReport> reports = [];
final List<String> markedWatched = [];
Completer<List<MediaItem>>? instantMixGate;
@@ -381,47 +381,13 @@ class FakeMediaServerClient extends Fake implements MediaServerClient {
}
@override
Future<void> reportPlaybackStarted({
required String itemId,
required Duration position,
Duration? duration,
String? playSessionId,
String? playMethod,
String? liveStreamId,
String? mediaSourceId,
int? audioStreamIndex,
int? subtitleStreamIndex,
}) async {
reports.add(RecordedReport('started', itemId, position));
}
@override
Future<void> reportPlaybackProgress({
required String itemId,
required Duration position,
required Duration duration,
bool isPaused = false,
String? playSessionId,
String? playMethod,
String? liveStreamId,
String? mediaSourceId,
int? audioStreamIndex,
int? subtitleStreamIndex,
}) async {
reports.add(RecordedReport(isPaused ? 'paused' : 'progress', itemId, position));
}
@override
Future<void> reportPlaybackStopped({
required String itemId,
required Duration position,
Duration? duration,
String? playSessionId,
String? liveStreamId,
String? mediaSourceId,
PlaybackReportMetadata report = const PlaybackReportMetadata.live(),
}) async {
reports.add(RecordedReport('stopped', itemId, position));
Future<void> onPlaybackReport(PlaybackReportCall call) async {
final state = switch (call.kind) {
PlaybackReportKind.started => 'started',
PlaybackReportKind.progress => call.isPaused ? 'paused' : 'progress',
PlaybackReportKind.stopped => 'stopped',
};
reports.add(RecordedReport(state, call.itemId, call.position));
}
}