Files
sm-emby-share/test/shared/version_grouping_test.dart
T
2026-07-14 11:11:36 +08:00

142 lines
4.3 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:smplayer/shared/widgets/version_grouping.dart';
import 'package:smplayer/shared/widgets/version_source_card.dart';
void main() {
VersionSourceCardData createEntry({
required String serverName,
required String sourceKey,
String? serverKey,
int? sizeBytes = 1000,
String resolutionLabel = '4K',
bool isCurrent = false,
bool selected = false,
}) {
return VersionSourceCardData(
topLabel: '$resolutionLabel SDR',
serverName: serverName,
serverKey: serverKey ?? sourceKey.split('|').first,
sourceKey: sourceKey,
sizeBytes: sizeBytes,
resolutionLabel: resolutionLabel,
isCurrent: isCurrent,
selected: selected,
);
}
group('groupVersionEntries', () {
test('merges equal size and resolution in source order', () {
final firstEntry = createEntry(
serverName: 'Server A',
sourceKey: 'server-a|source-a',
);
final secondEntry = createEntry(
serverName: 'Server B',
sourceKey: 'server-b|source-b',
);
final groups = groupVersionEntries([firstEntry, secondEntry]);
expect(groups, hasLength(1));
expect(groups.single.representative, same(firstEntry));
expect(groups.single.members, [firstEntry, secondEntry]);
expect(groups.single.serverNames, ['Server A', 'Server B']);
});
test('does not merge sources without a positive file size', () {
final missingSizeEntry = createEntry(
serverName: 'Server A',
sourceKey: 'server-a|source-a',
sizeBytes: null,
);
final zeroSizeEntry = createEntry(
serverName: 'Server B',
sourceKey: 'server-b|source-b',
sizeBytes: 0,
);
final groups = groupVersionEntries([missingSizeEntry, zeroSizeEntry]);
expect(groups, hasLength(2));
expect(groups[0].members, [missingSizeEntry]);
expect(groups[1].members, [zeroSizeEntry]);
});
test('keeps different resolution labels in separate groups', () {
final ultraHdEntry = createEntry(
serverName: 'Server A',
sourceKey: 'server-a|source-a',
);
final fullHdEntry = createEntry(
serverName: 'Server B',
sourceKey: 'server-b|source-b',
resolutionLabel: '1080P',
);
final groups = groupVersionEntries([ultraHdEntry, fullHdEntry]);
expect(groups, hasLength(2));
});
test('does not merge duplicate files from the same server', () {
final firstEntry = createEntry(
serverName: 'Server A',
sourceKey: 'server-a|source-a',
);
final secondEntry = createEntry(
serverName: 'Server A',
sourceKey: 'server-a|source-b',
);
final groups = groupVersionEntries([firstEntry, secondEntry]);
expect(groups, hasLength(2));
});
test(
'uses selected member as visible server without moving representative',
() {
final representative = createEntry(
serverName: 'Server A',
sourceKey: 'server-a|source-a',
);
final selectedMember = createEntry(
serverName: 'Server B',
sourceKey: 'server-b|source-b',
selected: true,
);
final group = groupVersionEntries([
representative,
selectedMember,
]).single;
expect(group.representative, same(representative));
expect(group.activeMember, same(selectedMember));
expect(group.displayData.serverName, 'Server B');
expect(group.displayData.sourceKey, 'server-b|source-b');
expect(group.displayData.selected, isTrue);
expect(group.displayData.mergedServerNames, ['Server A', 'Server B']);
},
);
test('propagates current state from any member to collapsed card', () {
final representative = createEntry(
serverName: 'Server A',
sourceKey: 'server-a|source-a',
);
final currentMember = createEntry(
serverName: 'Server B',
sourceKey: 'server-b|source-b',
isCurrent: true,
);
final group = groupVersionEntries([representative, currentMember]).single;
expect(group.hasCurrentMember, isTrue);
expect(group.displayData.isCurrent, isTrue);
expect(group.displayData.serverName, 'Server B');
});
});
}