Files
plezy/test/widgets/download_tree_view_test.dart
T
2026-05-01 01:20:36 +02:00

126 lines
5.0 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/models/download_models.dart';
import 'package:plezy/widgets/download_tree_view.dart';
DownloadTreeNode _episodeNode(String globalKey) => DownloadTreeNode(
key: globalKey,
title: 'Episode',
type: DownloadNodeType.episode,
status: DownloadStatus.completed,
);
DownloadTreeNode _seasonNode({required String key, required List<DownloadTreeNode> children}) => DownloadTreeNode(
key: key,
title: 'Season',
type: DownloadNodeType.season,
status: DownloadStatus.completed,
children: children,
);
DownloadTreeNode _showNode({required String key, required List<DownloadTreeNode> children}) => DownloadTreeNode(
key: key,
title: 'Show',
type: DownloadNodeType.show,
status: DownloadStatus.completed,
children: children,
);
MediaItem _episodeMeta({
required String id,
required String? serverId,
required String? grandparentId,
required String? parentId,
}) => MediaItem(
id: id,
backend: MediaBackend.plex,
kind: MediaKind.episode,
title: 'Ep $id',
serverId: serverId,
grandparentId: grandparentId,
parentId: parentId,
);
void main() {
group('resolveDownloadContainerGlobalKey', () {
test('show node: builds globalKey from leaf serverId + grandparentId', () {
final ep = _episodeNode('plex1:ep100');
final season = _seasonNode(key: 'show42:season7', children: [ep]);
final show = _showNode(key: 'show42', children: [season]);
final metadata = {'plex1:ep100': _episodeMeta(id: '100', serverId: 'plex1', grandparentId: '42', parentId: '7')};
expect(resolveDownloadContainerGlobalKey(show, metadata), 'plex1:42');
});
test('season node: builds globalKey from leaf serverId + parentId', () {
final ep = _episodeNode('plex1:ep100');
final season = _seasonNode(key: 'show42:season7', children: [ep]);
final metadata = {'plex1:ep100': _episodeMeta(id: '100', serverId: 'plex1', grandparentId: '42', parentId: '7')};
expect(resolveDownloadContainerGlobalKey(season, metadata), 'plex1:7');
});
test('episode and movie nodes return null (not container types)', () {
final ep = _episodeNode('plex1:ep100');
final movie = DownloadTreeNode(
key: 'plex1:movie5',
title: 'M',
type: DownloadNodeType.movie,
status: DownloadStatus.completed,
);
final metadata = {'plex1:ep100': _episodeMeta(id: '100', serverId: 'plex1', grandparentId: '42', parentId: '7')};
expect(resolveDownloadContainerGlobalKey(ep, metadata), isNull);
expect(resolveDownloadContainerGlobalKey(movie, metadata), isNull);
});
test('container with no leaves returns null', () {
final empty = _showNode(key: 'show42', children: []);
expect(resolveDownloadContainerGlobalKey(empty, {}), isNull);
});
test('leaf metadata missing in map returns null', () {
final ep = _episodeNode('plex1:ep100');
final show = _showNode(key: 'show42', children: [ep]);
expect(resolveDownloadContainerGlobalKey(show, const {}), isNull);
});
test('leaf metadata missing serverId returns null', () {
final ep = _episodeNode('plex1:ep100');
final show = _showNode(key: 'show42', children: [ep]);
final metadata = {'plex1:ep100': _episodeMeta(id: '100', serverId: null, grandparentId: '42', parentId: '7')};
expect(resolveDownloadContainerGlobalKey(show, metadata), isNull);
});
test('show node with leaf missing grandparentId returns null', () {
final ep = _episodeNode('plex1:ep100');
final show = _showNode(key: 'show42', children: [ep]);
final metadata = {'plex1:ep100': _episodeMeta(id: '100', serverId: 'plex1', grandparentId: null, parentId: '7')};
expect(resolveDownloadContainerGlobalKey(show, metadata), isNull);
});
test('season node with leaf missing parentId returns null', () {
final ep = _episodeNode('plex1:ep100');
final season = _seasonNode(key: 'show42:season7', children: [ep]);
final metadata = {'plex1:ep100': _episodeMeta(id: '100', serverId: 'plex1', grandparentId: '42', parentId: null)};
expect(resolveDownloadContainerGlobalKey(season, metadata), isNull);
});
test('walks nested season for first leaf when show has multiple seasons', () {
final ep1 = _episodeNode('plex1:ep100');
final ep2 = _episodeNode('plex1:ep200');
final s1 = _seasonNode(key: 'show42:season1', children: [ep1]);
final s2 = _seasonNode(key: 'show42:season2', children: [ep2]);
final show = _showNode(key: 'show42', children: [s1, s2]);
final metadata = {
'plex1:ep100': _episodeMeta(id: '100', serverId: 'plex1', grandparentId: '42', parentId: '1'),
'plex1:ep200': _episodeMeta(id: '200', serverId: 'plex1', grandparentId: '42', parentId: '2'),
};
expect(resolveDownloadContainerGlobalKey(show, metadata), 'plex1:42');
});
});
}