126 lines
5.0 KiB
Dart
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');
|
|
});
|
|
});
|
|
}
|