Files
plezy/test/metadata_edit/metadata_edit_models_test.dart
T
edde746 6eb0805f8d refactor(profiles): delete dead client accessors, the write-only focus aspect, and test-only registry API
getServerBoundPlexClient/getClientForLibrary existed only for their own unit tests; MetadataEditAdapter.backend and Plex's unreachable prefKey fallback and music-kind branches had no production path (edit is double-gated on supportsKind); MainScreenFocusScope's focus aspect, isSidebarFocused, and focusContent were write-only; resolveActivePlexIdentity.preferredAccount was never passed; ProfileRegistry.get was unused outside tests — its removal exposed a stale test contract, now pinned correctly: list() deliberately never serves plex_home rows.
2026-08-17 19:02:24 +02:00

109 lines
3.2 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/media/media_backend.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/metadata_edit/metadata_edit_models.dart';
import '../test_helpers/media_items.dart';
void main() {
test('adapter dirty tracking ignores immediate fields', () {
final item = testMediaItem(id: '1', backend: MediaBackend.plex, kind: MediaKind.movie);
final adapter = _TestMetadataEditAdapter();
final draft = MetadataEditDraft(
sourceItem: item,
currentItem: item,
values: {'title': 'Original', 'artwork:posters': 'old-poster'},
);
draft.setValue('artwork:posters', 'new-poster');
expect(adapter.hasChanges(draft), isFalse);
draft.setValue('title', 'Edited');
expect(adapter.hasChanges(draft), isTrue);
});
test('adapter dirty tracking compares string lists as sets', () {
final item = testMediaItem(id: '1', backend: MediaBackend.plex, kind: MediaKind.movie);
final adapter = _TestMetadataEditAdapter();
final draft = MetadataEditDraft(
sourceItem: item,
currentItem: item,
values: {
'title': 'Original',
'genre': ['Drama', 'Action'],
'artwork:posters': 'old-poster',
},
);
draft.setValue('genre', ['Action', 'Drama']);
expect(adapter.hasChanges(draft), isFalse);
draft.setValue('genre', ['Action', 'Comedy']);
expect(adapter.hasChanges(draft), isTrue);
});
}
class _TestMetadataEditAdapter extends MetadataEditAdapter {
@override
MediaServerClient get mediaClient => throw UnimplementedError();
@override
bool supportsKind(MediaKind kind) => true;
@override
Future<MetadataEditDraft> load(MediaItem item) async => throw UnimplementedError();
@override
List<MetadataEditSection> buildSchema(MetadataEditDraft draft) {
return const [
MetadataEditSection(
id: 'test',
title: 'Test',
fields: [
MetadataEditField(id: 'title', label: 'Title', type: MetadataEditFieldType.text),
MetadataEditField(id: 'genre', label: 'Genre', type: MetadataEditFieldType.stringList),
MetadataEditField(
id: 'artwork:posters',
label: 'Poster',
type: MetadataEditFieldType.artwork,
saveMode: MetadataEditSaveMode.immediate,
),
],
),
];
}
@override
Future<bool> save(MetadataEditDraft draft) async => true;
@override
Future<List<MetadataArtworkOption>> fetchArtwork(MetadataEditDraft draft, MetadataEditField field) async {
throw UnimplementedError();
}
@override
Future<bool> applyArtworkOption(
MetadataEditDraft draft,
MetadataEditField field,
MetadataArtworkOption option,
) async {
throw UnimplementedError();
}
@override
Future<bool> applyArtworkFromUrl(MetadataEditDraft draft, MetadataEditField field, String url) async {
throw UnimplementedError();
}
@override
Future<bool> uploadArtwork(
MetadataEditDraft draft,
MetadataEditField field,
List<int> bytes, {
String? fileName,
}) async {
throw UnimplementedError();
}
}