Focus chrome was implemented twice, once in the focusable wrapper and once in the focus builders; both now go through FocusChrome. TvColorPicker's channel row was a copy of TvNumberSpinner and is now that widget in compact density. Also trims unused helpers and fields and simplifies the Jellyfin browse paths.
108 lines
4.1 KiB
Dart
108 lines
4.1 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:material_symbols_icons/symbols.dart';
|
|
import 'package:plezy/media/media_backend.dart';
|
|
import 'package:plezy/media/media_item.dart';
|
|
import 'package:plezy/media/media_item_types.dart';
|
|
import 'package:plezy/media/media_kind.dart';
|
|
import 'package:plezy/utils/content_utils.dart';
|
|
import '../test_helpers/media_items.dart';
|
|
|
|
MediaItem _episode({int? viewOffsetMs, int? durationMs, int? viewCount, int? leafCount, int? viewedLeafCount}) {
|
|
return testMediaItem(
|
|
id: '1',
|
|
backend: MediaBackend.plex,
|
|
kind: MediaKind.episode,
|
|
viewOffsetMs: viewOffsetMs,
|
|
durationMs: durationMs,
|
|
viewCount: viewCount,
|
|
leafCount: leafCount,
|
|
viewedLeafCount: viewedLeafCount,
|
|
);
|
|
}
|
|
|
|
MediaItem _movie({int? viewCount}) {
|
|
return testMediaItem(id: '1', backend: MediaBackend.plex, kind: MediaKind.movie, viewCount: viewCount);
|
|
}
|
|
|
|
void main() {
|
|
group('formatContentRating', () {
|
|
test('strips 2-letter country prefixes', () {
|
|
expect(formatContentRating('us/PG-13'), 'PG-13');
|
|
expect(formatContentRating('gb/15'), '15');
|
|
});
|
|
|
|
test('strips 3-letter country prefixes', () {
|
|
expect(formatContentRating('deu/16'), '16');
|
|
});
|
|
|
|
test('case-insensitive matching', () {
|
|
expect(formatContentRating('US/PG-13'), 'PG-13');
|
|
expect(formatContentRating('Us/PG'), 'PG');
|
|
});
|
|
|
|
test('returns original when no prefix present', () {
|
|
expect(formatContentRating('PG-13'), 'PG-13');
|
|
expect(formatContentRating('TV-MA'), 'TV-MA');
|
|
});
|
|
|
|
test('returns empty string for null or empty', () {
|
|
expect(formatContentRating(null), '');
|
|
expect(formatContentRating(''), '');
|
|
});
|
|
|
|
test('does not strip single-letter or digit prefixes', () {
|
|
expect(formatContentRating('1/foo'), '1/foo');
|
|
expect(formatContentRating('a/foo'), 'a/foo');
|
|
});
|
|
});
|
|
|
|
group('MediaItemTypes.shouldHideSpoiler', () {
|
|
test('false for non-episodes', () {
|
|
expect(_movie().shouldHideSpoiler, isFalse);
|
|
final show = testMediaItem(id: '1', backend: MediaBackend.plex, kind: MediaKind.show);
|
|
expect(show.shouldHideSpoiler, isFalse);
|
|
});
|
|
|
|
test('false when episode has been watched (viewCount > 0)', () {
|
|
expect(_episode(viewCount: 1).shouldHideSpoiler, isFalse);
|
|
});
|
|
|
|
test('true while in progress until the episode is marked watched', () {
|
|
expect(_episode(viewOffsetMs: 1000, durationMs: 10000).shouldHideSpoiler, isTrue);
|
|
expect(_episode(viewOffsetMs: 4999, durationMs: 10000).shouldHideSpoiler, isTrue);
|
|
expect(_episode(viewOffsetMs: 5000, durationMs: 10000).shouldHideSpoiler, isTrue);
|
|
expect(_episode(viewOffsetMs: 8000, durationMs: 10000).shouldHideSpoiler, isTrue);
|
|
});
|
|
|
|
test('true when no progress at all (unwatched)', () {
|
|
expect(_episode().shouldHideSpoiler, isTrue);
|
|
expect(_episode(viewOffsetMs: 0).shouldHideSpoiler, isTrue);
|
|
});
|
|
|
|
test('true when duration is missing', () {
|
|
expect(_episode(viewOffsetMs: 500).shouldHideSpoiler, isTrue);
|
|
});
|
|
});
|
|
|
|
group('ContentTypeHelper', () {
|
|
test('isMusicContent / isVideoContent are case-insensitive', () {
|
|
expect(ContentTypeHelper.isMusicContent('ARTIST'), isTrue);
|
|
expect(ContentTypeHelper.isMusicContent('track'), isTrue);
|
|
expect(ContentTypeHelper.isMusicContent('movie'), isFalse);
|
|
|
|
expect(ContentTypeHelper.isVideoContent('MOVIE'), isTrue);
|
|
expect(ContentTypeHelper.isVideoContent('episode'), isTrue);
|
|
expect(ContentTypeHelper.isVideoContent('artist'), isFalse);
|
|
});
|
|
|
|
test('getLibraryIcon normalizes type and falls back to folder', () {
|
|
expect(ContentTypeHelper.getLibraryIcon('MOVIE'), Symbols.movie_rounded);
|
|
expect(ContentTypeHelper.getLibraryIcon('show'), Symbols.tv_rounded);
|
|
expect(ContentTypeHelper.getLibraryIcon('artist'), Symbols.music_note_rounded);
|
|
expect(ContentTypeHelper.getLibraryIcon('photo'), Symbols.photo_rounded);
|
|
expect(ContentTypeHelper.getLibraryIcon('mixed'), Symbols.share_rounded);
|
|
expect(ContentTypeHelper.getLibraryIcon('unknown'), Symbols.folder_rounded);
|
|
});
|
|
});
|
|
}
|