fix(runtime): harden application service boundaries

This commit is contained in:
edde746
2026-07-24 03:46:46 +02:00
parent 658da37b48
commit e0bf66eea8
309 changed files with 32574 additions and 4369 deletions
@@ -94,9 +94,27 @@ void main() {
expect(find.byType(ErrorStateWidget), findsNothing);
expect(find.text('Artist One'), findsOneWidget);
});
testWidgets('missing library owner shows an error without querying another online server', (tester) async {
final harness = _MusicBrowseHarness();
addTearDown(harness.dispose);
final missingOwnerLibrary = MediaLibrary(
id: _musicLibrary.id,
backend: _musicLibrary.backend,
title: _musicLibrary.title,
kind: _musicLibrary.kind,
serverId: 'missing-server',
);
await _pumpBrowseTab(tester, harness, library: missingOwnerLibrary);
expect(find.byType(ErrorStateWidget), findsOneWidget);
expect(harness.requestCount, 0);
expect(tester.takeException(), isNull);
});
}
Future<void> _pumpBrowseTab(WidgetTester tester, _MusicBrowseHarness harness) async {
Future<void> _pumpBrowseTab(WidgetTester tester, _MusicBrowseHarness harness, {MediaLibrary? library}) async {
tester.view.devicePixelRatio = 1;
tester.view.physicalSize = const Size(1280, 720);
addTearDown(() {
@@ -124,7 +142,7 @@ Future<void> _pumpBrowseTab(WidgetTester tester, _MusicBrowseHarness harness) as
),
],
body: LibraryBrowseTab(
library: _musicLibrary,
library: library ?? _musicLibrary,
canGroupByFolders: true,
suppressAutoFocus: true,
onBack: () {},
@@ -148,6 +166,7 @@ Future<void> _pumpRequestFrames(WidgetTester tester) async {
class _MusicBrowseHarness {
final bool failFirstBrowse;
var browseRequestCount = 0;
var requestCount = 0;
late final JellyfinClient client;
late final MultiServerManager manager;
late final MultiServerProvider provider;
@@ -156,6 +175,7 @@ class _MusicBrowseHarness {
client = JellyfinClient.forTesting(
connection: testJellyfinConnection(machineId: 'music-server'),
httpClient: MockClient((request) async {
requestCount++;
if (request.url.path == '/Items/Filters') {
return http.Response(
jsonEncode({'Genres': const [], 'OfficialRatings': const [], 'Tags': const [], 'Years': const []}),
@@ -22,7 +22,6 @@ import 'package:plezy/services/jellyfin_api_cache.dart';
import 'package:plezy/services/jellyfin_client.dart';
import 'package:plezy/services/multi_server_manager.dart';
import 'package:plezy/services/plex_api_cache.dart';
import 'package:plezy/services/plex_client.dart';
import 'package:plezy/services/settings_service.dart';
import 'package:plezy/theme/mono_theme.dart';
import 'package:plezy/utils/platform_detector.dart';
@@ -144,7 +143,7 @@ class _CollectionHarness {
factory _CollectionHarness.plex() {
final database = AppDatabase.forTesting(NativeDatabase.memory());
PlexApiCache.initialize(database);
final client = PlexClient.forTesting(
final client = testPlexClient(
config: PlexConfig(
baseUrl: 'https://plex.example.com',
token: 'token',
@@ -30,6 +30,7 @@ import 'package:plezy/widgets/focusable_media_card.dart';
import 'package:plezy/widgets/media_card_sliver_layout.dart';
import 'package:provider/provider.dart';
import '../../test_helpers/backend_client_fixtures.dart';
import '../../test_helpers/prefs.dart';
final _serverId = ServerId('playlist-server');
@@ -241,7 +242,7 @@ class _PlaylistHarness {
_PlaylistHarness({this.playlistType = 'video'}) {
database = AppDatabase.forTesting(NativeDatabase.memory());
PlexApiCache.initialize(database);
client = PlexClient.forTesting(
client = testPlexClient(
config: PlexConfig(
baseUrl: 'https://plex.example.com',
token: 'token',