Files
plezy/test/models/plex_user_profile_test.dart
edde746 4eaf4423a1 refactor: share focus chrome and simplify the TV picker and browse paths
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.
2026-07-26 06:09:49 +02:00

75 lines
2.6 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/models/plex/plex_user_profile.dart';
void main() {
group('PlexUserProfile.fromJson', () {
test('parses legacy array shape for language lists', () {
final profile = PlexUserProfile.fromJson({
'defaultAudioLanguages': ['en', 'sv'],
'defaultSubtitleLanguages': ['sv'],
'mediaReviewsLanguages': ['en'],
});
expect(profile.defaultAudioLanguages, ['en', 'sv']);
expect(profile.defaultSubtitleLanguages, ['sv']);
expect(profile.mediaReviewsLanguages, ['en']);
});
test('parses the July 2026 CSV string shape for language lists (#1488)', () {
final profile = PlexUserProfile.fromJson({
'defaultAudioLanguages': 'en,sv',
'defaultSubtitleLanguages': 'en,sv',
'mediaReviewsLanguages': 'en',
});
expect(profile.defaultAudioLanguages, ['en', 'sv']);
expect(profile.defaultSubtitleLanguages, ['en', 'sv']);
expect(profile.mediaReviewsLanguages, ['en']);
});
test('parses absent and null language lists as null', () {
final profile = PlexUserProfile.fromJson({'defaultAudioLanguages': null});
expect(profile.defaultAudioLanguages, isNull);
expect(profile.defaultSubtitleLanguages, isNull);
expect(profile.mediaReviewsLanguages, isNull);
});
test('unwraps the profile envelope and tolerates a non-map envelope', () {
final flat = PlexUserProfile.fromJson({'defaultAudioLanguage': 'en'});
final wrapped = PlexUserProfile.fromJson({
'profile': {'defaultAudioLanguage': 'en'},
});
final garbage = PlexUserProfile.fromJson({'profile': 'garbage'});
expect(flat.defaultAudioLanguage, 'en');
expect(wrapped.defaultAudioLanguage, 'en');
expect(garbage.defaultAudioLanguage, isNull);
});
test('singular language fields take the first entry of array/CSV drift', () {
final csv = PlexUserProfile.fromJson({'defaultAudioLanguage': 'en,sv'});
final array = PlexUserProfile.fromJson({
'defaultSubtitleLanguage': ['sv', 'en'],
});
expect(csv.defaultAudioLanguage, 'en');
expect(array.defaultSubtitleLanguage, 'sv');
});
test('scalar fields coerce from drifted types', () {
final profile = PlexUserProfile.fromJson({
'autoSelectAudio': 0,
'autoSelectSubtitle': '1',
'watchedIndicator': '2',
'defaultSubtitleForced': {},
});
expect(profile.autoSelectAudio, isFalse);
expect(profile.autoSelectSubtitle, 1);
expect(profile.watchedIndicator, 2);
expect(profile.defaultSubtitleForced, 1);
});
});
}