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); }); }); }